60
ELSE
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
Эта программа будет успешной, даже если не будет буферного
пространства для данных. Операция стандартной передачи данных в
этом примере может быть заменена синхронной передачей.
Пример 3.7. Пример некорректного обмена сообщениями.
CALL MPI_COMM_RANK(comm, rank, ierr)
IF (rank.EQ.0) THEN
CALL MPI_RECV(recvbuf,count,MPI_REAL,1,tag, comm, status, ierr)
CALL MPI_SEND(sendbuf, count, MPI_REAL, 1, tag, comm, ierr)
ELSE
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
Операция приема первого процесса обязана завершиться перед его
посылкой и может завершиться только в том случае, если выполнена
соответствующая посылка второго процесса. Операция приема второ-
го процесса обязана завершиться перед его посылкой и может завер-
шиться только тогда, если выполнена соответствующая посылка пер-
вого процесса. Эта программа будет всегда в состоянии взаимного
блокирования.
Пример 3.8. Пример обмена: результат зависит от буферизации.
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)
! rank.EQ.1
ELSE
CALL MPI_SEND(sendbuf, count, MPI_REAL, 0, tag, comm, ierr)
CALL MPI_RECV(recvbuf,count,MPI_REAL, 0, tag, comm, status, ierr)
END IF
Сообщение, посланное каждым процессом, должно быть скопиро-
вано перед окончанием операции посылки и до старта операции
приема. Чтобы завершить программу, необходимо, чтобы по крайней
мере одно из двух сообщений было буферизовано. Значит, программа