MPI обеспечивает возможность неблокированного выполнения операций передачи данных между двумя процессами. Наименование неблокирующих аналогов образуется из названий соответствующих функций путем добавления префикса I (Immediate).
Список параметров неблокирующих функций содержит весь набор параметров исходных функций и один дополнительный параметр request с типом MPI_Request (в функции MPI_Irecv отсутствует также параметр status):
int MPI_Isend (void *buf, int count, MPI_Datatype type, int dest,
int tag, MPI_Comm comm, MPI_Request *request)
int MPI_Issend (void *buf, int count, MPI_Datatype type, int dest,
int tag, MPI_Comm comm, MPI_Request *request)
int MPI_Ibsend (void *buf, int count, MPI_Datatype type, int dest,
int tag, MPI_Comm comm, MPI_Request *request)
int MPI_Irsend (void *buf, int count, MPI_Datatype type, int dest,
int tag, MPI_Comm comm, MPI_Request *request)
int MPI_Irecv (void *buf, int count, MPI_Datatype type, int source,
int tag, MPI_Comm comm, MPI_Request *request)
Вызов неблокирующей функции приводит к инициации запрошенной операции передачи, после чего выполнение функции завершается и процесс может продолжить свои действия. Перед своим завершением неблокирующая функция определяет переменную request, которая далее может использоваться для проверки завершения инициированной операции обмена.
|
|
Проверка состояния выполняемой неблокирующей операции передачи данных выполняется при помощи функции:
int MPI_Test (MPI_Request *request, int *flag, MPI_status *status),
где
- request - дескриптор операции, определенный при вызове неблокирующей
функции,
- flag - результат проверки (=true, если операция завершена),
- status - результат выполнения операции обмена (только для завершенной
операции).
Операция проверки является неблокирующей, т.е. процесс может проверить состояние неблокирующей операции обмена и продолжить далее свои вычисления, если по результатам проверки окажется, что операция все еще не завершена. Возможная схема совмещения вычислений и выполнения неблокирующей операции обмена может состоять в следующем:
MPI_Isend (buf,count,type,dest,tag,comm,&request);
…
do {
…
MPI_Test (&request,&flag,&status)
} while (!flag);
Если при выполнении неблокирующей операции окажется, что продолжение вычислений невозможно без получения передаваемых данных, то может быть использована блокирующая операция ожидания завершения операции:
int MPI_Wait (MPI_Request *request, MPI_status *status).
Кроме рассмотренных, MPI содержит ряд дополнительных функций проверки и ожидания неблокирующих операций обмена:
- MPI_Testall - проверка завершения всех перечисленных операций обмена,
- MPI_Waitall – ожидание завершения всех операций обмена,
- MPI_Testany - проверка завершения хотя бы одной из перечисленных
операций обмена,
- MPI_Waitany – ожидание завершения любой из перечисленных операций
обмена,
- MPI_Testsome - проверка завершения каждой из перечисленных операций
обмена,
- MPI_Waitsome - ожидание завершения хотя бы одной из перечисленных
операций обмена и оценка состояния по всем операциям.
В примере показан обмен ем сообщений между двумя соседями в топологии кольцо (Nearest neighbor exchange in ring topology).