next up previous contents
Next: Соответствие типов данных и Up: Операции блокирующей передачи и Previous: Блокирующий прием   Contents

Возвращаемая статусная информация

Источник или тэг принимаемого сообщения могут быть неизвестны, если в операции приема были использованы значения типа 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, описанные в этом разделе.



Alex Otwagin 2002-12-10