21
Функция MPI_Isend начинает неблокиpующую операцию
передачи. Аргументы этой процедуры такие же, как у MPI_Send, с
добавлением
handle вслед за последним аргументом. Обе функции
(MPI_Send и MPI_Isend) ведут себя одинаково, за исключением того,
что в случае MPI_Isend, буфер с посылаемым сообщением не должен
модифицироваться до тех пор, пока сообщение не будет доставлено
(более точно, до завершения операции, что можно выяснить с
помощью процедур
MPI_Wait или MPI_Test). Причины такого
ограничения вполне понятны: в течение операции передачи данные не
должны изменяться. Параметр
handle имеет тип MPI_Request и
используется для того, чтобы определить, было ли сообщение
доставлено. Необходимая проверка осуществляется с помощью
функции
MPI_Test. Ниже представлен фрагмент кода,
иллюстрирующий такую операцию:
…
MPI_Isend(buffer,count,datatype,dest,tag,comm,request
)
//продолжаем вычисления. buffer не должен модифицироваться.
…
//дожидаемся конца пересылки
While(!flag){
MPI_Test(request, flag, status)
}
Здесь сначала выполняется операция неблокирующей посылки
данных, затем процесс, не дожидаясь окончания операции, продолжает
вычисления, после чего входит в цикл ожидания завершения операции.
Часто возникает необходимость ждать завершения передачи. В
этом случае вместо того, чтобы писать цикл с процедурой MPI_Test,
используемой в предыдущем примере, можно использовать
MPI_Wait:
MPI_Wait(request, status).
Процедура
MPI_Irecv начинает неблокирующую операцию
приема. Она имеет один дополнительный аргумент, handle, точно так
же, как
MPI_Isend. В то же время она имеет на один аргумент меньше:
status-аргумент, который используется для возврата информации по
окончанию приема, исключен из списка аргументов. Точно так же, как
для
MPI_Isend, для проверки завершения приема, начатого
MPI_Irecv, можно использовать
MPI_Test, а для ожидания
завершения такого приема
- MPI_Wait. Аргументы status этих двух