SlideShare a Scribd company logo
1 of 29
Download to read offline
Семинар 8
Стандарт MPI (часть 1)
Михаил Курносов
E-mail: mkurnosov@gmail.com
WWW: www.mkurnosov.net
Цикл семинаров «Основы параллельного программирования»
Институт физики полупроводников им. А. В. Ржанова СО РАН
Новосибирск, 2015 CC-BY
Вычислительные системы с распределенной памятью
CPU0
Коммуникационная сеть (Interconnect, Communication network)
Cache
Разделяемая память
(Shared memory)
CPU1
Cache
CPU2
Cache
CPU3
Cache
CPU0
Cache
Разделяемая память
(Shared memory)
CPU1
Cache
CPU2
Cache
CPU3
Cache
 http://www.top500.org
 http://www.green500.org
 http://www.graph500.org
 http://top50.supercomputers.ru
 Вычислительная система с распределенной памятью (distributed memory computer system) –
совокупность вычислительных узлов, взаимодействие между которыми осуществляется через
коммуникационную сеть (InfiniBand, Gigabit Ethernet, Cray Gemeni, Fujitsu Tofu, …)
 Каждый узел имеет множество процессоров/ядер, взаимодействующих через
разделяемую память (shared memory)
 Процессоры могут быть многоядерными, ядра могут поддерживать
одновременную многопоточность (SMT, Hyper-Threading)
Вычислительные системы с распределенной памятью
CPU0
Коммуникационная сеть (Interconnect, Communication network)
Cache
Разделяемая память
(Shared memory)
CPU1
Cache
CPU2
Cache
CPU3
Cache
CPU0
Cache
Разделяемая память
(Shared memory)
CPU1
Cache
CPU2
Cache
CPU3
Cache
 http://www.top500.org
 http://www.green500.org
 http://www.graph500.org
 http://top50.supercomputers.ru
 Вычислительная система с распределенной памятью (distributed memory computer system) –
совокупность вычислительных узлов, взаимодействие между которыми осуществляется через
коммуникационную сеть (InfiniBand, Gigabit Ethernet, Cray Gemeni, Fujitsu Tofu, …)
 Каждый узел имеет множество процессоров/ядер, взаимодействующих через
разделяемую память (shared memory)
 Процессоры могут быть многоядерными, ядра могут поддерживать
одновременную многопоточность (SMT, Hyper-Threading)
ILP ILP ILP ILP ILP ILP ILP ILP
TLP/PLP TLP/PLP
Instruction Level Parallelism (ILP):
суперскалярный конвейер,
внеочередное выполнение команд, ...
SIMD: SSE/AVX, AltivEC, ARM NEON
Thread Level Parallelism (TLP):
POSIX Threads, OpenMP, Cilk, C11/C+
+11 threads, Intel TBB
GPGPU: OpenCL, CUDA, OpenACC
Process Level Parallelism (message passing):
MPI, OpenSHMEM, PGAS (Cray Chapel, IBM X10, UPC)
Вычислительные кластеры (computer cluster)
 Вычислительные кластеры строятся на базе свободно доступных для приобретения компонентов
 Вычислительные узлы: 2/4-процессорные узлы, 1 – 8 GiB оперативной памяти на ядро (поток)
 Коммуникационная сеть (сервисная и для обмена сообщениями)
 Подсистема хранения данных (дисковый массивы, параллельные и сетевые файловые системы)
 Система бесперебойного электропитания
 Система охлаждения
 Программное обеспечение: GNU/Linux (NFS, NIS, DNS, …), MPI (MPICH2, Open MPI), TORQUE/SLURM
Программное обеспечение вычислительных кластеров
Compute node 1
P P P P P P P P
Memory
Compute node 2
P P P P P P P P
Memory
Compute node 3
P P P P P P P P
Memory
Compute node 4
P P P P P P P P
Memory
Compute node N
P P P P P P P P
Memory
…
Frontend
P P P P P P P P
Memory
Service network (NIS, NFS, SSH, …)
Compute network (MPI)
Internet
 Frontend – узел для компиляции программ и постановки задач
в очередь
 Средства разработки: MPI (MPICH, MVAPICH, Open MPI, Intel MPI),
OpenMP (GCC, Intel, Oracle), GPGPU (CUDA, OpenCL, OpenACC)
 Система управления ресурсами (поддерживает очередь задач
и контролирует доступ к ресурсам): TORQUE, SLURM, Altair PBS Pro,
IBM Load Leveler, Sun GridEngine, …
 Сетевая (параллельная) файловая система
(доступ к /home со всех узлов): NFS, Lustre, PVFS, ...
 Система мониторинга: Ganglia, …
 Сетевые сервисы: DHCP, DNS, NIS/LDAP, backup
Рейтинги мощнейших ВС
 www.top500.org – решение системы линейных алгебраических уравнений
методом LU-факторизации (High-Performance Linpack, FLOPS – Floating-point
Operations Per Seconds)
 www.graph500.org – алгоритмы на графах (построение графа, обход в ширину,
TEPS – Traversed Edges Per Second)
 www.green500.org – главный критерий – энергоэффективность
(объем потребляемой эленктроэнергии, kW)
 http://top50.supercomputers.ru – рейтинг мощнейших вычислительных систем СНГ
(тест High-Performance Linpack)

Как создать свой тест производительности?
www.top500.org (Ноябрь 2014)
 Среднее количество вычислительных ядер в системе: 46 288
 Среднее количество ядер на сокет (процессор): 9 (4, 6, 8, 10, 12, 14, 16)
 Среднее энергопотребление: 836 kW
 Коммуникационная сеть: Infiniband (44%), Gigabit Ethernet (25%), 10 Gigabit Ethernet (15%),
Custom (10%), Cray (3%)
 Процессоры: Intel (> 80%), IBM Power, AMD Opteron, SPARC64, ShenWei, NEC
 Ускорители (14% систем): Intel Xeon Phi, NVIDIA GPU, ATI/AMD GPU, PESY-SC
 Операционная система: GNU/Linux (96%), IBM AIX (11 шт.), Microsoft (1 шт.)
Стандарт MPI
 Message Passing Interface (MPI) – это стандарт на программный интерфейс
коммуникационных библиотек для создания параллельных программ
в модели передачи сообщений (message passing)
 Стандарт определяет интерфейс для языков программирования C и Fortran
 Стандарт де-факто для систем с распределенной памятью (“ассемблер” в области
параллельных вычислений на системах с распределенной памятью)
 Обеспечивает переносимость программ на уровне исходного кода между разными ВС
(Cray, IBM, NEC, Fujitsu, ...)
http://www.mpi-forum.org
1994
MPI 1.0
1995
MPI 1.1
1997
MPI 1.2, 2.0
2008
MPI 1.3, 2.1
2009
MPI 2.2 MPI 3.0
2012
http://www.mpi-forum.org/docs/mpi-3.0/mpi30-report.pdf
Стандарт MPI
http://www.mpi-forum.org/docs/mpi-3.0/mpi30-report.pdf
Реализации MPI
 MPICH (Open source, Argone NL, http://www.mcs.anl.gov/research/projects/mpich2)
 Производные от MPICH2:
MVAPICH2 (MPICH2 for InfiniBand), IBM MPI, Cray MPI, Intel MPI, HP MPI, Microsoft MPI
 Open MPI (Open source, BSD License, http://www.open-mpi.org)
 Производные от Open MPI: Oracle MPI
 Высокоуровневые интерфейсы
 С++: Boost.MPI
 Java: Open MPI Java Interface, MPI Java, MPJ Express, ParJava
 C#: MPI.NET, MS-MPI
 Python: mpi4py, pyMPI
 MPICH (Open source, Argone NL, http://www.mcs.anl.gov/research/projects/mpich2)
 Производные от MPICH2:
MVAPICH2 (MPICH2 for InfiniBand), IBM MPI, Cray MPI, Intel MPI, HP MPI, Microsoft MPI
 Open MPI (Open source, BSD License, http://www.open-mpi.org)
 Производные от Open MPI: Oracle MPI
 Высокоуровневые интерфейсы
 С++: Boost.MPI
 Java: Open MPI Java Interface, MPI Java, MPJ Express, ParJava
 C#: MPI.NET, MS-MPI
 Python: mpi4py, pyMPI
Отличия реализаций MPI
 Спектр поддерживаемых архитектур процессоров:
Intel, IBM, ARM, Fujitsu, NVIDIA, AMD
 Типы поддерживаемых коммуникационных технологий/сетей:
InfiniBand, 10 Gigabit Ethernet, Cray Gemeni, IBM PERCS/5D torus, Fujitsu Tofu, Myrinet, SCI, …
 Протоколы дифференцированных обменов двусторонних обменов (Point-to-point):
хранение списка процессов, подтверждение передачи (ACK), буферизация сообщений, …
 Коллективные операции обменов информацией: коммуникационная сложность
алгоритмов, учет структуры вычислительной системы (torus, fat tree, …),
неблокирующие коллективные обмены (MPI 3.0, методы хранение collective schedule)
 Алгоритмы вложения графов программ в структуры вычислительных систем
(MPI topology mapping)
 Возможность выполнения MPI-функций в многопоточной среде и поддержка
ускорителей (GPU NVIDIA/AMD, Intel Xeon Phi)
Модель программирования
 Программа состоит из N параллельных процессов,
которые порождаются при запуске программы (MPI 1)
или могут быть динамически созданы во время выполнения
(MPI 2)
 Каждый процесс имеет уникальный идентификатор [0, N – 1]
и изолированное адресное пространство (SPMD)
 Процессы взаимодействуют путем передачи сообщений
(message passing)
 Процессы могут образовывать группы для реализации
коллективных операций обмена информацией
P0
M
P1
M
P2
M
Process/thread/task
Memory (address space)
Message passing
Memory access
Понятие коммуникатора (communicator)
 Коммуникатор (communicator) – группа процессов, образующая логическую область
для выполнения коллективных операций между процессами
 В рамках коммуникатора процессы имеют номера: 0, 1, …, N – 1
 Все MPI-сообщения должны быть связаны с определенным коммуникатором
Процесс0
Коммуникатор MPI_COMM_WORLD включает все процессы
Процесс1
Процесс4
Процесс5
Процесс3
Процесс2
Программный интерфейс MPI
 Заголовочный файл mpi.h
#include <mpi.h>
 Функции, типы данных и именованные константы имеют префикс «MPI_»
MPI_Init, MPI_Init_thread, MPI_Send
 Функции возвращают MPI_SUCCESS или код ошибки
 Результаты возвращаются через аргументы функций
int MPI_Send(const void *buf,
int count,
MPI_Datatype datatype,
int dest,
int tag,
MPI_Comm comm);
Hello, MPI World!
#include <stdio.h>
#include <mpi.h>
int main(int argc, char *argv[])
{
int commsize, rank, len;
char procname[MPI_MAX_PROCESSOR_NAME];
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &commsize);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Get_processor_name(procname, &len);
printf("Hello, MPI World! Process %d of %d on node %s.n",
rank, commsize, procname);
MPI_Finalize();
return 0;
}
Компиляция MPI-программ
# Программа на C
$ mpicc –Wall –o hello ./hello.c
# Программа на C++
$ mpicxx –Wall –o hello ./hello.cpp
# Программа на Fortran
$ mpif90 –o hello ./hello.f90
Запуск MPI-программы на кластере (система SLURM)
# Формируем паспорт задачи (job-файл)
$ cat task.job
#!/bin/bash
#SBATCH --nodes=2 --ntasks-per-node=8
#SBATCH --job-name=MyTask
mpiexec ./hello
# Ставим задачу в очередь
$ sbatch ./task.job
Submitted batch job 4285
Ресурсный запрос
nodes=2 — два узла кластера
ntasks-per-node=8 — 8 процессов на узле
man sbatch
Запуск MPI-программы на кластере (система SLURM)
# Проверяем состояние задачи в очереди
$ squeue
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
4285 debug MyTask mkurnoso R 0:01 2 cn[3-4]
# Проверяем результат
$ cat ./slurm-4285.out
Hello, MPI World! Process 12 of 16 on node cn4.
Hello, MPI World! Process 13 of 16 on node cn4.
Hello, MPI World! Process 14 of 16 on node cn4.
Hello, MPI World! Process 15 of 16 on node cn4.
Hello, MPI World! Process 8 of 16 on node cn4.
Hello, MPI World! Process 9 of 16 on node cn4.
Hello, MPI World! Process 10 of 16 on node cn4.
Hello, MPI World! Process 11 of 16 on node cn4.
Hello, MPI World! Process 4 of 16 on node cn3.
Hello, MPI World! Process 5 of 16 on node cn3.
Hello, MPI World! Process 6 of 16 on node cn3.
Hello, MPI World! Process 0 of 16 on node cn3.
Hello, MPI World! Process 1 of 16 on node cn3.
Hello, MPI World! Process 2 of 16 on node cn3.
Hello, MPI World! Process 3 of 16 on node cn3.
Hello, MPI World! Process 7 of 16 on node cn3.
Подсчет количества простых чисел (serial verion)
Подсчитывает количество
простых числе в интервале [a, b]
Определят, является ли
число n простым
O(sqrt(n))
const int a = 1;
const int b = 10000000;
int is_prime_number(int n)
{
int limit = sqrt(n) + 1;
for (int i = 2; i <= limit; i++) {
if (n % i == 0)
return 0;
}
return (n > 1) ? 1 : 0;
}
int count_prime_numbers(int a, int b)
{
int nprimes = 0;
if (a <= 2) {
nprimes = 1; /* Count '2' as a prime number */
a = 2;
}
if (a % 2 == 0) /* Shift 'a' to odd number */
a++;
/* Loop over odd numbers: a, a + 2, a + 4, ... , b */
for (int i = a; i <= b; i += 2) {
if (is_prime_number(i))
nprimes++;
}
return nprimes;
}
Подсчет количества простых чисел (MPI version)
Распределим итерации цикла
между процессами MPI-программы
const int a = 1;
const int b = 10000000;
int is_prime_number(int n)
{
int limit = sqrt(n) + 1;
for (int i = 2; i <= limit; i++) {
if (n % i == 0)
return 0;
}
return (n > 1) ? 1 : 0;
}
int count_prime_numbers(int a, int b)
{
int nprimes = 0;
if (a <= 2) {
nprimes = 1; /* Count '2' as a prime number */
a = 2;
}
if (a % 2 == 0) /* Shift 'a' to odd number */
a++;
/* Loop over odd numbers: a, a + 2, a + 4, ... , b */
for (int i = a; i <= b; i += 2) {
if (is_prime_number(i))
nprimes++;
}
return nprimes;
}
Подсчет количества простых чисел (MPI version)
int main(int argc, char **argv)
{
MPI_Init(&argc, &argv);
// Start serial version in process 0
double tserial = 0;
if (get_comm_rank() == 0)
tserial = run_serial();
// Start parallel version
double tparallel = run_parallel();
if (get_comm_rank() == 0) {
printf("Count prime numbers on [%d, %d]n", a, b);
printf("Execution time (serial): %.6fn", tserial);
printf("Execution time (parallel): %.6fn", tparallel);
printf("Speedup (processes %d): %.2fn", get_comm_size(), tserial / tparallel);
}
MPI_Finalize();
return 0;
}
Подсчет количества простых чисел (MPI version)
double run_serial()
{
double t = MPI_Wtime();
int n = count_prime_numbers(a, b);
t = MPI_Wtime() - t;
printf("Result (serial): %dn", n);
return t;
}
double run_parallel()
{
double t = MPI_Wtime();
int n = count_prime_numbers_par(a, b);
t = MPI_Wtime() - t;
printf("Process %d/%d execution time: %.6fn", get_comm_rank(), get_comm_size(), t);
if (get_comm_rank() == 0)
printf("Result (parallel): %dn", n);
return t;
}
Подсчет количества простых чисел (MPI version)
void get_chunk(int a, int b, int commsize, int rank, int *lb, int *ub)
{
/*
* This algorithm is based on OpenMP 4.0 spec (Sec. 2.7.1, default schedule for loops)
* For a team of commsize processes and a sequence of n items, let ceil(n ? commsize) be the integer q
* that satisfies n = commsize * q - r, with 0 <= r < commsize.
* Assign q iterations to the first commsize - r processes, and q - 1 iterations to the remaining r processes.
*/
int n = b - a + 1;
int q = n / commsize;
if (n % commsize)
q++;
int r = commsize * q - n;
int chunk = q; /* Compute chunk size for the process */
if (rank >= commsize - r)
chunk = q - 1;
*lb = a; /* Determine start item for the process */
if (rank > 0) {
if (rank <= commsize — r) /* Count sum of previous chunks */
*lb += q * rank;
else
*lb += q * (commsize - r) + (q - 1) * (rank - (commsize - r));
}
*ub = *lb + chunk - 1;
}
Подсчет количества простых чисел (MPI version)
Count prime numbers on [1, 10000000]
Process 0/8 execution time: 0.466901
Process 1/8 execution time: 0.780994
Process 2/8 execution time: 1.126007
Process 3/8 execution time: 1.125990
Process 4/8 execution time: 1.556572
Process 5/8 execution time: 1.358095
Process 6/8 execution time: 1.556561
Process 7/8 execution time: 1.556546
Execution time (serial): 8.970650
Execution time (parallel): 0.466901
Result (parallel): 664579
Result (serial): 664579
Speedup (processes 8): 19.21
Проблема 1
Неравномерная загрузка процессов
(load imbalance)
Проблема 2
Ускорение в 19 раз?
Подсчет количества простых чисел (MPI version)
int count_prime_numbers_par(int a, int b)
{
int nprimes = 0;
int lb, ub;
get_chunk(a, b, get_comm_size(), get_comm_rank(), &lb, &ub);
/* Count '2' as a prime number */
if (lb <= 2) {
nprimes = 1;
lb = 2;
}
/* Shift 'a' to odd number */
if (lb % 2 == 0)
lb++;
/* Loop over odd numbers: a, a + 2, a + 4, ... , b */
for (int i = lb; i <= ub; i += 2) {
if (is_prime_number(i))
nprimes++;
}
int nprimes_global;
MPI_Reduce(&nprimes, &nprimes_global, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD);
return nprimes_global;
}
Проблема 1
Неравномерная загрузка процессов
Process 0: 0, 1, 2, 3
Process 1: 4, 5, 6, 7
Process 3: 8, 9, 10, 11
...
Tis_prime_number
= O(sqrt(i))
Подсчет количества простых чисел (MPI version)
int main(int argc, char **argv)
{
MPI_Init(&argc, &argv);
// Start serial version in process 0
double tserial = 0;
if (get_comm_rank() == 0)
tserial = run_serial();
// Start parallel version
double tparallel = run_parallel();
if (get_comm_rank() == 0) {
printf("Count prime numbers on [%d, %d]n", a, b);
printf("Execution time (serial): %.6fn", tserial);
printf("Execution time (parallel): %.6fn", tparallel);
printf("Speedup (processes %d): %.2fn", get_comm_size(), tserial / tparallel);
}
MPI_Finalize();
return 0;
}
Проблема 2
Неправильное вычисление
коэффициента ускорения
Speedup = tserial / tparallel
tparallel — время процесса 0
За tparallel надо брать
наибольшее время выполнения процессов
double run_parallel()
{
double t = MPI_Wtime();
int n = count_prime_numbers_par(a, b);
t = MPI_Wtime() - t;
printf("Process %d/%d execution time: %.6fn",
get_comm_rank(), get_comm_size(), t);
if (get_comm_rank() == 0)
printf("Result (parallel): %dn", n);
// Собираем в процессе 0 максимальное из времен выполнения
double tmax;
MPI_Reduce(&t, &tmax, 1, MPI_DOUBLE, MPI_MAX, 0, MPI_COMM_WORLD);
return tmax;
}
Подсчет количества простых чисел (MPI version)
Решение проблемы 2
Подсчет количества простых чисел (MPI version)
int count_prime_numbers_par(int a, int b)
{
int nprimes = 0;
/* Count '2' as a prime number */
int commsize = get_comm_size();
int rank = get_comm_rank();
if (a <= 2) {
a = 2;
if (rank == 0)
nprimes = 1;
}
for (int i = a + rank; i <= b; i += commsize) {
if (i % 2 > 0 && is_prime_number(i))
nprimes++;
}
int nprimes_global = 0;
MPI_Reduce(&nprimes, &nprimes_global, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD);
return nprimes_global;
}
Решение проблемы 1
Циклическое распределение итераций
(round-robin)
Задание
 Разработать на MPI параллельную версию программы подсчета количества простых
числе в заданном интервале — написать код функции count_prime_numbers_par()
 Провести анализ масштабируемости параллельной программы
 Шаблон программы находится в каталоге _task

More Related Content

What's hot

Семинар 10. Параллельное программирование на MPI (часть 3)
Семинар 10. Параллельное программирование на MPI (часть 3)Семинар 10. Параллельное программирование на MPI (часть 3)
Семинар 10. Параллельное программирование на MPI (часть 3)Mikhail Kurnosov
 
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, paral...Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, paral...Mikhail Kurnosov
 
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)Mikhail Kurnosov
 
Лекция 7. Язык параллельного программирования Intel Cilk Plus
Лекция 7. Язык параллельного программирования Intel Cilk PlusЛекция 7. Язык параллельного программирования Intel Cilk Plus
Лекция 7. Язык параллельного программирования Intel Cilk PlusMikhail Kurnosov
 
Использование Time-Stamp Counter для измерения времени выполнения кода на пр...
Использование Time-Stamp Counter для измерения времени выполнения кода  на пр...Использование Time-Stamp Counter для измерения времени выполнения кода  на пр...
Использование Time-Stamp Counter для измерения времени выполнения кода на пр...Mikhail Kurnosov
 
Семинар 5. Многопоточное программирование на OpenMP (часть 5)
Семинар 5. Многопоточное программирование на OpenMP (часть 5)Семинар 5. Многопоточное программирование на OpenMP (часть 5)
Семинар 5. Многопоточное программирование на OpenMP (часть 5)Mikhail Kurnosov
 
Семинар 6. Многопоточное программирование на OpenMP (часть 6)
Семинар 6. Многопоточное программирование на OpenMP (часть 6)Семинар 6. Многопоточное программирование на OpenMP (часть 6)
Семинар 6. Многопоточное программирование на OpenMP (часть 6)Mikhail Kurnosov
 
Лекция 1. Основные понятия стандарта MPI. Дифференцированные обмены
Лекция 1. Основные понятия стандарта MPI. Дифференцированные обменыЛекция 1. Основные понятия стандарта MPI. Дифференцированные обмены
Лекция 1. Основные понятия стандарта MPI. Дифференцированные обменыAlexey Paznikov
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPMikhail Kurnosov
 
Лекция 9. Программирование GPU
Лекция 9. Программирование GPUЛекция 9. Программирование GPU
Лекция 9. Программирование GPUMikhail Kurnosov
 
Лекция 3: Векторизация кода (Code vectorization, SIMD, SSE, AVX)
Лекция 3: Векторизация кода (Code vectorization, SIMD, SSE, AVX)Лекция 3: Векторизация кода (Code vectorization, SIMD, SSE, AVX)
Лекция 3: Векторизация кода (Code vectorization, SIMD, SSE, AVX)Mikhail Kurnosov
 
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)Mikhail Kurnosov
 
Лекция 3. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 3. Векторизация кода (Code vectorization: SSE, AVX)Лекция 3. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 3. Векторизация кода (Code vectorization: SSE, AVX)Mikhail Kurnosov
 
Семинар 2. Многопоточное программирование на OpenMP (часть 2)
Семинар 2. Многопоточное программирование на OpenMP (часть 2)Семинар 2. Многопоточное программирование на OpenMP (часть 2)
Семинар 2. Многопоточное программирование на OpenMP (часть 2)Mikhail Kurnosov
 
Лекция 8. Intel Threading Building Blocks
Лекция 8. Intel Threading Building BlocksЛекция 8. Intel Threading Building Blocks
Лекция 8. Intel Threading Building BlocksMikhail Kurnosov
 
Семинар 4. Многопоточное программирование на OpenMP (часть 4)
Семинар 4. Многопоточное программирование на OpenMP (часть 4)Семинар 4. Многопоточное программирование на OpenMP (часть 4)
Семинар 4. Многопоточное программирование на OpenMP (часть 4)Mikhail Kurnosov
 
Лекция 4. Производные типы данных в стандарте MPI
Лекция 4. Производные типы данных в стандарте MPIЛекция 4. Производные типы данных в стандарте MPI
Лекция 4. Производные типы данных в стандарте MPIAlexey Paznikov
 
ПВТ - осень 2014 - лекция 1 - Введение в параллельные вычисления
ПВТ - осень 2014 - лекция 1 - Введение в параллельные вычисленияПВТ - осень 2014 - лекция 1 - Введение в параллельные вычисления
ПВТ - осень 2014 - лекция 1 - Введение в параллельные вычисленияAlexey Paznikov
 
Язык параллельного программирования Intel Cilk Plus
Язык параллельного программирования Intel Cilk PlusЯзык параллельного программирования Intel Cilk Plus
Язык параллельного программирования Intel Cilk PlusMikhail Kurnosov
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPMikhail Kurnosov
 

What's hot (20)

Семинар 10. Параллельное программирование на MPI (часть 3)
Семинар 10. Параллельное программирование на MPI (часть 3)Семинар 10. Параллельное программирование на MPI (часть 3)
Семинар 10. Параллельное программирование на MPI (часть 3)
 
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, paral...Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, paral...
 
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
 
Лекция 7. Язык параллельного программирования Intel Cilk Plus
Лекция 7. Язык параллельного программирования Intel Cilk PlusЛекция 7. Язык параллельного программирования Intel Cilk Plus
Лекция 7. Язык параллельного программирования Intel Cilk Plus
 
Использование Time-Stamp Counter для измерения времени выполнения кода на пр...
Использование Time-Stamp Counter для измерения времени выполнения кода  на пр...Использование Time-Stamp Counter для измерения времени выполнения кода  на пр...
Использование Time-Stamp Counter для измерения времени выполнения кода на пр...
 
Семинар 5. Многопоточное программирование на OpenMP (часть 5)
Семинар 5. Многопоточное программирование на OpenMP (часть 5)Семинар 5. Многопоточное программирование на OpenMP (часть 5)
Семинар 5. Многопоточное программирование на OpenMP (часть 5)
 
Семинар 6. Многопоточное программирование на OpenMP (часть 6)
Семинар 6. Многопоточное программирование на OpenMP (часть 6)Семинар 6. Многопоточное программирование на OpenMP (часть 6)
Семинар 6. Многопоточное программирование на OpenMP (часть 6)
 
Лекция 1. Основные понятия стандарта MPI. Дифференцированные обмены
Лекция 1. Основные понятия стандарта MPI. Дифференцированные обменыЛекция 1. Основные понятия стандарта MPI. Дифференцированные обмены
Лекция 1. Основные понятия стандарта MPI. Дифференцированные обмены
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMP
 
Лекция 9. Программирование GPU
Лекция 9. Программирование GPUЛекция 9. Программирование GPU
Лекция 9. Программирование GPU
 
Лекция 3: Векторизация кода (Code vectorization, SIMD, SSE, AVX)
Лекция 3: Векторизация кода (Code vectorization, SIMD, SSE, AVX)Лекция 3: Векторизация кода (Code vectorization, SIMD, SSE, AVX)
Лекция 3: Векторизация кода (Code vectorization, SIMD, SSE, AVX)
 
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
 
Лекция 3. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 3. Векторизация кода (Code vectorization: SSE, AVX)Лекция 3. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 3. Векторизация кода (Code vectorization: SSE, AVX)
 
Семинар 2. Многопоточное программирование на OpenMP (часть 2)
Семинар 2. Многопоточное программирование на OpenMP (часть 2)Семинар 2. Многопоточное программирование на OpenMP (часть 2)
Семинар 2. Многопоточное программирование на OpenMP (часть 2)
 
Лекция 8. Intel Threading Building Blocks
Лекция 8. Intel Threading Building BlocksЛекция 8. Intel Threading Building Blocks
Лекция 8. Intel Threading Building Blocks
 
Семинар 4. Многопоточное программирование на OpenMP (часть 4)
Семинар 4. Многопоточное программирование на OpenMP (часть 4)Семинар 4. Многопоточное программирование на OpenMP (часть 4)
Семинар 4. Многопоточное программирование на OpenMP (часть 4)
 
Лекция 4. Производные типы данных в стандарте MPI
Лекция 4. Производные типы данных в стандарте MPIЛекция 4. Производные типы данных в стандарте MPI
Лекция 4. Производные типы данных в стандарте MPI
 
ПВТ - осень 2014 - лекция 1 - Введение в параллельные вычисления
ПВТ - осень 2014 - лекция 1 - Введение в параллельные вычисленияПВТ - осень 2014 - лекция 1 - Введение в параллельные вычисления
ПВТ - осень 2014 - лекция 1 - Введение в параллельные вычисления
 
Язык параллельного программирования Intel Cilk Plus
Язык параллельного программирования Intel Cilk PlusЯзык параллельного программирования Intel Cilk Plus
Язык параллельного программирования Intel Cilk Plus
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMP
 

Viewers also liked

Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...Mikhail Kurnosov
 
Лекция 12 (часть 1): Языки программирования семейства PGAS: Cray Chapel
Лекция 12 (часть 1): Языки программирования семейства PGAS: Cray ChapelЛекция 12 (часть 1): Языки программирования семейства PGAS: Cray Chapel
Лекция 12 (часть 1): Языки программирования семейства PGAS: Cray ChapelMikhail Kurnosov
 
Лекция 12 (часть 2): Языки программирования семейства PGAS: IBM X10
Лекция 12 (часть 2): Языки программирования семейства PGAS: IBM X10Лекция 12 (часть 2): Языки программирования семейства PGAS: IBM X10
Лекция 12 (часть 2): Языки программирования семейства PGAS: IBM X10Mikhail Kurnosov
 
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)Mikhail Kurnosov
 
Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)Mikhail Kurnosov
 
Векторизация кода (семинар 3)
Векторизация кода (семинар 3)Векторизация кода (семинар 3)
Векторизация кода (семинар 3)Mikhail Kurnosov
 
Векторизация кода (семинар 2)
Векторизация кода (семинар 2)Векторизация кода (семинар 2)
Векторизация кода (семинар 2)Mikhail Kurnosov
 

Viewers also liked (7)

Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
 
Лекция 12 (часть 1): Языки программирования семейства PGAS: Cray Chapel
Лекция 12 (часть 1): Языки программирования семейства PGAS: Cray ChapelЛекция 12 (часть 1): Языки программирования семейства PGAS: Cray Chapel
Лекция 12 (часть 1): Языки программирования семейства PGAS: Cray Chapel
 
Лекция 12 (часть 2): Языки программирования семейства PGAS: IBM X10
Лекция 12 (часть 2): Языки программирования семейства PGAS: IBM X10Лекция 12 (часть 2): Языки программирования семейства PGAS: IBM X10
Лекция 12 (часть 2): Языки программирования семейства PGAS: IBM X10
 
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
 
Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)
 
Векторизация кода (семинар 3)
Векторизация кода (семинар 3)Векторизация кода (семинар 3)
Векторизация кода (семинар 3)
 
Векторизация кода (семинар 2)
Векторизация кода (семинар 2)Векторизация кода (семинар 2)
Векторизация кода (семинар 2)
 

Similar to Семинар 8. Параллельное программирование на MPI (часть 1)

Стандарт MPI (Message Passing Interface)
Стандарт MPI (Message Passing Interface)Стандарт MPI (Message Passing Interface)
Стандарт MPI (Message Passing Interface)Mikhail Kurnosov
 
кластеры и суперкомпьютеры
кластеры и суперкомпьютерыкластеры и суперкомпьютеры
кластеры и суперкомпьютерыnastena07051995
 
20090721 hpc exercise2
20090721 hpc exercise220090721 hpc exercise2
20090721 hpc exercise2Michael Karpov
 
инструменты параллельного программирования
инструменты параллельного программированияинструменты параллельного программирования
инструменты параллельного программированияAlexander Petrov
 
TMPA-2013 Sartakov: Genode
TMPA-2013 Sartakov: GenodeTMPA-2013 Sartakov: Genode
TMPA-2013 Sartakov: GenodeIosif Itkin
 
Технические средства реализации информационных процессов
Технические средства реализации информационных процессовТехнические средства реализации информационных процессов
Технические средства реализации информационных процессовstudent_SSGA
 
MPIPerf: пакет оценки эффективности коммуникационных функций стандарта MPI
MPIPerf: пакет оценки эффективности коммуникационных функций стандарта MPIMPIPerf: пакет оценки эффективности коммуникационных функций стандарта MPI
MPIPerf: пакет оценки эффективности коммуникационных функций стандарта MPIMikhail Kurnosov
 
Язык параллельного программирования Cray Chapel
Язык параллельного программирования Cray ChapelЯзык параллельного программирования Cray Chapel
Язык параллельного программирования Cray ChapelMikhail Kurnosov
 
Hpc 2.26.03.2013.
Hpc 2.26.03.2013.Hpc 2.26.03.2013.
Hpc 2.26.03.2013.Boris Kizko
 
Технико-коммерческое предложение "База знаний"
Технико-коммерческое предложение "База знаний"Технико-коммерческое предложение "База знаний"
Технико-коммерческое предложение "База знаний"RKVector
 
Эволюция идеологии удалённого управления вычислительными системами на примере...
Эволюция идеологии удалённого управления вычислительными системами на примере...Эволюция идеологии удалённого управления вычислительными системами на примере...
Эволюция идеологии удалённого управления вычислительными системами на примере...CEE-SEC(R)
 
Bgp методякоби
Bgp методякобиBgp методякоби
Bgp методякобиMichael Karpov
 
СУПЕРКОМПЬЮТЕРНЫЕ ТЕХНОЛОГИИ
СУПЕРКОМПЬЮТЕРНЫЕ ТЕХНОЛОГИИСУПЕРКОМПЬЮТЕРНЫЕ ТЕХНОЛОГИИ
СУПЕРКОМПЬЮТЕРНЫЕ ТЕХНОЛОГИИMKoryakina
 
СУПЕРКОПЬЮТЕРНЫЕ ТЕХНОЛОГИИ
СУПЕРКОПЬЮТЕРНЫЕ ТЕХНОЛОГИИСУПЕРКОПЬЮТЕРНЫЕ ТЕХНОЛОГИИ
СУПЕРКОПЬЮТЕРНЫЕ ТЕХНОЛОГИИMKoryakina
 
Занятие № 7. Общая характеристика и понятия Windows. Файловые системы ОС семе...
Занятие № 7. Общая характеристика и понятия Windows. Файловые системы ОС семе...Занятие № 7. Общая характеристика и понятия Windows. Файловые системы ОС семе...
Занятие № 7. Общая характеристика и понятия Windows. Файловые системы ОС семе...Aibek9
 
Введение в сетевые технологии
Введение в сетевые технологииВведение в сетевые технологии
Введение в сетевые технологииUnguryan Vitaliy
 
Операционные системы
Операционные системыОперационные системы
Операционные системыyaevents
 
TMPA-2013 Smirnov
TMPA-2013 SmirnovTMPA-2013 Smirnov
TMPA-2013 SmirnovIosif Itkin
 

Similar to Семинар 8. Параллельное программирование на MPI (часть 1) (20)

Стандарт MPI (Message Passing Interface)
Стандарт MPI (Message Passing Interface)Стандарт MPI (Message Passing Interface)
Стандарт MPI (Message Passing Interface)
 
Cuda, OpenCL
Cuda, OpenCLCuda, OpenCL
Cuda, OpenCL
 
кластеры и суперкомпьютеры
кластеры и суперкомпьютерыкластеры и суперкомпьютеры
кластеры и суперкомпьютеры
 
20090721 hpc exercise2
20090721 hpc exercise220090721 hpc exercise2
20090721 hpc exercise2
 
инструменты параллельного программирования
инструменты параллельного программированияинструменты параллельного программирования
инструменты параллельного программирования
 
TMPA-2013 Sartakov: Genode
TMPA-2013 Sartakov: GenodeTMPA-2013 Sartakov: Genode
TMPA-2013 Sartakov: Genode
 
Технические средства реализации информационных процессов
Технические средства реализации информационных процессовТехнические средства реализации информационных процессов
Технические средства реализации информационных процессов
 
MPIPerf: пакет оценки эффективности коммуникационных функций стандарта MPI
MPIPerf: пакет оценки эффективности коммуникационных функций стандарта MPIMPIPerf: пакет оценки эффективности коммуникационных функций стандарта MPI
MPIPerf: пакет оценки эффективности коммуникационных функций стандарта MPI
 
Язык параллельного программирования Cray Chapel
Язык параллельного программирования Cray ChapelЯзык параллельного программирования Cray Chapel
Язык параллельного программирования Cray Chapel
 
Hpc 2.26.03.2013.
Hpc 2.26.03.2013.Hpc 2.26.03.2013.
Hpc 2.26.03.2013.
 
Технико-коммерческое предложение "База знаний"
Технико-коммерческое предложение "База знаний"Технико-коммерческое предложение "База знаний"
Технико-коммерческое предложение "База знаний"
 
Эволюция идеологии удалённого управления вычислительными системами на примере...
Эволюция идеологии удалённого управления вычислительными системами на примере...Эволюция идеологии удалённого управления вычислительными системами на примере...
Эволюция идеологии удалённого управления вычислительными системами на примере...
 
Bgp методякоби
Bgp методякобиBgp методякоби
Bgp методякоби
 
СУПЕРКОМПЬЮТЕРНЫЕ ТЕХНОЛОГИИ
СУПЕРКОМПЬЮТЕРНЫЕ ТЕХНОЛОГИИСУПЕРКОМПЬЮТЕРНЫЕ ТЕХНОЛОГИИ
СУПЕРКОМПЬЮТЕРНЫЕ ТЕХНОЛОГИИ
 
СУПЕРКОПЬЮТЕРНЫЕ ТЕХНОЛОГИИ
СУПЕРКОПЬЮТЕРНЫЕ ТЕХНОЛОГИИСУПЕРКОПЬЮТЕРНЫЕ ТЕХНОЛОГИИ
СУПЕРКОПЬЮТЕРНЫЕ ТЕХНОЛОГИИ
 
Занятие № 7. Общая характеристика и понятия Windows. Файловые системы ОС семе...
Занятие № 7. Общая характеристика и понятия Windows. Файловые системы ОС семе...Занятие № 7. Общая характеристика и понятия Windows. Файловые системы ОС семе...
Занятие № 7. Общая характеристика и понятия Windows. Файловые системы ОС семе...
 
Введение в сетевые технологии
Введение в сетевые технологииВведение в сетевые технологии
Введение в сетевые технологии
 
Операционные системы
Операционные системыОперационные системы
Операционные системы
 
TMPA-2013 Smirnov
TMPA-2013 SmirnovTMPA-2013 Smirnov
TMPA-2013 Smirnov
 
CUDA-Aware MPI notes
CUDA-Aware MPI notesCUDA-Aware MPI notes
CUDA-Aware MPI notes
 

More from Mikhail Kurnosov

Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Mikhail Kurnosov
 
Лекция 5. B-деревья (B-trees, k-way merge sort)
Лекция 5. B-деревья (B-trees, k-way merge sort)Лекция 5. B-деревья (B-trees, k-way merge sort)
Лекция 5. B-деревья (B-trees, k-way merge sort)Mikhail Kurnosov
 
Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)Mikhail Kurnosov
 
Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)Mikhail Kurnosov
 
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...Mikhail Kurnosov
 
Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 1. Амортизационный анализ (amortized analysis)Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 1. Амортизационный анализ (amortized analysis)Mikhail Kurnosov
 
Лекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмовЛекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмовMikhail Kurnosov
 
Лекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимостиЛекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимостиMikhail Kurnosov
 
Лекция 9. Поиск кратчайшего пути в графе
Лекция 9. Поиск кратчайшего пути в графеЛекция 9. Поиск кратчайшего пути в графе
Лекция 9. Поиск кратчайшего пути в графеMikhail Kurnosov
 
Лекция 8. Графы. Обходы графов
Лекция 8. Графы. Обходы графовЛекция 8. Графы. Обходы графов
Лекция 8. Графы. Обходы графовMikhail Kurnosov
 
Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)Mikhail Kurnosov
 
Лекция 7. Бинарные кучи. Пирамидальная сортировка
Лекция 7. Бинарные кучи. Пирамидальная сортировкаЛекция 7. Бинарные кучи. Пирамидальная сортировка
Лекция 7. Бинарные кучи. Пирамидальная сортировкаMikhail Kurnosov
 
Лекция 6. Хеш-таблицы
Лекция 6. Хеш-таблицыЛекция 6. Хеш-таблицы
Лекция 6. Хеш-таблицыMikhail Kurnosov
 
Лекция 5. Бинарные деревья поиска
Лекция 5. Бинарные деревья поискаЛекция 5. Бинарные деревья поиска
Лекция 5. Бинарные деревья поискаMikhail Kurnosov
 

More from Mikhail Kurnosov (14)

Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
 
Лекция 5. B-деревья (B-trees, k-way merge sort)
Лекция 5. B-деревья (B-trees, k-way merge sort)Лекция 5. B-деревья (B-trees, k-way merge sort)
Лекция 5. B-деревья (B-trees, k-way merge sort)
 
Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)
 
Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)
 
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
 
Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 1. Амортизационный анализ (amortized analysis)Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 1. Амортизационный анализ (amortized analysis)
 
Лекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмовЛекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмов
 
Лекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимостиЛекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимости
 
Лекция 9. Поиск кратчайшего пути в графе
Лекция 9. Поиск кратчайшего пути в графеЛекция 9. Поиск кратчайшего пути в графе
Лекция 9. Поиск кратчайшего пути в графе
 
Лекция 8. Графы. Обходы графов
Лекция 8. Графы. Обходы графовЛекция 8. Графы. Обходы графов
Лекция 8. Графы. Обходы графов
 
Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)
 
Лекция 7. Бинарные кучи. Пирамидальная сортировка
Лекция 7. Бинарные кучи. Пирамидальная сортировкаЛекция 7. Бинарные кучи. Пирамидальная сортировка
Лекция 7. Бинарные кучи. Пирамидальная сортировка
 
Лекция 6. Хеш-таблицы
Лекция 6. Хеш-таблицыЛекция 6. Хеш-таблицы
Лекция 6. Хеш-таблицы
 
Лекция 5. Бинарные деревья поиска
Лекция 5. Бинарные деревья поискаЛекция 5. Бинарные деревья поиска
Лекция 5. Бинарные деревья поиска
 

Семинар 8. Параллельное программирование на MPI (часть 1)

  • 1. Семинар 8 Стандарт MPI (часть 1) Михаил Курносов E-mail: mkurnosov@gmail.com WWW: www.mkurnosov.net Цикл семинаров «Основы параллельного программирования» Институт физики полупроводников им. А. В. Ржанова СО РАН Новосибирск, 2015 CC-BY
  • 2. Вычислительные системы с распределенной памятью CPU0 Коммуникационная сеть (Interconnect, Communication network) Cache Разделяемая память (Shared memory) CPU1 Cache CPU2 Cache CPU3 Cache CPU0 Cache Разделяемая память (Shared memory) CPU1 Cache CPU2 Cache CPU3 Cache  http://www.top500.org  http://www.green500.org  http://www.graph500.org  http://top50.supercomputers.ru  Вычислительная система с распределенной памятью (distributed memory computer system) – совокупность вычислительных узлов, взаимодействие между которыми осуществляется через коммуникационную сеть (InfiniBand, Gigabit Ethernet, Cray Gemeni, Fujitsu Tofu, …)  Каждый узел имеет множество процессоров/ядер, взаимодействующих через разделяемую память (shared memory)  Процессоры могут быть многоядерными, ядра могут поддерживать одновременную многопоточность (SMT, Hyper-Threading)
  • 3. Вычислительные системы с распределенной памятью CPU0 Коммуникационная сеть (Interconnect, Communication network) Cache Разделяемая память (Shared memory) CPU1 Cache CPU2 Cache CPU3 Cache CPU0 Cache Разделяемая память (Shared memory) CPU1 Cache CPU2 Cache CPU3 Cache  http://www.top500.org  http://www.green500.org  http://www.graph500.org  http://top50.supercomputers.ru  Вычислительная система с распределенной памятью (distributed memory computer system) – совокупность вычислительных узлов, взаимодействие между которыми осуществляется через коммуникационную сеть (InfiniBand, Gigabit Ethernet, Cray Gemeni, Fujitsu Tofu, …)  Каждый узел имеет множество процессоров/ядер, взаимодействующих через разделяемую память (shared memory)  Процессоры могут быть многоядерными, ядра могут поддерживать одновременную многопоточность (SMT, Hyper-Threading) ILP ILP ILP ILP ILP ILP ILP ILP TLP/PLP TLP/PLP Instruction Level Parallelism (ILP): суперскалярный конвейер, внеочередное выполнение команд, ... SIMD: SSE/AVX, AltivEC, ARM NEON Thread Level Parallelism (TLP): POSIX Threads, OpenMP, Cilk, C11/C+ +11 threads, Intel TBB GPGPU: OpenCL, CUDA, OpenACC Process Level Parallelism (message passing): MPI, OpenSHMEM, PGAS (Cray Chapel, IBM X10, UPC)
  • 4. Вычислительные кластеры (computer cluster)  Вычислительные кластеры строятся на базе свободно доступных для приобретения компонентов  Вычислительные узлы: 2/4-процессорные узлы, 1 – 8 GiB оперативной памяти на ядро (поток)  Коммуникационная сеть (сервисная и для обмена сообщениями)  Подсистема хранения данных (дисковый массивы, параллельные и сетевые файловые системы)  Система бесперебойного электропитания  Система охлаждения  Программное обеспечение: GNU/Linux (NFS, NIS, DNS, …), MPI (MPICH2, Open MPI), TORQUE/SLURM
  • 5. Программное обеспечение вычислительных кластеров Compute node 1 P P P P P P P P Memory Compute node 2 P P P P P P P P Memory Compute node 3 P P P P P P P P Memory Compute node 4 P P P P P P P P Memory Compute node N P P P P P P P P Memory … Frontend P P P P P P P P Memory Service network (NIS, NFS, SSH, …) Compute network (MPI) Internet  Frontend – узел для компиляции программ и постановки задач в очередь  Средства разработки: MPI (MPICH, MVAPICH, Open MPI, Intel MPI), OpenMP (GCC, Intel, Oracle), GPGPU (CUDA, OpenCL, OpenACC)  Система управления ресурсами (поддерживает очередь задач и контролирует доступ к ресурсам): TORQUE, SLURM, Altair PBS Pro, IBM Load Leveler, Sun GridEngine, …  Сетевая (параллельная) файловая система (доступ к /home со всех узлов): NFS, Lustre, PVFS, ...  Система мониторинга: Ganglia, …  Сетевые сервисы: DHCP, DNS, NIS/LDAP, backup
  • 6. Рейтинги мощнейших ВС  www.top500.org – решение системы линейных алгебраических уравнений методом LU-факторизации (High-Performance Linpack, FLOPS – Floating-point Operations Per Seconds)  www.graph500.org – алгоритмы на графах (построение графа, обход в ширину, TEPS – Traversed Edges Per Second)  www.green500.org – главный критерий – энергоэффективность (объем потребляемой эленктроэнергии, kW)  http://top50.supercomputers.ru – рейтинг мощнейших вычислительных систем СНГ (тест High-Performance Linpack)  Как создать свой тест производительности?
  • 7. www.top500.org (Ноябрь 2014)  Среднее количество вычислительных ядер в системе: 46 288  Среднее количество ядер на сокет (процессор): 9 (4, 6, 8, 10, 12, 14, 16)  Среднее энергопотребление: 836 kW  Коммуникационная сеть: Infiniband (44%), Gigabit Ethernet (25%), 10 Gigabit Ethernet (15%), Custom (10%), Cray (3%)  Процессоры: Intel (> 80%), IBM Power, AMD Opteron, SPARC64, ShenWei, NEC  Ускорители (14% систем): Intel Xeon Phi, NVIDIA GPU, ATI/AMD GPU, PESY-SC  Операционная система: GNU/Linux (96%), IBM AIX (11 шт.), Microsoft (1 шт.)
  • 8. Стандарт MPI  Message Passing Interface (MPI) – это стандарт на программный интерфейс коммуникационных библиотек для создания параллельных программ в модели передачи сообщений (message passing)  Стандарт определяет интерфейс для языков программирования C и Fortran  Стандарт де-факто для систем с распределенной памятью (“ассемблер” в области параллельных вычислений на системах с распределенной памятью)  Обеспечивает переносимость программ на уровне исходного кода между разными ВС (Cray, IBM, NEC, Fujitsu, ...) http://www.mpi-forum.org 1994 MPI 1.0 1995 MPI 1.1 1997 MPI 1.2, 2.0 2008 MPI 1.3, 2.1 2009 MPI 2.2 MPI 3.0 2012 http://www.mpi-forum.org/docs/mpi-3.0/mpi30-report.pdf
  • 10. Реализации MPI  MPICH (Open source, Argone NL, http://www.mcs.anl.gov/research/projects/mpich2)  Производные от MPICH2: MVAPICH2 (MPICH2 for InfiniBand), IBM MPI, Cray MPI, Intel MPI, HP MPI, Microsoft MPI  Open MPI (Open source, BSD License, http://www.open-mpi.org)  Производные от Open MPI: Oracle MPI  Высокоуровневые интерфейсы  С++: Boost.MPI  Java: Open MPI Java Interface, MPI Java, MPJ Express, ParJava  C#: MPI.NET, MS-MPI  Python: mpi4py, pyMPI  MPICH (Open source, Argone NL, http://www.mcs.anl.gov/research/projects/mpich2)  Производные от MPICH2: MVAPICH2 (MPICH2 for InfiniBand), IBM MPI, Cray MPI, Intel MPI, HP MPI, Microsoft MPI  Open MPI (Open source, BSD License, http://www.open-mpi.org)  Производные от Open MPI: Oracle MPI  Высокоуровневые интерфейсы  С++: Boost.MPI  Java: Open MPI Java Interface, MPI Java, MPJ Express, ParJava  C#: MPI.NET, MS-MPI  Python: mpi4py, pyMPI
  • 11. Отличия реализаций MPI  Спектр поддерживаемых архитектур процессоров: Intel, IBM, ARM, Fujitsu, NVIDIA, AMD  Типы поддерживаемых коммуникационных технологий/сетей: InfiniBand, 10 Gigabit Ethernet, Cray Gemeni, IBM PERCS/5D torus, Fujitsu Tofu, Myrinet, SCI, …  Протоколы дифференцированных обменов двусторонних обменов (Point-to-point): хранение списка процессов, подтверждение передачи (ACK), буферизация сообщений, …  Коллективные операции обменов информацией: коммуникационная сложность алгоритмов, учет структуры вычислительной системы (torus, fat tree, …), неблокирующие коллективные обмены (MPI 3.0, методы хранение collective schedule)  Алгоритмы вложения графов программ в структуры вычислительных систем (MPI topology mapping)  Возможность выполнения MPI-функций в многопоточной среде и поддержка ускорителей (GPU NVIDIA/AMD, Intel Xeon Phi)
  • 12. Модель программирования  Программа состоит из N параллельных процессов, которые порождаются при запуске программы (MPI 1) или могут быть динамически созданы во время выполнения (MPI 2)  Каждый процесс имеет уникальный идентификатор [0, N – 1] и изолированное адресное пространство (SPMD)  Процессы взаимодействуют путем передачи сообщений (message passing)  Процессы могут образовывать группы для реализации коллективных операций обмена информацией P0 M P1 M P2 M Process/thread/task Memory (address space) Message passing Memory access
  • 13. Понятие коммуникатора (communicator)  Коммуникатор (communicator) – группа процессов, образующая логическую область для выполнения коллективных операций между процессами  В рамках коммуникатора процессы имеют номера: 0, 1, …, N – 1  Все MPI-сообщения должны быть связаны с определенным коммуникатором Процесс0 Коммуникатор MPI_COMM_WORLD включает все процессы Процесс1 Процесс4 Процесс5 Процесс3 Процесс2
  • 14. Программный интерфейс MPI  Заголовочный файл mpi.h #include <mpi.h>  Функции, типы данных и именованные константы имеют префикс «MPI_» MPI_Init, MPI_Init_thread, MPI_Send  Функции возвращают MPI_SUCCESS или код ошибки  Результаты возвращаются через аргументы функций int MPI_Send(const void *buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm);
  • 15. Hello, MPI World! #include <stdio.h> #include <mpi.h> int main(int argc, char *argv[]) { int commsize, rank, len; char procname[MPI_MAX_PROCESSOR_NAME]; MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &commsize); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Get_processor_name(procname, &len); printf("Hello, MPI World! Process %d of %d on node %s.n", rank, commsize, procname); MPI_Finalize(); return 0; }
  • 16. Компиляция MPI-программ # Программа на C $ mpicc –Wall –o hello ./hello.c # Программа на C++ $ mpicxx –Wall –o hello ./hello.cpp # Программа на Fortran $ mpif90 –o hello ./hello.f90
  • 17. Запуск MPI-программы на кластере (система SLURM) # Формируем паспорт задачи (job-файл) $ cat task.job #!/bin/bash #SBATCH --nodes=2 --ntasks-per-node=8 #SBATCH --job-name=MyTask mpiexec ./hello # Ставим задачу в очередь $ sbatch ./task.job Submitted batch job 4285 Ресурсный запрос nodes=2 — два узла кластера ntasks-per-node=8 — 8 процессов на узле man sbatch
  • 18. Запуск MPI-программы на кластере (система SLURM) # Проверяем состояние задачи в очереди $ squeue JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON) 4285 debug MyTask mkurnoso R 0:01 2 cn[3-4] # Проверяем результат $ cat ./slurm-4285.out Hello, MPI World! Process 12 of 16 on node cn4. Hello, MPI World! Process 13 of 16 on node cn4. Hello, MPI World! Process 14 of 16 on node cn4. Hello, MPI World! Process 15 of 16 on node cn4. Hello, MPI World! Process 8 of 16 on node cn4. Hello, MPI World! Process 9 of 16 on node cn4. Hello, MPI World! Process 10 of 16 on node cn4. Hello, MPI World! Process 11 of 16 on node cn4. Hello, MPI World! Process 4 of 16 on node cn3. Hello, MPI World! Process 5 of 16 on node cn3. Hello, MPI World! Process 6 of 16 on node cn3. Hello, MPI World! Process 0 of 16 on node cn3. Hello, MPI World! Process 1 of 16 on node cn3. Hello, MPI World! Process 2 of 16 on node cn3. Hello, MPI World! Process 3 of 16 on node cn3. Hello, MPI World! Process 7 of 16 on node cn3.
  • 19. Подсчет количества простых чисел (serial verion) Подсчитывает количество простых числе в интервале [a, b] Определят, является ли число n простым O(sqrt(n)) const int a = 1; const int b = 10000000; int is_prime_number(int n) { int limit = sqrt(n) + 1; for (int i = 2; i <= limit; i++) { if (n % i == 0) return 0; } return (n > 1) ? 1 : 0; } int count_prime_numbers(int a, int b) { int nprimes = 0; if (a <= 2) { nprimes = 1; /* Count '2' as a prime number */ a = 2; } if (a % 2 == 0) /* Shift 'a' to odd number */ a++; /* Loop over odd numbers: a, a + 2, a + 4, ... , b */ for (int i = a; i <= b; i += 2) { if (is_prime_number(i)) nprimes++; } return nprimes; }
  • 20. Подсчет количества простых чисел (MPI version) Распределим итерации цикла между процессами MPI-программы const int a = 1; const int b = 10000000; int is_prime_number(int n) { int limit = sqrt(n) + 1; for (int i = 2; i <= limit; i++) { if (n % i == 0) return 0; } return (n > 1) ? 1 : 0; } int count_prime_numbers(int a, int b) { int nprimes = 0; if (a <= 2) { nprimes = 1; /* Count '2' as a prime number */ a = 2; } if (a % 2 == 0) /* Shift 'a' to odd number */ a++; /* Loop over odd numbers: a, a + 2, a + 4, ... , b */ for (int i = a; i <= b; i += 2) { if (is_prime_number(i)) nprimes++; } return nprimes; }
  • 21. Подсчет количества простых чисел (MPI version) int main(int argc, char **argv) { MPI_Init(&argc, &argv); // Start serial version in process 0 double tserial = 0; if (get_comm_rank() == 0) tserial = run_serial(); // Start parallel version double tparallel = run_parallel(); if (get_comm_rank() == 0) { printf("Count prime numbers on [%d, %d]n", a, b); printf("Execution time (serial): %.6fn", tserial); printf("Execution time (parallel): %.6fn", tparallel); printf("Speedup (processes %d): %.2fn", get_comm_size(), tserial / tparallel); } MPI_Finalize(); return 0; }
  • 22. Подсчет количества простых чисел (MPI version) double run_serial() { double t = MPI_Wtime(); int n = count_prime_numbers(a, b); t = MPI_Wtime() - t; printf("Result (serial): %dn", n); return t; } double run_parallel() { double t = MPI_Wtime(); int n = count_prime_numbers_par(a, b); t = MPI_Wtime() - t; printf("Process %d/%d execution time: %.6fn", get_comm_rank(), get_comm_size(), t); if (get_comm_rank() == 0) printf("Result (parallel): %dn", n); return t; }
  • 23. Подсчет количества простых чисел (MPI version) void get_chunk(int a, int b, int commsize, int rank, int *lb, int *ub) { /* * This algorithm is based on OpenMP 4.0 spec (Sec. 2.7.1, default schedule for loops) * For a team of commsize processes and a sequence of n items, let ceil(n ? commsize) be the integer q * that satisfies n = commsize * q - r, with 0 <= r < commsize. * Assign q iterations to the first commsize - r processes, and q - 1 iterations to the remaining r processes. */ int n = b - a + 1; int q = n / commsize; if (n % commsize) q++; int r = commsize * q - n; int chunk = q; /* Compute chunk size for the process */ if (rank >= commsize - r) chunk = q - 1; *lb = a; /* Determine start item for the process */ if (rank > 0) { if (rank <= commsize — r) /* Count sum of previous chunks */ *lb += q * rank; else *lb += q * (commsize - r) + (q - 1) * (rank - (commsize - r)); } *ub = *lb + chunk - 1; }
  • 24. Подсчет количества простых чисел (MPI version) Count prime numbers on [1, 10000000] Process 0/8 execution time: 0.466901 Process 1/8 execution time: 0.780994 Process 2/8 execution time: 1.126007 Process 3/8 execution time: 1.125990 Process 4/8 execution time: 1.556572 Process 5/8 execution time: 1.358095 Process 6/8 execution time: 1.556561 Process 7/8 execution time: 1.556546 Execution time (serial): 8.970650 Execution time (parallel): 0.466901 Result (parallel): 664579 Result (serial): 664579 Speedup (processes 8): 19.21 Проблема 1 Неравномерная загрузка процессов (load imbalance) Проблема 2 Ускорение в 19 раз?
  • 25. Подсчет количества простых чисел (MPI version) int count_prime_numbers_par(int a, int b) { int nprimes = 0; int lb, ub; get_chunk(a, b, get_comm_size(), get_comm_rank(), &lb, &ub); /* Count '2' as a prime number */ if (lb <= 2) { nprimes = 1; lb = 2; } /* Shift 'a' to odd number */ if (lb % 2 == 0) lb++; /* Loop over odd numbers: a, a + 2, a + 4, ... , b */ for (int i = lb; i <= ub; i += 2) { if (is_prime_number(i)) nprimes++; } int nprimes_global; MPI_Reduce(&nprimes, &nprimes_global, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); return nprimes_global; } Проблема 1 Неравномерная загрузка процессов Process 0: 0, 1, 2, 3 Process 1: 4, 5, 6, 7 Process 3: 8, 9, 10, 11 ... Tis_prime_number = O(sqrt(i))
  • 26. Подсчет количества простых чисел (MPI version) int main(int argc, char **argv) { MPI_Init(&argc, &argv); // Start serial version in process 0 double tserial = 0; if (get_comm_rank() == 0) tserial = run_serial(); // Start parallel version double tparallel = run_parallel(); if (get_comm_rank() == 0) { printf("Count prime numbers on [%d, %d]n", a, b); printf("Execution time (serial): %.6fn", tserial); printf("Execution time (parallel): %.6fn", tparallel); printf("Speedup (processes %d): %.2fn", get_comm_size(), tserial / tparallel); } MPI_Finalize(); return 0; } Проблема 2 Неправильное вычисление коэффициента ускорения Speedup = tserial / tparallel tparallel — время процесса 0 За tparallel надо брать наибольшее время выполнения процессов
  • 27. double run_parallel() { double t = MPI_Wtime(); int n = count_prime_numbers_par(a, b); t = MPI_Wtime() - t; printf("Process %d/%d execution time: %.6fn", get_comm_rank(), get_comm_size(), t); if (get_comm_rank() == 0) printf("Result (parallel): %dn", n); // Собираем в процессе 0 максимальное из времен выполнения double tmax; MPI_Reduce(&t, &tmax, 1, MPI_DOUBLE, MPI_MAX, 0, MPI_COMM_WORLD); return tmax; } Подсчет количества простых чисел (MPI version) Решение проблемы 2
  • 28. Подсчет количества простых чисел (MPI version) int count_prime_numbers_par(int a, int b) { int nprimes = 0; /* Count '2' as a prime number */ int commsize = get_comm_size(); int rank = get_comm_rank(); if (a <= 2) { a = 2; if (rank == 0) nprimes = 1; } for (int i = a + rank; i <= b; i += commsize) { if (i % 2 > 0 && is_prime_number(i)) nprimes++; } int nprimes_global = 0; MPI_Reduce(&nprimes, &nprimes_global, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); return nprimes_global; } Решение проблемы 1 Циклическое распределение итераций (round-robin)
  • 29. Задание  Разработать на MPI параллельную версию программы подсчета количества простых числе в заданном интервале — написать код функции count_prime_numbers_par()  Провести анализ масштабируемости параллельной программы  Шаблон программы находится в каталоге _task