Источник или тэг принимаемого сообщения могут быть неизвестны, если в операции приема были использованы значения типа ANY. Если множественные запросы завершаются единственной функцией MPI (см. раздел 3.7.5), может потребоваться возвратить различные коды ошибок для каждого запроса. Эта информация возвращается с помощью аргумента status операции MPI_RECV. Тип аргумента status определяется MPI. Статусные переменные размещаются пользователем явно, то есть они не являются системными объектами.
В языке Си status - это структура, которая содержит три поля,
называемые MPI_SOURCE, MPI_TAG и MPI_ERROR; структура
может содержать дополнительные поля. Следовательно,
status.MPI_SOURCE, status.MPI_TAG и status.MPI_ERROR
содержат источник, тэг и код ошибки принятого сообщения.
В языке ФОРТРАН status - массив целых значений размера
MPI_STATUS_SIZE. Константы
MPI_SOURCE, MPI_TAG
и MPI_ERROR определяют объекты, которые хранят поля источника, тэга и
ошибки. Следовательно, status(MPI_SOURCE), status(MPI_TAG)
и status(MPI_ERROR) содержат соответственно источник, тэг и код
ошибки принимаемого сообщения.
В общем случае вызовы передачи сообщений не модифицируют значения полей кода ошибки статусных переменных. Эти поля могут быть изменены только функциями из раздела 3.7.5, которые возвращают множественные статусы. Поля изменяются, если и только если такая функция возвращает код ошибки MPI_ERR_IN_STATUS.
Объяснение: Поле ошибки в статусе не является необходимым для вызовов, которые возвращают только один статус, например, для таких вызовов, как MPI_WAIT, так как это приведет только к дублированию информации, возвращаемой функцией. Эти поля нужны для вызовов, которые возвращают множественные статусы, поскольку каждое требование могло иметь свою причину отказа.[]
Статусный аргумент также возвращает информацию о длине принятого сообщения. Однако, эта информация не является доступной непосредственно, как поле статусной переменной, и требуется вызов MPI_GET_COUNT, чтобы ``декодировать'' эту информацию.
Синтаксис функции MPI_GET_COUNT представлен ниже.
MPI_GET_COUNT(status, datatype, count)
IN | status | возвращает статус операции приема (статус) | |
IN | datatype | тип данных каждого элемента приемного буфера (дескриптор) | |
OUT | count | количество полученных элементов (целое) |
int MPI_Get_count(MPI_Status *status, MPI_Datatype datatype, int *count)
MPI_GET_COUNT(STATUS, DATATYPE, COUNT, IERROR)
INTEGER STATUS(MPI_STATUS_SIZE), DATATYPE, COUNT, IERROR
int Status::Get_count(const MPI::Datatype& datatype) const
Операция MPI_GET_COUNT возвращает число полученных элементов. Аргумент datatype следует сопоставлять с аргументом из операции приема, которая устанавливает статусную переменную. (Позже в разделе 3.12.5 будет показано, что MPI_GET_COUNT может возвращать в определенных ситуациях значение MPI_UNDEFINED.)
Объяснение: Некоторые библиотеки для передачи сообщений используют аргументы INOUT count, tag и sourse. Это позволяет выбирать критерии селекции для входящих сообщений, и возвращать текущие значения атрибутов принятого сообщения. Использование отдельного статусного аргумента предупреждает ошибки, которые часто возникают при использовании аргумента INOUT (то есть при использовании константы MPI_ANY_TAG как тэга при приеме). Некоторые библиотеки используют вызовы, которые неявно обращаются к ``последнему принятому сообщению''.
Аргумент datatype передается в MPI_GET_COUNT, чтобы улучшить характеристики обмена. Сообщение может быть получено без подсчета числа элементов, которое оно содержит, и этот подсчет часто не нужен. Становится возможным использовать ту же самую функцию после вызова MPI_PROBE.[]
Все операции посылки и приема используют аргументы buf, count, datatype, source, dest, tag, comm иstatus таким же образом, как и блокирующие операции MPI_SEND иMPI_RECV, описанные в этом разделе.