Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции / lecture-5.ppt
Скачиваний:
0
Добавлен:
11.06.2024
Размер:
112.13 Кб
Скачать

Программирование в 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

Соседние файлы в папке Лекции