Прием сообщений
Для приема сообщения процесс-получатель должен выполнить функцию:
int MPI_Recv(void *buf, int count, MPI_Datatype type, int source, int tag, MPI_Comm comm, MPI_Status *status),
где
- buf, count, type — буфер памяти для приема сообщения, назначение каждого отдельного параметра соответствует описанию в MPI_Send;
- source — ранг процесса, от которого должен быть выполнен прием сообщения;
- tag — тег сообщения, которое должно быть принято для процесса;
- comm — коммуникатор, в рамках которого выполняется передача данных;
- status – указатель на структуру данных с информацией о результате выполнения операции приема данных.
Следует отметить:
- буфер памяти должен быть достаточным для приема сообщения. При нехватке памяти часть сообщения будет потеряна и в коде завершения функции будет зафиксирована ошибка переполнения; с другой стороны, принимаемое сообщение может быть и короче, чем размер приемного буфера, в таком случае изменятся только участки буфера, затронутые принятым сообщением;
- типы элементов передаваемого и принимаемого сообщения должны совпадать;
- при необходимости приема сообщения от любого процесса- отправителя для параметра source может быть указано значение MPI_ANY_SOURCE (в отличие от функции передачи MPI_Send, которая отсылает сообщение строго определенному адресату);
- при необходимости приема сообщения с любым тегом для параметра tag может быть указано значение MPI_ANY_TAG (опять-таки, при использовании функции MPI_Send должно быть указано конкретное значение тега);
- в отличие от параметров "процесс-получатель" и "тег", параметр "коммуникатор" не имеет значения, означающего "любой коммуникатор";
- параметр status позволяет определить ряд характеристик принятого сообщения:
- status.MPI_SOURCE — ранг процесса – отправителя принятого сообщения;
- status.MPI_TAG — тег принятого сообщения.
Приведенные значения MPI_ANY_SOURCE и MPI_ANY_TAG иногда называют джокерами.
Значение переменной status позволяет определить количество элементов данных в принятом сообщении при помощи функции:
int MPI_Get_count(MPI_Status *status, MPI_Datatype type, int *count),
где
- status — статус операции MPI_Recv;
- type — тип принятых данных;
- count — количество элементов данных в сообщении.
Вызов функции MPI_Recv не обязан быть согласованным со временем вызова соответствующей функции передачи сообщения MPI_Send – прием сообщения может быть инициирован до момента, в момент или после момента начала отправки сообщения.
По завершении функции MPI_Recv в заданном буфере памяти будет располагаться принятое сообщение. Принципиальный момент здесь состоит в том, что функция MPI_Recv является блокирующей для процесса-получателя, т.е. его выполнение приостанавливается до завершения работы функции. Таким образом, если по каким-то причинам ожидаемое для приема сообщение будет отсутствовать, выполнение параллельной программы будет блокировано.
Содержание раздела