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. Статусу пустого или неактивного запроса присваивается пустое значение.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.