Similar presentations:
Обмен сообщениями в 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_Datatypedatatype, 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_Commcomm, 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?
Может ли размер буфера приема быть меньше буфера
посылки?
Как избежать тупиковые ситуации при использовании
функций обмена?