Параллельное программирование в стандарте MPI

Содержание

Слайд 2

Учебный курс "Параллельное программирование в стандарте MPI" Содержание Модель передачи сообщений

Учебный курс "Параллельное программирование в стандарте MPI"

Содержание

Модель передачи сообщений
Модели SPMD и

MPMD
Стандарт MPI
Основные понятия и функции MPI
Слайд 3

Учебный курс "Параллельное программирование в стандарте MPI" Модель передачи сообщений Параллельное

Учебный курс "Параллельное программирование в стандарте MPI"

Модель передачи сообщений

Параллельное приложение состоит

из нескольких процессов, выполняющихся одновременно.
Каждый процесс имеет приватную память.
Обмены данными между процессами осуществляются посредством явной отправки/получения сообщений.
Процессы могут выполняться как на одном и том же, так и на разных процессорах.

Процесс 0

Процесс 1

Процесс N-1


Сеть

Сообщ

Память 0

Память 1

Память N-1

Слайд 4

Учебный курс "Параллельное программирование в стандарте MPI" Модель выполнения SPMD Модель

Учебный курс "Параллельное программирование в стандарте MPI"

Модель выполнения SPMD

Модель SPMD (Single

Program Multiple Data) предполагает, каждый процесс параллельного приложения имеет один и тот же исходный код.

Процесс 0

Процесс 1

Процесс N-1


mytask.c

mytask.c

mytask.c

void main()
{

switch (myrank) {
case 0: do_mastertask(); /* Мастер */
case 1: do_task1(); /* Рабочий 1 */
case 2: do_task2(); /* Рабочий 2 */

}

}

Слайд 5

Учебный курс "Параллельное программирование в стандарте MPI" Модель выполнения MPMD Модель

Учебный курс "Параллельное программирование в стандарте MPI"

Модель выполнения MPMD

Модель MPMD (Multiple

Program Multiple Data) предполагает, каждый процессы параллельного приложения имеют различные исходные коды.

Процесс 0

Процесс 1

Процесс N-1


master.c

mytask1.c

mytaskn.c

void main()
{
/*
Мастер
*/

}

void main()
{
/*
Рабочий 1
*/

}

void main()
{
/*
Рабочий N
*/

}

Слайд 6

Учебный курс "Параллельное программирование в стандарте MPI" Стандарт MPI MPI (Message

Учебный курс "Параллельное программирование в стандарте MPI"

Стандарт MPI

MPI (Message Passing Interface)

– стандарт, реализующий модель обмена сообщениями между параллельными процессами. Поддерживает модели выполнения SPMD и (начиная с версии 2.0) MPMD.
Стандарт представляет собой набор спецификаций подпрограмм (более 120) на языках C, C++ и FORTRAN.
Стандарт реализуется разработчиками в виде библиотек подпрограмм для различных аппаратно-программных платформ (кластеры, персональные компьютеры, …, Windows, Unix/Linux, …).
Слайд 7

Учебный курс "Параллельное программирование в стандарте MPI" Источники информации Сервер PARALLEL.RU http://parallel.ru/tech/tech_dev/mpi.html MPI-форум http://www.mpi-forum.org

Учебный курс "Параллельное программирование в стандарте MPI"

Источники информации

Сервер PARALLEL.RU http://parallel.ru/tech/tech_dev/mpi.html
MPI-форум http://www.mpi-forum.org

Слайд 8

Учебный курс "Параллельное программирование в стандарте MPI" Цикл разработки MPI-программ Персональный

Учебный курс "Параллельное программирование в стандарте MPI"

Цикл разработки MPI-программ

Персональный компьютер
Первоначальная разработка

и отладка
Отладка по результатам запуска на суперкомпьютере

Суперкомпьютер
Тестирование

Слайд 9

Учебный курс "Параллельное программирование в стандарте MPI" MPI-программа MPI-программа – множество

Учебный курс "Параллельное программирование в стандарте MPI"

MPI-программа

MPI-программа – множество параллельных взаимодействующих

процессов.
Процессы порождаются один раз, во время запуска программы*.
Каждый процесс работает в своем адресном пространстве, каких-либо общих данных нет. Единственный способ взаимодействия процессов – явный обмен сообщениями.

* Порождение дополнительных процессов и уничтожение существующих возможно только начиная с версии MPI-2.0.

Слайд 10

Учебный курс "Параллельное программирование в стандарте MPI" Коммуникаторы Для локализации области

Учебный курс "Параллельное программирование в стандарте MPI"

Коммуникаторы

Для локализации области взаимодействия процессов

можно создавать специальные программные объекты – коммуникаторы. Процесс может входить в разные коммуникаторы.
Взаимодействия процессов проходят в рамках некоторого коммуникатора. Сообщения, переданные в разных коммуникаторах, не пересекаются и не мешают друг другу.
Атрибуты процесса MPI-программы:
номер коммуникатора;
номер в коммуникаторе (от 0 до n-1, n – число процессов в коммуникаторе).
Стандартные коммуникаторы:
MPI_COMM_WORLD – все процессы приложения
MPI_COMM_SELF – текущий процесс приложения
MPI_COMM_NULL – пустой коммуникатор
Слайд 11

Учебный курс "Параллельное программирование в стандарте MPI" MPI_COMM_WORLD Коммуникаторы 0 1

Учебный курс "Параллельное программирование в стандарте MPI"

MPI_COMM_WORLD

Коммуникаторы

0

1

2

3

4

5

0

1

2

3

4

5

0

1

2

3

0

1

my_comm1

my_comm2

6

6

2

Слайд 12

Учебный курс "Параллельное программирование в стандарте MPI" Сообщение Сообщение процесса –

Учебный курс "Параллельное программирование в стандарте MPI"

Сообщение

Сообщение процесса – набор

данных стандартного (определенного в MPI) или пользовательского типа.
Основные атрибуты сообщения:
номер процесса-отправителя (получателя)
номер коммуникатора
тег (уникальный идентификатор) сообщения (целое число)
тип элементов данных в сообщении
количество элементов данных
указатель на буфер с сообщением
Слайд 13

Учебный курс "Параллельное программирование в стандарте MPI" Структура MPI-программы #include "mpi.h"

Учебный курс "Параллельное программирование в стандарте MPI"

Структура MPI-программы

#include "mpi.h" /* Подключение

библиотеки */
void main(int argc, char * argv[])
{
MPI_Init(&argc, &argv); /* Инициализация */
… /* Обмены */
MPI_Finalize(); /* Завершение */
}
Слайд 14

Учебный курс "Параллельное программирование в стандарте MPI" MPI-функции Имеют имена вида

Учебный курс "Параллельное программирование в стандарте MPI"

MPI-функции

Имеют имена вида MPI_...
Возвращают целое

число – MPI_SUCCESS или код ошибки.
Простые функции общего назначения:
/* Количество процессов в коммуникаторе */ int MPI_Comm_size(MPI_Comm comm, int * size);
/* Номер (ранг) текущего процесса в коммуникаторе */ int MPI_Comm_rank(MPI_Comm comm, int * rank);
Слайд 15

Учебный курс "Параллельное программирование в стандарте MPI" Пример MPI-программы #include "mpi.h"

Учебный курс "Параллельное программирование в стандарте MPI"

Пример MPI-программы

#include "mpi.h"
#include
int total,

iam;
void main(int argc, char * argv[])
{
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &total);
MPI_Comm_rank(MPI_COMM_WORLD, &iam);
printf("Привет! Я %d-й процесс из %d.\n", iam, total);
MPI_Finalize();
}
Слайд 16

Учебный курс "Параллельное программирование в стандарте MPI" Виды взаимодействия процессов Взаимодействие

Учебный курс "Параллельное программирование в стандарте MPI"

Виды взаимодействия процессов

Взаимодействие "точка-точка" –

обмен между двумя процессами одного коммуникатора.
Коллективное взаимодействие – обмен между всеми процессами одного коммуникатора.

0

1

2

3

4

5

0

1

2

3

4

5

Слайд 17

Учебный курс "Параллельное программирование в стандарте MPI" Взаимодействие "точка-точка" Участвуют два

Учебный курс "Параллельное программирование в стандарте MPI"

Взаимодействие "точка-точка"

Участвуют два процесса: отправитель

сообщения и получатель сообщения.
Отправитель должен вызвать одну из функций отправки сообщения и явно указать атрибуты получателя (коммуникатор и номер в коммуникаторе) и тег сообщения.
Получатель должен вызвать одну из функций получения сообщения и указать (тот же) коммуникатор отправителя; получатель может не знать номер отправителя и тег сообщения.
Свойства:
Сохранение порядка (если P0 передает Р1 сообщения А и затем В, то Р1 получит А, а затем В).
Гарантированное выполнение обмена (если P0 вызвал функцию отправки, а Р1 вызвал функцию получения, то P1 получит сообщение от P0).
Слайд 18

Учебный курс "Параллельное программирование в стандарте MPI" Виды коммуникационных функций "точка-точка"

Учебный курс "Параллельное программирование в стандарте MPI"

Виды коммуникационных функций "точка-точка"

Блокирующая функция

запускает операцию и возвращает управление процессу только после ее завершения.
После завершения допустима модификация отправленного (принятого) сообщения.
Неблокирующая функция запускает операцию и возвращает управление процессу немедленно.
Факт завершения операции проверяется позднее с помощью другой функции.
До завершения операции недопустима модификация отправляемого (получаемого) сообщения.

Блокирующий прием (отправка)

Ожидание
завершения

Другие действия

Неблокирующий прием (отправка)

Проверка
завершения

Процесс

Процесс

Другие действия

Слайд 19

Учебный курс "Параллельное программирование в стандарте MPI" Отправка сообщений при использовании

Учебный курс "Параллельное программирование в стандарте MPI"

Отправка сообщений при использовании функций

"точка-точка"

Стандартная – завершается сразу после отправки сообщения.
Синхронная – завершается после приема подтверждения от адресата.
Буферизованная – завершается, как только сообщение копируется в системный буфер для дальнейшей отправки.
"По готовности" – начинается, если адресат инициализировал прием и завершается сразу после отправки.

Слайд 20

Учебный курс "Параллельное программирование в стандарте MPI" Коммуникационные функции "точка-точка" Отправка: MPI_[I][R, S, B]Send Прием: MPI_[I]Recv

Учебный курс "Параллельное программирование в стандарте MPI"

Коммуникационные функции "точка-точка"

Отправка: MPI_[I][R, S,

B]Send
Прием: MPI_[I]Recv
Слайд 21

Учебный курс "Параллельное программирование в стандарте MPI" MPI_Send MPI_Bsend MPI_Ssend MPI_Rsend

Учебный курс "Параллельное программирование в стандарте MPI"

MPI_Send
MPI_Bsend
MPI_Ssend
MPI_Rsend
MPI_Isend
MPI_Ibsend
MPI_Issend
MPI_Irsend

Коммуникационные функции "точка-точка"

MPI_Recv
MPI_Irecv

Слайд 22

Учебный курс "Параллельное программирование в стандарте MPI" Блокирующая стандартная отправка сообщения

Учебный курс "Параллельное программирование в стандарте MPI"

Блокирующая стандартная отправка сообщения

int MPI_Send
IN void

* buf – указатель на буфер с сообщением
IN int count – количество элементов в буфере
IN MPI_Datatype datatype – MPI-тип данных элементов в буфере
IN int dest – номер процесса-получателя
IN int tag – тег сообщения
IN MPI_Comm comm – коммуникатор
Слайд 23

Учебный курс "Параллельное программирование в стандарте MPI" Блокирующее стандартное получение сообщения

Учебный курс "Параллельное программирование в стандарте MPI"

Блокирующее стандартное получение сообщения

int MPI_Recv
OUT void

* buf – указатель на буфер с сообщением
IN int count – количество элементов в буфере
IN MPI_Datatype datatype – MPI-тип данных элементов в буфере
IN int src – номер процесса-отправителя
IN int tag – тег сообщения
IN MPI_Comm comm – коммуникатор
OUT MPI_Status* status – информация о фактически полученных данных (указатель на структуру с двумя полями: source –номер процесса-источника, tag – тег сообщения)
Слайд 24

Учебный курс "Параллельное программирование в стандарте MPI" Неблокирующая стандартная отправка сообщения

Учебный курс "Параллельное программирование в стандарте MPI"

Неблокирующая стандартная отправка сообщения

int MPI_Isend
IN void

* buf – указатель на буфер с сообщением
IN int count – количество элементов в буфере
IN MPI_Datatype datatype – MPI-тип данных элементов в буфере
IN int dest – номер процесса-получателя
IN int tag – тег сообщения
IN MPI_Comm comm – коммуникатор
OUT MPI_Request *request – дескриптор операции (для последующей проверки завершения операции)
Слайд 25

Учебный курс "Параллельное программирование в стандарте MPI" Неблокирующее стандартное получение сообщения

Учебный курс "Параллельное программирование в стандарте MPI"

Неблокирующее стандартное получение сообщения

int MPI_Irecv
OUT void

* buf – указатель на буфер с сообщением
IN int count – количество элементов в буфере
IN MPI_Datatype datatype – MPI-тип данных элементов в буфере
IN int src – номер процесса-отправителя
IN int tag – тег сообщения
IN MPI_Comm comm – коммуникатор
OUT MPI_Request *request – дескриптор операции (для последующей проверки завершения операции)
Слайд 26

Учебный курс "Параллельное программирование в стандарте MPI" Завершение неблокирующих обменов /*

Учебный курс "Параллельное программирование в стандарте MPI"

Завершение неблокирующих обменов

/* Проверка завершения

*/ int MPI_Test (MPI_Request *request, int *flag, MPI_Status *status)
int MPI_Testany (…)
int MPI_Testall (…)
int MPI_Testsome (…)
/* Ожидание завершения */ int MPI_Wait (MPI_Request *request, MPI_Status *status)
int MPI_Waitany (…)
int MPI_Waitall (…)
int MPI_Waitsome (…)
Слайд 27

Учебный курс "Параллельное программирование в стандарте MPI" Тупики (deadlocks) P0 MPI_Recv

Учебный курс "Параллельное программирование в стандарте MPI"

Тупики (deadlocks)

P0

MPI_Recv (от процесса P1);
MPI_Send

(процессу P1);

P1

MPI_Recv (от процесса P0);
MPI_Send (процессу P0);

Гарантированный тупик

P0

MPI_Send (процессу P1);
MPI_Recv (от процесса P1);

P1

MPI_Send (процессу P0); MPI_Recv (от процесса P0);

Возможный тупик

Слайд 28

Учебный курс "Параллельное программирование в стандарте MPI" Разрешение тупиков P0 MPI_Send

Учебный курс "Параллельное программирование в стандарте MPI"

Разрешение тупиков

P0

MPI_Send (процессу P1); MPI_Recv

(от процесса P1);

P1

MPI_Recv (от процесса P0);
MPI_Send (процессу P0);

P0

MPI_Send (процессу P1);
MPI_Recv (от процесса P1);

P1

MPI_Irecv (от процесса P0); MPI_Send (процессу P0);
MPI_Wait

/* Совмещенные прием и передача */
MPI_Sendrecv

P0

P1

/* Совмещенные прием и передача */
MPI_Sendrecv

Слайд 29

Учебный курс "Параллельное программирование в стандарте MPI" Барьерная синхронизация процессов int

Учебный курс "Параллельное программирование в стандарте MPI"

Барьерная синхронизация процессов

int MPI_Barrier(MPI_Comm comm)
Вызвавший

данную функцию процесс блокируется до тех пор, пока все другие процессы указанного коммуникатора не вызовут эту функцию. Завершение данной функции возможно только всеми процессами одновременно (все процессы "преодолевают барьер" одновременно).
Слайд 30

Учебный курс "Параллельное программирование в стандарте MPI" Получение сообщений "Джокеры" MPI_ANY_SOURCE

Учебный курс "Параллельное программирование в стандарте MPI"

Получение сообщений

"Джокеры"
MPI_ANY_SOURCE – получить сообщение, отправленное

любым процессом
MPI_ANY_TAG – получить сообщение, имеющее любой тег
Информация об ожидаемом сообщении
/* С блокировкой */ int MPI_Probe(int src, int tag, MPI_Comm comm, MPI_Status * status);
/* Без блокировки */ int MPI_Iprobe (int src, int tag, MPI_Comm comm, int * flag, MPI_Status * status);
/* Количество элементов в принятом сообщении */ int MPI_Get_count(MPI_Status * status, MPI_Datatype type, int * cnt);
Слайд 31

Учебный курс "Параллельное программирование в стандарте MPI" Коллективные операции Прием и/или

Учебный курс "Параллельное программирование в стандарте MPI"

Коллективные операции

Прием и/или передачу выполняют

одновременно все процессы коммуникатора.
Коллективная функция имеет большое количество параметров, часть которых нужна для приема, а часть для передачи. При вызове в разных процессах та или иная часть игнорируется.
Значения всех параметров коллективных функций (за исключением адресов буферов) должны быть идентичными во всех процессах.
MPI назначает теги для сообщений автоматически.
Слайд 32

Учебный курс "Параллельное программирование в стандарте MPI" Коллективная рассылка сообщения /*

Учебный курс "Параллельное программирование в стандарте MPI"

Коллективная рассылка сообщения

/* Рассылка содержимого

буфера из процесса с номером rootRank, во все остальные */ int MPI_Bcast (void * buf, int count, MPI_Datatype type, int rootRank, MPI_Comm comm);

MPI_Bcast

Слайд 33

Учебный курс "Параллельное программирование в стандарте MPI" Коллективный прием сообщения /*

Учебный курс "Параллельное программирование в стандарте MPI"

Коллективный прием сообщения

/* Сборка элементов

данных из буферов всех процессов в буфере процесса с номером rootRank */ int MPI_Gather (void * sbuf, int scount, MPI_Datatype stype, void * rbuf, int rcount, MPI_Datatype rtype, int rootRank, MPI_Comm comm);
/* Рассылка элементов данных из буфера процесса с номером rootRank в буфера всех процессов (обратная к MPI_Gather) */ int MPI_Scatter

MPI_Gather

MPI_Scatter

Слайд 34

Учебный курс "Параллельное программирование в стандарте MPI" Широковещательные прием и передача MPI_Allgather MPI_Alltoall

Учебный курс "Параллельное программирование в стандарте MPI"

Широковещательные прием и передача

MPI_Allgather

MPI_Alltoall

Слайд 35

Учебный курс "Параллельное программирование в стандарте MPI" Глобальные операции над данными

Учебный курс "Параллельное программирование в стандарте MPI"

Глобальные операции над данными

/* Выполнение

count независимых глобальных операций op над соответствующими элементами массивов sbuf. Результат выполнения над i-ми элементами sbuf записывается в i-й элемент массива rbuf процесса rootRank. */ int MPI_Reduce (void * sbuf, void * rbuf, int count, MPI_Datatype type, MPI_Op op, int rootRank, MPI_Comm comm);
Глобальные операции:
MPI_MAX, MPI_MIN
MPI_SUM, MPI_PROD

MPI_Op_Create()
Слайд 36

Учебный курс "Параллельное программирование в стандарте MPI" Стандартные типы данных в MPI

Учебный курс "Параллельное программирование в стандарте MPI"

Стандартные типы данных в MPI