2. MPI_*Send
int MPI_Send(void * buf, int count, MPI_Datatype
datatype, int dest, int tag, MPI_Comm comm)
[ IN buf] – адрес передаваемых данных
[ IN count] – количество передаваемых данных
[ IN datatype] – тип передаваемых данных
[ IN dest] – ранг процесса-получателя
[ IN tag] – тег передаваемых данных
[ IN comm] – коммуникатор
int MPI_Send – стандартный режим передачи сообщения
int MPI_Bsend – буферизация сообщения перед отправкой
int MPI_Ssend – синхронная отправка сообщения
int MPI_Rsend – отправка «по готовности»
3. MPI_Recv
int MPI_Recv(void * buf, int count, MPI_Datatype
datatype, int src, int tag, MPI_Comm comm, MPI_Status *
status)
[ OUT buf] – адрес буфера принимаемых данных
[ IN count] – количество принимаемых данных
[ IN datatype] – тип принимаемых данных
[ IN src] – ранг процесса, от которого принимаем
данные или MPI_RANK_ANY
[ IN tag] – тег принимаемых данных или MPI_TAG_ANY
[ IN comm] – коммуникатор
[ OUT status] – описание принятого сообщения
4. Deadlock
A B
MPI_Send(A) MPI_Send(B)
MPI_Recv(B) MPI_Recv(A)
?
5. Deadlock
A B
MPI_Bsend(A) MPI_Bsend(B)
MPI_Recv(B) MPI_Recv(A)
OK
6. Deadlock
A B
MPI_Ssend(A) MPI_Ssend(B)
MPI_Recv(B) MPI_Recv(A)
DEADLOCK
7. Deadlock
A B
MPI_Rsend(A) MPI_Rsend(B)
MPI_Recv(B) MPI_Recv(A)
FAIL
8. MPI_Isend
int MPI_Isend(void * buf, int count, MPI_Datatype
datatype, int dest, int tag, MPI_Comm comm,
MPI_Request * request)
[ IN buf] – адрес передаваемых данных
[ IN count] – количество передаваемых данных
[ IN datatype] – тип передаваемых данных
[ IN dest] – ранг процесса-получателя
[ IN tag] – тег передаваемых данных
[ IN comm] – коммуникатор
[ OUT request] – идентификатор асинхронной
операции
9. MPI_Irecv
int MPI_Irecv(void * buf, int count, MPI_Datatype datatype,
int src, int tag, MPI_Comm comm, MPI_Request * request)
[ OUT buf] – адрес буфера принимаемых данных
[ IN count] – количество принимаемых данных
[ IN datatype] – тип принимаемых данных
[ IN src] – ранг процесса, от которого принимаем данные
или MPI_RANK_ANY
[ IN tag] – тег принимаемых данных или MPI_TAG_ANY
[ IN comm] – коммуникатор
[ OUT request] – идентификатор асинхронной операции
10. MPI_Wait
int MPI_Wait(MPI_Request * request,
MPI_Status * status)
[ IN/OUT request] – идентификатор
асинхронной операции
[ OUT status] – статус принятого или
отправленного сообщения
MPI_Send = MPI_Isend + MPI_Wait
11. MPI_Test
int MPI_Test(MPI_Request * request, int * flag,
MPI_Status * status)
[ IN/OUT request] – идентификатор
асинхронной операции
[ OUT flag] – истина, если асинхронная
операция завершена
[ OUT status] – статус принятого или
отправленного сообщения
12. Пример использования
MPI_Isend()
flag = 1
MPI_Test(flag) ? Next step
flag = 0
Some work
13. MPI_Sendrecv
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)
[ IN sendbuf] – адрес буфера отправляемого сообщения
[ IN sendcount] – количество элементов отправляемого сообщения
[ IN sendtype] – тип элементов отправляемого сообщения
[ IN dest] – ранг процесса-получателя сообщения
[ IN sendtag] – тег отправляемого сообщения
[ OUT recvbuf] – адрес буфера принимаемого сообщения
[ IN recvcount] – количество элементов принимаемого сообщения
[ IN recvtype] – тип элементов принимаемого сообщения
[ IN source] – ранг процесса-отправителя принимаемого сообщения
[ IN recvtag] – тег принимаемого сообщения
[ IN comm] – коммуникатор
[ OUT status] – статус принятого сообщения
14. MPI_Sendrecv_replace
int MPI_Sendrecv(void * buf, int count, MPI_Datatype
datatype, int dest, int sendtag, int source, int recvtag,
MPI_Comm comm, MPI_Status * status)
[ IN/OUT buf] – адрес буфера отправляемого и
принимаемого сообщения
[ IN count] – количество элементов сообщений
[ IN datatype] – тип элементов сообщений
[ IN dest] – ранг процесса-получателя сообщения
[ IN sendtag] – тег отправляемого сообщения
[ IN source] – ранг процесса-отправителя принимаемого
сообщения
[ IN recvtag] – тег принимаемого сообщения
[ IN comm] – коммуникатор
[ OUT status] – статус принятого сообщения