101
возникать всегда при образовании циклических цепочек блокирующих
операций чтения.
Приведем вариант правильной программы.
CALL MPI_COMM_RANK(comm, rank, ierr)
IF (rank.EQ.0) THEN
CALL MPI_SEND(sendbuf, count, MPI_REAL, 1, tag, comm, ierr)
CALL MPI_RECV(recvbuf, count, MPI_REAL, 1, tag, comm, status, ierr)
ELSE IF (rank.EQ.1) THEN
CALL MPI_RECV(recvbuf, count, MPI_REAL, 0, tag, comm, status, ierr)
CALL MPI_SEND(sendbuf, count, MPI_REAL, 0, tag, comm, ierr)
END IF
Другие комбинации операций SEND/RECV могут работать или не
работать в зависимости от реализации MPI (буферизованный обмен или
нет).
В ситуациях, когда требуется выполнить взаимный обмен данными
между процессами, безопаснее использовать совмещенную операцию
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,
MPI_Datatype recvtag, MPI_Comm comm,
MPI_Status *status)
FORTRAN:
MPI_SENDRECV(SENDBUF, SENDCOUNT, SENDTYPE, DEST,
SENDTAG, RECVBUF, RECVCOUNT, RECVTYPE, SOURCE,
RECVTAG, COMM, STATUS, IERROR)
<type> SENDBUF(*), RECVBUF(*)
INTEGER SENDCOUNT, SENDTYPE, DEST, SENDTAG,
RECVCOUNT, RECVTYPE, SOURCE, RECVTAG, COMM,
STATUS(MPI_STATUS_SIZE), IERROR
IN sendbuf – адрес начала расположения посылаемого сообщения;
IN sendcount – число посылаемых элементов;
IN sendtype – тип посылаемых элементов;
IN dest – номер процесса-получателя;
IN sendtag – идентификатор посылаемого сообщения;
OUT recvbuf – адрес начала расположения принимаемого сообщения;
IN recvcount – максимальное число принимаемых элементов;
IN recvtype – тип элементов принимаемого сообщения;
IN source – номер процесса-отправителя;