ПАРАЛЛЕЛЬНОЕ ПРОГРАММИРОВАНИЕ
54
Прием сообщения с идентификатором
msgtag
от процесса
source
с блокиров-
кой. Число элементов в принимаемом сообщении не должно превосходить значения
count
. Если число принятых элементов меньше значения
count
, то гарантируется, что
в буфере
buf
изменятся только элементы, соответствующие элементам принятого
сообщения. Если нужно узнать точное число элементов в сообщении, то можно вос-
пользоваться подпрограммой
MPI_Probe
.
Блокировка гарантирует, что после возврата из подпрограммы все элементы
сообщения приняты и расположены в буфере
buf
.
В качестве номера процесса-отправителя можно указать предопределенную
константу
MPI_ANY_SOURCE
- признак того, что подходит сообщение от любого
процесса. В качестве идентификатора принимаемого сообщения можно указать кон-
станту
MPI_ANY_TAG
- признак того, что подходит сообщение с любым идентифи-
катором.
Если процесс посылает два сообщения другому процессу и оба эти сообщения
соответствуют одному и тому же вызову
MPI_Recv
, то первым будет принято то
сообщение, которое было отправлено раньше.
Прием/передача сообщений без блокировки
int MPI_Isend(void *buf, int count, MPI_Datatype datatype, int
dest, int msgtag, MPI_Comm comm, MPI_Request *request)
•
buf
- адрес начала буфера посылки сообщения;
•
count
- число передаваемых элементов в сообщении;
•
datatype
- тип передаваемых элементов;
•
dest
- номер процесса-получателя;
•
msgtag
- идентификатор сообщения;
•
comm
- идентификатор группы;
•
OUT
request
- идентификатор асинхронной передачи.
Передача сообщения аналогична
MPI_Send,
однако возврат из подпрограммы
происходит сразу после инициализации процесса передачи без ожидания обработки
всего сообщения, находящегося в буфере
buf
. Это означает, что нельзя повторно
использовать данный буфер для других целей без получения дополнительной ин-
формации о завершении данной посылки. Окончание процесса передачи (т.е. того
момента, когда можно переиспользовать буфер
buf
без опасения испортить переда-
ваемое сообщение) можно определить с помощью параметра
request
и процедур
MPI_Wait
и
MPI_Test.
Сообщение, отправленное любой из процедур
MPI_Send
и
MPI_Isend
, может быть принято любой из процедур
MPI_Recv
и
MPI_Irecv.