next up previous contents
Next: Неразрушающая проверка status Up: Обработка MPI_Status Previous: Обработка MPI_Status   Contents

Передача MPI_STATUS_IGNORE для Status

Каждый вызов MPI_RECV включает аргумент status, в котором система может возвращать подробности относительно полученного сообщения. Имеется также ряд других вызовов MPI, особенно в MPI-2, где возвращен status. Объект типа MPI_STATUS не является MPI непрозрачным объектом; его структура объявлена в mpi.h и mpif.h, и он существует в программе пользователя. Во многих случаях, прикладные программы созданы так, что им не нужно исследовать поля status. В этих случаях пользователю не нужно разбирать объект состояния, и это особенно расточительно для реализации MPI - заполнять поля в этом объекте.

Чтобы справиться с этой проблемой, есть две предопределенные константы MPI_STATUS_IGNORE и MPI_STATUSES_IGNORE, которые при передаче в функции получить, ждать или проверить сообщают реализации, что поля состояния не должны быть заполнены. Обратите внимание, что MPI_STATUS_IGNORE не является специальным типом объекта MPI_STATUS; скорее, это - специальное значение для аргумента. В Си можно было бы ожидать, что это будет NULL, а не адрес специального MPI_STATUS.

MPI_STATUS_IGNORE и массивная версия MPI_STATUSES_IGNORE может использоваться всюду, где аргумент состояния передают в функцию получить, ждать или проверить. MPI_STATUS_IGNORE не может использоваться, когда состояние является аргументом IN. Обратите внимание, что в языке ФОРТРАН MPI_STATUS_IGNORE и MPI_STATUSES_IGNORE являются объектами подобными MPI_BOTTOM (не пригодный для инициализации или назначения). См. Раздел 2.5.4.

Вообще, эта оптимизация может обращаться ко всем функциям, для которых status или массив statuses является аргументом OUT. Обратите внимание, что это преобразовывает status в аргумент INOUT. Функции, которые могут передавать MPI_STATUS_IGNORE, являются различными формами MPI_RECV, MPI_TEST и MPI_WAIT, а также MPI_REQUEST_GET_STATUS. Когда массив передается, как в функциях ANY и ALL, отдельная константа, MPI_STATUSES_IGNORE передается для аргумента массива. Это возможно для функции MPI, чтобы возвратить MPI_ERR_IN_STATUS даже тогда, когда MPI_STATUS_IGNORE или MPI_STATUSES_IGNORE переданы в эту функцию.

MPI_STATUS_IGNORE и MPI_STATUSES_IGNORE не требуют иметь те же самые значения в языках Си и ФОРТРАН.

Они не позволяют иметь некоторые из состояний в массиве состояний для функций _ANY и _ALL; установить MPI_STATUS_IGNORE; один или определяет игнорирование всех состояний в таком вызове с MPI_STATUSES_IGNORE, или ни в одном из них, передавая нормальные состояния во всех позициях в массиве состояний.

Нет никаких привязок С++ для MPI_STATUS_IGNORE или MPI_STATUSES_IGNORE. Чтобы позволять OUT или INOUT аргументу MPI::Status игнорироваться, все MPI привязки С++, которые имеют OUT или INOUT параметры MPI::Status, перегружены второй версией, которая опускает OUT или INOUT параметр MPI::Status.

Пример 4.6 Привязки С++ для MPI_PROBE:

void MPI::Comm::Probe(int source, int tag, MPI::Status& status) const void MPI::Comm::Probe(int source, int tag) const



Alex Otwagin 2002-12-10