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

Программирование в 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) в асинхронный (копирование в системный буфер) в зависимости от возможности буферизации, и длины сообщения.

Потенциально опасный режим.

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