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

Содержание

Слайд 2

Варианты обмена 1) Двухточечный обмен (point – to - point): участвуют

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

1) Двухточечный обмен (point – to - point): участвуют два

процесса процесс-отправитель (источник) и процесс-получатель (адресат).
2) Коллективный обмен: участвуют все процессы коммуникатора.
Слайд 3

Виды функций обмена функции с блокировкой (с синхронизацией): вызывающий процесс блокируется,

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

функции с блокировкой (с синхронизацией):
вызывающий процесс блокируется, пока операция

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

подразумевают совмещение операций об- мена с другими операциями, т.е. только инициируют

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

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

Режимы передачи сообщения В MPI существует четыре режима обмена, различающиеся условия

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

В 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 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

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

Блокирующая синхронная передача сообщения:
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

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

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

Слайд 11

Буфферизованная блокирующая передача сообщения int MPI_Bsend(void *buf, int count, MPI_Datatype datatype,

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

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_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

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

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_SOURCE), а в операции передачи

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

Слайд 16

Функция определения размера сообщения: Int MPI_Get_count(MPI_Status *status, MPI_Datatype datatype, int *count)

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

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,

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

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 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 – количество

Входные параметры:
sendbuf – начальный адрес буфера передачи
sendcount – количество элементов в

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

Функция замещающего приема – передачи сообщения: int MPI_Sendrecv_replace(void *buf, int count,

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

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 –

Входные параметры:
count – количество передаваемых и принимаемых элементов
datatype – тип данных
dest

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

Вопросы для обсуждения Какие группы функций обмена сообщениями существуют в MPI?

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

Какие группы функций обмена сообщениями существуют в MPI?
Какими атрибутами

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