100
C:
int MPI_Probe(int source, int tag, MPI_Comm comm, MPI_Status
*status)
FORTRAN:
MPI_PROBE(SOURCE, TAG, COMM, STATUS, IERROR)
INTEGER SOURCE, TAG, COMM, STATUS(MPI_STATUS_SIZE),
IERROR
IN source – номер процесса-отправителя;
IN tag – идентификатор сообщения;
IN comm – коммуникатор;
OUT status – атрибуты опрошенного сообщения.
Подпрограмма MPI_Probe выполняется с блокировкой, поэтому
завершится она лишь тогда, когда сообщение с подходящим
идентификатором и номером процесса-отправителя будет доступно для
получения. Атрибуты этого сообщения возвращаются в переменной
status. Следующий за MPI_Probe вызов MPI_Recv с теми же
атрибутами сообщения (номером процесса-отправителя, идентификатором
сообщения и коммуникатором) поместит в буфер приема именно то
сообщение, наличие которого было опрошено подпрограммой
MPI_Probe.
При использовании блокирующего режима передачи сообщений
существует потенциальная опасность возникновения тупиковых ситуаций,
в которых операции обмена данными блокируют друг друга. Приведем
пример некорректной программы, которая будет зависать при любых
условиях.
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 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
В этом примере оба процесса (0-й и 1-й) входят в режим взаимного
ожидания сообщения друг от друга. Такие тупиковые ситуации будут