Введение в параллельные вычисления. Технология программирования MPI (день третий) Антонов Александр Сергеевич, к.ф.-м.н., н.с. лаборатории Параллельных информационных технологий НИВЦ МГУ
MPI MPI_ISEND(BUF, COUNT, DATATYPE, DEST, MSGTAG, COMM, REQUEST, IERR) BUF(*) INTEGER COUNT, DATATYPE, DEST, MSGTAG, COMM, REQUEST, IERR Неблокирующая посылка сообщения. Возврат из функции происходит сразу после инициализации передачи. Переменная REQUEST идентифицирует пересылку.
MPI Модификации функции MPI_ISEND: MPI_IBSEND передача сообщения с буферизацией. MPI_ISSEND передача сообщения с синхронизацией. MPI_IRSEND передача сообщения по готовности.
MPI MPI_IRECV(BUF, COUNT, DATATYPE, SOURCE, MSGTAG, COMM, REQUEST, IERR) BUF(*) INTEGER COUNT, DATATYPE, SOURCE, MSGTAG, COMM, REQUEST, IERR Неблокирующий прием сообщения. Возврат из функции происходит сразу после инициализации передачи. Переменная REQUEST идентифицирует пересылку.
MPI Сообщение, отправленное любой из функций MPI_SEND, MPI_ISEND и любой из трех их модификаций, может быть принято любой из процедур MPI_RECV и MPI_IRECV. До завершения неблокирующей операции не следует записывать в используемый массив данных!
MPI MPI_IPROBE(SOURCE, MSGTAG, COMM, FLAG, STATUS, IERR) LOGICAL FLAG INTEGER SOURCE, MSGTAG, COMM, IERR, STATUS(MPI_STATUS_SIZE) Получение информации о структуре ожидаемого сообщения без блокировк и. FLAG возвращает значение.TRUE., если сообщение с подходящими атрибутами уже может быть принято.
MPI MPI_WAIT(REQUEST, STATUS, IERR) INTEGER REQUEST, IERR, STATUS(MPI_STATUS_SIZE) Ожидание завершения асинхронной операции, ассоциированной с идентификатором REQUEST. Для неблокирующего приема определ яется параметр STATUS. REQUEST устанавливается в значение MPI_REQUEST_NULL.
MPI MPI_WAITALL(COUNT, REQUESTS, STATUSES, IERR) INTEGER COUNT, REQUESTS(*), STATUSES(MPI_STATUS_SIZE,*), IERR Ожидание завершения COUNT асинхронн ых операци й, ассоциированн ых с идентификатор ами REQUESTS. Для неблокирующих приемов определ яются параметры в массиве STATUSES.
MPI prev = rank - 1 next = rank + 1 if (rank.eq. 0) prev = numtasks - 1 if (rank.eq. numtasks - 1) next = 0 call MPI_IRECV(buf(1), 1, MPI_INTEGER, & prev, tag1, MPI_COMM_WORLD, reqs(1), & ierr) call MPI_IRECV(buf(2), 1, MPI_INTEGER, & next, tag2, MPI_COMM_WORLD, reqs(2), & ierr)
MPI call MPI_ISEND(rank, 1, MPI_INTEGER, & prev, tag2, MPI_COMM_WORLD, reqs(3), & ierr) call MPI_ISEND(rank, 1, MPI_INTEGER, & next, tag1, MPI_COMM_WORLD, reqs(4), & ierr) call MPI_WAITALL(4, reqs, stats, ierr);
MPI MPI_WAITANY(COUNT, REQUESTS, INDEX, STATUS, IERR) INTEGER COUNT, REQUESTS(*), INDEX, STATUS(MPI_STATUS_SIZE), IERR Ожидание завершения одной из COUNT асинхронн ых операци й, ассоциированн ых с идентификатор ами REQUESTS. Для неблокирующего приема определ яется параметр STATUS.
MPI Если к моменту вызова завершились несколько из ожидаемых операций, то случайным образом будет выбрана одна из них. Параметр INDEX содержит номер элемента в массиве REQUESTS, содержащего идентификатор завершенной операции.
MPI MPI_WAITSOME(INCOUNT, REQUESTS, OUTCOUNT, INDEXES, STATUSES, IERR) INTEGER INCOUNT, REQUESTS(*), OUTCOUNT, INDEXES(*), IERR, STATUSES(MPI_STATUS_SIZE,*) Ожидание завершения хотя бы одной из INCOUNT асинхронн ых операци й, ассоциированн ых с идентификатор ами REQUESTS.
MPI Параметр OUTCOUNT содержит число завершенных операций, а первые OUTCOUNT элементов массива INDEXES содержат номера элементов массива REQUESTS с их идентификаторами. Первые OUTCOUNT элементов массива STATUSES содержат параметры завершенных операций (для неблокирующих приемов).
MPI MPI_TEST(REQUEST, FLAG, STATUS, IERR) LOGICAL FLAG INTEGER REQUEST, IERR, STATUS(MPI_STATUS_SIZE) Проверка завершен ности асинхронной операции, ассоциированной с идентификатором REQUEST. В параметре FLAG возвращает ся значение.TRUE., если операция завершена.
MPI MPI_TESTALL(COUNT, REQUESTS, FLAG, STATUSES, IERR) LOGICAL FLAG INTEGER COUNT, REQUESTS(*), STATUSES(MPI_STATUS_SIZE,*), IERR Проверка завершен ности COUNT асинхронн ых операци й, ассоциированн ых с идентификатор ами REQUESTS.
MPI MPI_TESTANY(COUNT, REQUESTS, INDEX, FLAG, STATUS, IERR) LOGICAL FLAG INTEGER COUNT, REQUESTS(*), INDEX, STATUS(MPI_STATUS_SIZE), IERR В параметре FLAG возвращает ся значение.TRUE., если хотя бы одна из операций асинхронного обмена завершена.
MPI MPI_TESTSOME(INCOUNT, REQUESTS, OUTCOUNT, INDEXES, STATUSES, IERR) INTEGER INCOUNT, REQUESTS(*), OUTCOUNT, INDEXES(*), IERR, STATUSES(MPI_STATUS_SIZE,*) Аналог MPI_WAITSOME, но возврат происходит немедленно. Если ни одна из операций не завершилась, то значение OUTCOUNT будет равно нулю.