Параллельное программирование: Учебное пособие, страница 98

int MPI_Wait(MPI_Request *request, MPI_Status *status)

Входной параметр request является идентификатором операции обмена, а выходной параметр status — идентификатором данных о состоянии выполняемой операции. Аргументом status возвращается информация о выполненной операции, которую можно получить, вызвав подпрограмму MPI_Test_cancelled. Можно вызвать MPI_Wait с пустым или неактивным аргументом request. В этом случае операция с пустым статусом завершается сразу же.

Успешное выполнение подпрограммы MPI_Wait после вызова MPI_Ibsend подразумевает, что буфер передачи можно использовать вновь, то есть пересылаемые данные отправлены или скопированы в буфер, выделенный при вызове подпрограммы MPI_Buffer_attach. В этот момент уже нельзя отменить передачу. Если не будет зарегистрирован соответствующий прием, буфер нельзя будет освободить. В этом случае можно применить подпрограмму MPI_Cancel, которая освобождает память, выделенную подсистеме коммуникаций.

Подпрограмма MPI_Test выполняет неблокирующую проверку завершения приема или передачи сообщения:

int MPI_Test(MPI_Request *request, int *flag,

MPI_Status *status)

Ее входным параметром является идентификатор операции обмена request. Выходной параметр flag примет значение true, если операция, заданная идентификатором request, выполнена, а параметр status — предоставит информацию о состоянии выполненной операции.

Если при вызове MPI_Test используется пустой или неактивный аргумент request, то операция возвращает значение флага true и пустой статус. Функции MPI_Wait и MPI_Test можно использовать для завершения операций приема и передачи.

В том случае, когда сразу несколько процессов обмениваются сообщениями, можно использовать проверки, которые применяются одновременно к нескольким обменам. Есть три типа таких проверок:

·  проверка завершения всех обменов;

·  проверка завершения любого обмена из нескольких;

·  проверка завершения заданного обмена из нескольких.

Каждая проверока имеет две разновидности — wait (ожидание) и test (проверка).

Первая проверка осуществляется подпрограммой MPI_Waitall. Она блокирует выполнение проверяющего процесса до тех пор, пока все операции обмена, связанные с активными запросами, находящимися в массиве requests, не будут выполнены, после чего возвращает в массиве statuses состояния этих операций:

int MPI_Waitall(int count, MPI_Request *requests[],

MPI_Status *statuses[])

Значением параметра count является количество запросов на обмен, которое определяет размер массивов requests и statuses.

После выполнения подпрограммы MPI_Waitall все запросы, сформированные неблокирующими операциями обмена, удаляются путем присваиваивания соответствующим элементам массива значений константы MPI_REQUEST_NULL. Если список содержит пустые или неактивные запросы, то для каждого из них устанавливается пустое значение статуса.

В случае неуспешного выполнения одной или более операций обмена подпрограмма  MPI_Waitall  возвращает код ошибки в виде константы mpi_err_in_status и присваивает полю ошибки статуса значение кода ошибки соответствующей операции. Если операция выполнена успешно, то этому полю присваивается значение MPI_SUCCESS (success – успех), а если не выполнена, но и ошибки не было, то присваивается значение MPI_ERR_PENDING (pending – ожидающий). Последний случай соответствует наличию запросов на выполнение операции обмена, ожидающих обработки.

Неблокирующая проверка завершения всех процессов выполняется при обращении к подпрограмме MPI_Testall. Она возвращает значение флага flag = true, если все обмены (count), связанные с активными запросами в массиве requests, выполнены. Если завершены не все обмены, то флагу присваивается значение false, а массив statuses не определен:

int MPI_Testall(int count, MPI_Request *requests[],

int *flag, MPI_Status *statuses[])

Каждому статусу активного запроса присваивается значение статуса соответствующего обмена. Если запрос был сформирован операцией неблокирующего обмена, то он аннулируется путем присваивания его элементу в массиве statuses значения MPI_REQUEST_NULL. Статусу пустого или неактивного запроса присваивается пустое значение.