
- •Программирование в MPI
- •1.4.1 Асинхронная передача (стандартный буферизованный, синхронный, по готовности)
- •1.4.2 Асинхронный прием
- •1.Блокировки нет – выполнения процесса продолжается сразу после инициирования процесса отправки (во всех
- •1.4.3 Функции ожидания событий
- •Групповая функции ожидания событий
- •Пример программы асинхронного обмена сообщениями по кольцу
- •Еще групповые функции ожидания событий (используются редко)
- •1.4.4 Функции проверки событий
- •Пример программы-’’жужжалки’’. Необгон асинхронных сообщений
- •Другие функции проверки событий (используются редко)
- •1.4.5 Освобождение событий
- •Пример программы транспонирования матрицы (асинхронные обмены)
- •SUBROUTINE Transp(a,b,n,n1,size,rank) include 'mpif.h'
- •С Вывод исходной матрицы a и транспонированной b

Программирование в MPI
1. Операции “точка-точка”
1.4. Асинхронные (неблокирующие) функции
Почему эти функции бывают полезны
C Вычисление X |
C Заказ на прием X |
|
С в посылающем процессоре |
MPI_IRECV |
(X, …, IERR) |
X= … |
|
|
C Сразу выгодно начать отправку X |
… одновременно – вычисления … |
|
CALL MPI_ISEND (X, … ,IERR) |
C Необходимо принять Х до |
|
|
||
… одновременно – вычисления … |
использования |
|
C Ожидание по отправке |
C Использование X |
|
|
|
|
С – до записи в буфер отправки |
|
|
CALL MPI_WAIT (…) |
CALL MPI_WAIT (…) |
|
X = |
… = … X… |
|

1.4.1 Асинхронная передача (стандартный буферизованный, синхронный, по готовности)
MPI_ISEND MPI_IBSEND MPI_ISSEND MPI_IRSEND
(BUF,COUNT,DATATYPE,DEST,TAG,COMM, REQUEST, IERR) (BUF,COUNT,DATATYPE,DEST,TAG,COMM, REQUEST, IERR) (BUF,COUNT,DATATYPE,DEST,TAG,COMM, REQUEST, IERR) (BUF,COUNT,DATATYPE,DEST,TAG,COMM, REQUEST, IERR)
MPI_ISEND (BUF, COUNT, DATATYPE, DEST, TAG, COMM, REQUEST, IERR) INTEGER COUNT, DATATYPE, DEST, TAG, COMM, REQUEST , IERR
BUF |
- буфер передачи |
COUNT |
- состоящий из COUNT элементов (возможно=0) |
DATATYPE |
- типа DATATYPE |
DEST |
- передается процессу с номером DEST в коммуникаторе |
|
COMM |
TAG |
- с тэгом сообщения TAG |
COMM |
- коммуникатор взаимодействующих процессов |
REQUEST |
- MPI-объект, событие |
IERR |
- код ошибки |

1.4.2 Асинхронный прием
MPI_IRECV (BUF, COUNT, DATATYPE, SOURCE, TAG, COMM, REQUEST, IERR) INTEGER COUNT, DATATYPE, SOURCE, TAG, COMM, REQUEST , IERR
BUF |
- буфер приема |
COUNT |
- состоящий из COUNT элементов (возможно=0) |
DATATYPE |
- типа DATATYPE |
SOURCE |
- прием от процесса с номером SOURCE в коммуникаторе |
|
COMM |
TAG |
- с тэгом сообщения TAG |
COMM |
- коммуникатор взаимодействующих процессов |
REQUEST |
- MPI-объект, событие |
IERR |
- код ошибки |

1.Блокировки нет – выполнения процесса продолжается сразу после инициирования процесса отправки (во всех четырех функциях асинхронной отправки)
2.Согласование функций отправка-прием – свободное .
8 функций передачи сообщений (синхронные и асинхронные) +
2 функции приема сообщений (синхронные и асинхронные)
--- возможны любые комбинации пар (отправка, прием)

1.4.3 Функции ожидания событий
MPI_WAIT |
(REQUEST,STATUS,IERR) |
INTEGER REQUEST,STATUS(MPI_STATUS_SIZE),IERR |
|
REQUEST |
- MPI-объект, событие |
STATUS |
- статус сообщения |
IERR |
- код ошибки |
Блокирующая функция.
Ожидание завершения события REQUEST.
После завершения REQUEST = MPI_REQUEST_NULL
Значение STATUS определяется только для WAIT по отправке, для
WAIT по приему STATUS не определен.
Ожидание события при отправке:
-завершения переписи сообщения в буфер (MPI_ISEND, MPI_IBSEND)
-начала приема данных (MPI_ISEND, MPI_ISSEND)
Ожидание события при приеме:
- прием данных в приемный буфер (MPI_IRECV)

Групповая функции ожидания событий
MPI_WAITALL (COUNT,REQUESTS,STATUSES,IERR)
INTEGER COUNT, REQUESTS(*),STATUSES(MPI_STATUS_SIZE,*),IERR
COUNT |
- ожидание завершения COUNT событий |
REQUESTS |
- по массиву MPI-событий |
STATUSES |
- массив статусов сообщений |
IERR |
- код ошибки |
Блокирующая функция.
Ожидание завершения всех события массива REQUESTS. После завершения REQUESTS(i) = MPI_REQUEST_NULL
Значение STATUSES определяется только для WAIT по отправке, для
WAIT по приему STATUSES не определен.
Ожидание события при отправке:
-завершения переписи сообщения в буфер (MPI_ISEND, MPI_IBSEND)
-начала приема данных (MPI_ISEND, MPI_ISSEND)
Ожидание события при приеме:
- прием данных в приемный буфер (MPI_IRECV)

Пример программы асинхронного обмена сообщениями по кольцу
PROGRAM Example5 include 'mpif.h‘
INTEGER ERR, RANK, SIZE, PREV, NEXT, BUF(2) INTEGER STATUSES(MPI_STATUS_SIZE,4), REQS(4)
CСтандартное начало MPI - программы CALL MPI_INIT (ERR)
CALL MPI_COMM_RANK (MPI_COMM_WORLD,RANK,ERR) CALL MPI_COMM_SIZE (MPI_COMM_WORLD,SIZE,ERR) PREV = RANK – 1
NEXT = RANK + 1
IF (RANK .EQ. 0) PREV = SIZE – 1 IF (RANK .EQ. SIZE-1) NEXT = 0
CALL MPI_IRECV(BUF(1),1,MPI_INTEGER,PREV,5, MPI_COMM_WORLD, REQS(1), ERR) CALL MPI_IRECV(BUF(2),1,MPI_INTEGER,NEXT,6, MPI_COMM_WORLD, REQS(2), ERR)
CALL MPI_ISEND(RANK,1,MPI_INTEGER,PREV,6, MPI_COMM_WORLD, REQS(3), ERR) CALL MPI_ISEND(RANK,1,MPI_INTEGER,NEXT,5, MPI_COMM_WORLD, REQS(4), ERR)
CALL MPI_WAITALL(4, REQS, STATUSES, ERR)
WRITE (* , *) ' Process ‘, RANK, ' prev = ', BUF(1), ' next = ', BUF(2)
CALL MPI_FINALIZE(ERR)
END
Что изменится, если тэги будут равны 5 во всех функциях

Еще групповые функции ожидания событий (используются редко)
MPI_WAITANY (COUNT,REQUESTS,INDEX,STATUS,IERR)
INTEGER COUNT, REQUESTS(*),INDEX, STATUS(MPI_STATUS_SIZE,*),IERR
COUNT |
- ожидание завершения любого из COUNT событий |
REQUESTS |
- по массиву MPI-событий |
INDEX |
- индекс в массиве REQUESTS, указывающий на завершенное |
|
событие |
STATUS |
- статус сообщения |
IERR |
- код ошибки |
Блокирующая функция.
Ожидание завершения любого (одного) события массива REQUESTS, если завершилось несколько – выбирается случайным образом.
Значение STATUS определяется только для WAIT по отправке, для
WAIT по приему STATUS не определен.
MPI_WAITSOME (INCOUNT,REQUESTS,OUTCOUNT,INDEXES,STATUSES,IERR) Блокирующая функция.
Ожидание завершения хотя бы одного (возможно нескольких) события

1.4.4 Функции проверки событий
MPI_TEST |
(REQUEST,FLAG,STATUS,IERR) |
INTEGER REQUEST,STATUS(MPI_STATUS_SIZE),IERR |
|
LOGICAL FLAG |
|
REQUEST |
- MPI-объект, событие |
FLAG |
- .TRUE. если операция обмена завершена, |
.FALSE. если операция обмена не завершена |
|
STATUS |
- статус сообщения |
IERR |
- код ошибки |
Неблокирующая функция. Если операция обмена завершена, то REQUEST = MPI_REQUEST_NULL .
Значение STATUS определяется только для WAIT по отправке, для WAIT по приему STATUS не определен.

Пример программы-’’жужжалки’’. Необгон асинхронных сообщений
PROGRAM Example6
include 'mpif.h‘
INTEGER ERR, RANK, SIZE, Req1, Req2, a(20), b LOGICAL Flag1, Flag2
CALL MPI_INIT (ERR)
CALL MPI_COMM_RANK (MPI_COMM_WORLD,RANK,ERR)
CALL MPI_COMM_SIZE (MPI_COMM_WORLD,SIZE,ERR)
Flag1 = .FALSE.
Flag2 = .FALSE.
IF (RANK .EQ. 0) THEN
CALL MPI_ISEND(a,20,MPI_INTEGER,1,0, MPI_COMM_WORLD, REQ1, ERR) CALL MPI_ISEND(b,1,MPI_INTEGER, 1,0, MPI_COMM_WORLD, REQ2, ERR) WHILE (.NOT. (Flag1 .AND. Flag2) ) DO
IF(.NOT. Flag1) CALL MPI_TEST(REQ1, STATUS, ERR)
IF(.NOT. Flag2) CALL MPI_TEST(REQ2, STATUS, ERR) ENDDO
ELSE
CALL MPI_IRECV(a,20,MPI_INTEGER,0,0, MPI_COMM_WORLD, REQ1, ERR) CALL MPI_IRECV(b,1,MPI_INTEGER, 0,0, MPI_COMM_WORLD, REQ2, ERR) WHILE (.NOT. (Flag1 .AND. Flag2) ) DO
IF(.NOT. Flag1) CALL MPI_TEST(REQ1, STATUS, ERR)
IF(.NOT. Flag2) CALL MPI_TEST(REQ2, STATUS, ERR) ENDDO
ENDIF
WRITE (* , *) ' Process ‘, RANK, ' is ready '
CALL MPI_FINALIZE(ERR)
END