Обмен сообщениями в MPI
Варианты обмена
Виды функций обмена
Режимы передачи сообщения
Блокирующая стандартная передача сообщения
Блокирующие функции обмена
«Безопасная» структура программы с использованием обмена «по готовности»
Буфферизованная блокирующая передача сообщения
Блокирующий прием сообщения
Замечание
Функция определения размера сообщения:
Блокирующая проверка доставки сообщения
Неблокирующая проверка доставки сообщения
Функция совмещенного приема – передачи сообщения с блокировкой:
Функция замещающего приема – передачи сообщения:
Вопросы для обсуждения
129.62K
Category: programmingprogramming

Обмен сообщениями в MPI

1. Обмен сообщениями в MPI

Двухточечный блокирующий обмен сообщениями

2. Варианты обмена

1) Двухточечный обмен (point – to - point):
участвуют два процесса процесс-отправитель
(источник) и процесс-получатель (адресат).
2) Коллективный обмен: участвуют все процессы
коммуникатора.

3. Виды функций обмена

функции с блокировкой (с синхронизацией):
вызывающий процесс блокируется, пока операция не
будет завершена.
Для функции посылки сообщения блокируется, пока
все посылаемые данные не будут помещены в буфер
(какой – то промежуточный буфер или
непосредственно буфер приема).
Для функции приема сообщения блокируется
выполнение других операций, пока все данные не будут
помещены в буфер приема.
функции без блокировки (асинхронные):

4.

подразумевают совмещение операций об мена с другими операциями, т.е. только
инициируют выполнение соответ ствующих операций обмена. Для опроса
завершенности операции (и за вершения) вводятся дополнительные операции.

5. Режимы передачи сообщения

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

6.

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

7.

Передача «по готовности» начинается только в том
случае, когда адресат инициировал прием сообщения, а
завершается сразу, независимо от того, принято сообщение
или нет. Если прием не зарегистрирован, ре-зультат этой
операции не определен.
MPI_Rsend блокирующая «по готовности»,
MPI_Irsend неблокирующая «по готовности».
Прием сообщения от всех перечисленных выше функций
передачи можно осуществить с помощью двух функций:
MPI_Recv блокирующий стандартный;
MPI_Irecv неблокирующий стандартный.
(буква I в имени от immediately – немедленно)

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

int MPI_Send(void *buf, int count, MPI_Datatype datatype,
int dest, int tag, MPI_Comm comm)
Входные параметры:
buf – начальный адрес буфера передачи
count – количество элементов в буфере передачи
datatype – тип элементов в буфере передачи (тип MPI)
dest – номер (ранг) процесса – получателя
tag – номер (тег) передаваемого сообщения
comm – идентификатор коммуникатора
Выходной параметр:
error – код ошибки

9. Блокирующие функции обмена

Блокирующая синхронная передача сообщения:
int MPI_Ssend(void *buf, int count, MPI_Datatype
datatype, int dest, int tag, MPI_Comm comm)
Блокирующая передача сообщения «по готовности»:
int MPI_Rsend(void *buf, int count, MPI_Datatype
datatype, int dest, int tag, MPI_Comm comm)
Передача «по готовности» должна начинаться, если уже
зарегистрирован соответствующий прием. Если прием не
зарегистрирован, результат выполнения операции не
определен.

10. «Безопасная» структура программы с использованием обмена «по готовности»

процесс 0
процесс 1
…………………….
Блокирующая передача
сообщения 1 процессу 1
call MPI_Send(...,1,tag1,…)
……………………..
Передача «по готовности»
сообщения 2 процессу 1
call MPI_Rsend(…,1,tag2,…)
Неблокирующий прием
сообщения 2 от процесса 0
call MPI_Irecv(…,0,tag2,…)
………………………
Блокирующий прием
сообщения 1 от процесса 0
call MPI_Recv(…,0,tag1,…)
………………………….
Проверка неблокирующего
приема

11. Буфферизованная блокирующая передача сообщения

int MPI_Bsend(void *buf, int count, MPI_Datatype datatype,
int dest, int tag, MPI_Comm comm)
Для выполнения буферизованного обмена необходимо
заранее создать буфер достаточного размера с помощью
вызова функции MPI_Buffer_attach:
int MPI_Buffer_attach(void *buf, int bufsize)
Входной параметр:
bufsize – размер создаваемого буфера
Выходные параметры:
buf – создаваемый буфер
error – код ошибки

12.

Размер буфера должен превосходить размер сообщения на
величину MPI_BSEND_OVERHEAD-дополнительное
пространство, которое используется функцией MPI_Bsend.
После завершения работы с буфером его необходимо
отключить с помощью вызова функции MPI_Buffer_detach:
int MPI_Buffer_detach(void* buf, int bufsize)
В результате выполнения вызова возвращается адрес buf и
размер отключаемого буфера bufsize.
Функции MPI_Send, MPI_Ssend, MPI_Bsend и
MPI_Rsend имеют одинаковые параметры.

13. Блокирующий прием сообщения

int MPI_Recv(void *buf, int count, MPI_Datatype
datatype, int source, int tag, MPI_Comm comm,
MPI_Status *status)
Входные параметры:
count – количество элементов в буфере приема
datatype – тип элементов в буфере приема
source – номер (ранг) процесса - отправителя
tag – номер (тег) принимаемого сообщения
comm – идентификатор коммуникатора
status – статус (информация о полученном
сообщении)
Выходные параметры:
buf – начальный адрес буфера приема
error – код ошибки

14. Замечание

Прием может выполняться
от произвольного процесса
(MPI_ANY_SOURCE), а в
операции передачи должен
быть указан определенный
процесс – получатель.
Приемник может
принимать сообщение с
любым идентификатором
(тегом) - MPI_ANY_TAG.
При одновременном
использовании этих двух
констант будет принят
о любое сообщение от
любого процесса.

15.

16. Функция определения размера сообщения:

Int MPI_Get_count(MPI_Status *status,
MPI_Datatype datatype, int *count)
Входные параметры:
status – статус (информация о полученном сообщении)
datatype – тип данных, в единицах которого требуется
получить размер сообщения
Выходные параметры:
count – количество полученных элементов
error – код ошибки

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

int MPI_Probe(int source, int tag, MPI_Comm
comm, MPI_Status *status)
Входные параметры:
source – номер (ранг) процесса - отправителя
tag – номер (тег) принимаемого сообщения
comm – идентификатор коммуникатора
Выходные параметры:
status – статус, который содержит необходимую
информацию
error – код ошибки.

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

int MPI_Iprobe(int source, int tag, MPI_Comm comm,
int *flag, MPI_Status *status)
Входные параметры:
source – номер (ранг) процесса – отправителя
tag – номер (тег) принимаемого сообщения
comm – идентификатор коммуникатора
Выходные параметры:
flag = true, если сообщение уже поступило и может быть
принято
status – статус, который содержит необходимую
информацию
error – код ошибки.

19. Функция совмещенного приема – передачи сообщения с блокировкой:

Данная функция объединяет посылку и прием
сообщений. Буферы передачи и приема должны быть
различны, типы пересылаемых и принимаемых данных
могут быть различны. Прием и передача используют
один и тот же коммуникатор.
int MPI_Sendrecv(void *sendbuf, int sendcount,
MPI_Datatype sendtype, int dest, int sendtag, void
*recvbuf, int recvcount, MPI_Datatype recvtype, int
source, int recvtag, MPI_Comm comm,MPI_Status
*status)

20.

Входные параметры:
sendbuf – начальный адрес буфера передачи
sendcount – количество элементов в буфере передачи
sendtype – тип элементов в буфере передачи
dest – номер (ранг) процесса – получателя
sendtag – номер (тег) передаваемого сообщения
recvcount – количество элементов в буфере приема
recvtype – тип элементов в буфере приема
source – номер (ранг) процесса - отправителя
recvtag – номер (тег) принимаемого сообщения
comm – идентификатор коммуникатора
Выходные параметры:
recvbuf – начальный адрес буфера приема
status – статус (информация о полученном сообщении)
error – код ошибки.

21. Функция замещающего приема – передачи сообщения:

int MPI_Sendrecv_replace(void *buf, int count,
MPI_Datatype datatype, int dest, int sendtag, int
source, int recvtag, MPI_Comm comm, MPI_Status
*status)

22.

Входные параметры:
count – количество передаваемых и принимаемых
элементов
datatype – тип данных
dest – номер (ранг) процесса - получателя
sendtag – номер (тег) передаваемого сообщения
source – номер (ранг) процесса - отправителя
recvtag – номер (тег) принимаемого сообщения
comm – идентификатор коммуникатора
Выходные параметры:
status – статус (информация о полученном сообщении)
error – код ошибки
buf – (входной и выходной) начальный адрес буфера
приема и передачи

23. Вопросы для обсуждения

Какие группы функций обмена сообщениями существуют в
MPI?
Какими атрибутами обладает в MPI каждое посылаемое
сообщение?
Как, не принимая сообщение, определить атрибуты
сообщения?
Что означает блокирующий обмен сообщениями?
Что означает асинхронный обмен сообщениями?
Можно ли сообщение, отправленное с помощью
блокирующей операции посылки, принять неблокирующей
операцией приема?
Что гарантирует блокировка при передаче/приеме
сообщений?

24.

Что означает завершение операции для различных режимах
передачи сообщения?
Можно ли в качестве тегов при посылке различных
сообщений в программе использовать одно и тоже число?
Как можно принять любое сообщение от любого процесса?
Как принимающий процесс может определить длину
полученного сообщения?
Можно ли при посылке сообщения использовать константы
MPI_ANY_TAG, MPI_ANY_SOURCE?
Может ли размер буфера приема быть меньше буфера
посылки?
Как избежать тупиковые ситуации при использовании
функций обмена?
English     Русский Rules