- •Программирование в MPI
- •1. Операции “точка-точка”
- •Примеры оператора отправки сообщений
- •1.2 Прием с блокировкой
- •Информация о пришедшем сообщении:
- •Примеры оператора приема сообщений
- •Пример простой программы с обменом сообщениями
- •Что это означает.
- •Схема использования памяти при передаче сообщений
- •Таким образом,
- •Пример 1.
- •Пример 2. IF(my_rank.eq.0) THEN
- •Пример 3. IF(my_rank.eq.0) THEN
- •Что это означает.
- •Что это означает.
- •Соответствие типов данных отправки и приема и преобразование данных
- •Пример 1. IF(my_rank.eq.0) THEN
- •Пример 2.
- •Пример 3.
- •Еще раз о типах и режимах функций
- •Написать программу для n процессоров, в которой:
Программирование в MPI
Сообщение Атрибуты сообщения
–это набор данных
–номер отправителя, номер получателя, тип данных, тэг
Передача сообщений между 2 процессами (операции типа точка-точка) Передача сообщений между многими процессами (групповые операции) Блокированные – неблокированные Каждая передающая функция, кроме того, в режимах :
буферизованный, с синхронизацией, по готовости
стандартный (настраиваемый системой)
1. Операции “точка-точка”
1.1 Передача с блокировкой (стандартный режим)
Блокировка – приостановка выполнения процесса до выполнения некоторого условия
MPI_SEND (BUF, COUNT, DATATYPE, DEST, TAG, COMM, IERR) INTEGER COUNT, DATATYPE, DEST, TAG, COMM, IERR
BUF |
- буфер передачи |
COUNT |
- состоящий из COUNT элементов (возможно=0) |
DATATYPE |
- типа DATATYPE |
DEST |
- передается процессу с номером DEST в коммуникаторе |
|
COMM |
TAG |
- с тэгом сообщения TAG |
COMM |
- коммуникатор взаимодействующих процессов |
IERR |
- код ошибки |
Примеры оператора отправки сообщений
CALL MPI_SEND (A, 1, MPI_INTEGER, 1, 12, MPI_COMM_WORLD , IERR)
CALL MPI_SEND (B(I, J), 15, MPI_REAL, 1, 12, MPI_COMM_WORLD , IERR)
DOUBLE PRECISION B (100,200)
…
CALL MPI_SEND(B,20000,MPI_DOUBLE_PRECISION,1,12, MPI_COMM_WORLD,IER
DOUBLE PRECISION B (n, m)
…
CALL MPI_SEND (B, n * m, MPI_DOUBLE_PRECISION, k, I + j, MPI_COMM_WORLD, IERR)
1.2 Прием с блокировкой
MPI_RECV(BUF,COUNT,DATATYPE,SOURCE,TAG,COMM,STATUS,IERR)
INTEGER COUNT,DATATYPE,SOURCE,TAG,COMM,
STATUS(MPI_STATUS_SIZE),IERR
BUF |
- буфер приема |
COUNT |
- состоящий из COUNT элементов |
DATATYPE- типа DATATYPE |
|
SOURCE |
- от процесса с номером SOURCE в коммуникаторе |
COMM |
- возможен MPI_ANY_SOURCE – от любого из COMM |
|
|
TAG |
- с тэгом сообщения TAG |
|
- возможен MPI_ANY_TAG – с любым тегом |
COMM |
- коммуникатор взаимодействующих процессов |
STATUS |
- статус сообщения - информация о пришедшем |
сообщении |
|
IERR |
- код ошибки |
Информация о пришедшем сообщении:
STATUS(MPI_SOURCE) – от кого, или неопределенно MPI_UNDEFINED для ANY
STATUS(MPI_TAG) – c каким тегом, или неопределенно MPI_UNDEFINED для ANY
STATUS(MPI_ERROR) – код ошибки
Специальная функция для определения длины пришедшего сообщения : MPI_GET_COUNT (STATUS, DATATYPE, COUNT, IERR) -> результат COUNT
Оболочка сообщении < SOURCE, DEST , TAG, COMM >
Обычно передаче сообщения предшествует передача оболочки
Примеры оператора приема сообщений
INTEGER B_STATUS(MPI_STATUS_SIZE)
…
CALL MPI_RECV (B, 1, MPI_INTEGER, 0, 12, MPI_COMM_WORLD, B_STATUS, IERR
INTEGER STATUS(MPI_STATUS_SIZE)
…
CALL MPI_RECV (C, 20, MPI_REAL, 0, MPI_ANY_TAG, MPI_COMM_WORLD, STATUS,IERR)
CALL MPI_RECV (C, 20, MPI_ REAL, MPI_ANY_SOURCE, MPI_ANY_TAG,
MPI_COMM_WORLD, STATUS,IERR)
DOUBLE PRECISION A (n, m)
…
CALL MPI_RECV (A, n * m, MPI_DOUBLE_PRECISION, k, I + j, MPI_COMM_WORLD, STATUS,IERR)
Пример простой программы с обменом сообщениями
PROGRAM Example2 include 'mpif.h'
INTEGER ERR, SIZE, RANK, STATUS(MPI_STATUS_SIZE) REAL A,B
CСтандартное начало MPI - программы CALL MPI_INIT (ERR)
CALL MPI_COMM_RANK (MPI_COMM_WORLD,RANK,ERR) CALL MPI_COMM_SIZE (MPI_COMM_WORLD,SIZE,ERR) A = 0.0
B = 1.0
IF (RANK .EQ. 0) THEN B =1.0
CALL MPI_SEND (B,1,MPI_REAL,1,5, MPI_COMM_WORLD , IERR)
CALL MPI_RECV (A,1,MPI_REAL,1,5, MPI_COMM_WORLD,STATUS,ERR) ELSE
A =2.0
CALL MPI_RECV (B,1,MPI_REAL,0,5, MPI_COMM_WORLD,STATUS,ERR) CALL MPI_SEND (A,1,MPI_REAL,1,5, MPI_COMM_WORLD , IERR) ENDIF
WRITE (* , *) ' Process ‘, RANK, ' A= ', A, ' B= ', B
CЗавершение MPI
CALL MPI_FINALIZE(ERR)
END
Что это означает.
Осемантике операций обмена сообщениями с блокировкой
А.Блокировка
MPI_RECV – возвращает управление, только когда буфер приема получит сообщение.
MPI_SEND – возвращает управление, когда буфер отправки может быть повторно использован, то есть либо:
1)данные сообщения и их оболочка скопированы в системный буфер, либо
2)данные сообщения и их оболочка переданы непосредственно в буфер приема.
Схема использования памяти при передаче сообщений
Процессор 1 |
Процессор 2 |
(отправитель) |
(получатель) |
MPI_SEND (BUFS, …) |
MPI_RECV (BUFR, …) |
BUFS : |
BUFR : |
SYSTEM : |
|
Таким образом,
Стандартный режим – режим, допускающий оптимизацию в реализации в MPI.
Фактически, либо 1) переход в синхронный режим (ожидание операции приема) либо
2) в асинхронный (копирование в системный буфер) в зависимости от возможности буферизации, и длины сообщения.
Потенциально опасный режим.