Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

PobedilRomanskogo / Введение в MPI

.pdf
Скачиваний:
20
Добавлен:
13.04.2015
Размер:
951.87 Кб
Скачать

Аварийный останов программы

call MPI_ABORT(comm, err_code) – аварийный останов по коду err_code (входной агрумент).

integer :: comm

! Коммуникатор

integer :: err_code! Код ошибки, вызывающей abort

Можно использовать err_code = MPI_ERR_OTHER, н-р,

call MPI_ABORT(MPI_COMM_WORLD, MPI_ERR_OTHER)

11

Время исполнения кода (функции)

MPI_WTIME(tm) – получить текущее время (в сек.) от какогото момента в прошлом для данного процесса. MPI_WTICK(tk) - получить разрешение таймера.

real*8 :: t1,t2

! Время в секундах

real*8 :: tk

! Шаг таймера

call MPI_INIT(err) t1 = MPI_WTIME(err)

! Какие-то параллельные вычисления t2 = MPI_WTIME(err)

print*,”Время исполнения: ”, t2-t1 call MPI_FINALIZE(err)

Для MPI_WTIME гарантируется, что момент в прошлом не

меняется для данного процесса.

12

В С/С++ MPI оформлена как функции, в Fortran - как процедуры.

С: err = MPI_Comm_rank(MPI_COMM_WORLD,&rk);

F: call MPI_COMM_RANK(MPI_COMM_WORLD,rk,err)

Аргументы в Fortran передаются не по значению, а по ссылке.

13

Типы данных MPI

MPI

Fortran

C/C++

 

 

 

MPI_CHAR

CHARACTER

signed char

 

 

 

MPI_SHORT

-

signed int

 

 

 

MPI_INT

INTEGER

signed int

 

 

 

MPI_LONG

-

signed long int

 

 

 

MPI_UNSIGNED_CHAR

-

unsigned char

 

 

 

MPI_UNSIGNED_SHORT

-

unsigned int

 

 

 

MPI_UNSIGNED

-

unsigned int

 

 

 

MPI_UNSIGNED_LONG

-

unsigned long int

 

 

 

MPI_FLOAT / MPI_REAL

REAL

float

 

 

 

MPI_DOUBLE

-

double

 

 

 

MPI_LONG_DOUBLE

-

long double

 

 

 

MPI_REAL8

REAL*8

-

 

 

 

MPI_COMPLEX

COMPLEX

-

 

 

 

MPI_PACK

Упакованные данные

 

 

 

Полный список типов объявлен в mpif.h (Фортан), mpi.h (C/C++).

14

Передача сообщений MPI

MPI позволяет использовать как обмен «точка-точка»

(двухточечный обмен), так и множественный.

Обмен процесс-процесс

Способ передачи С блокировкой Без блокировки

Обычный

MPI_Send

MPI_Isend

Синхронный

MPI_Ssend

MPI_Issend

Буферизованный MPI_Bsend

MPI_Ibsend

Согласованный

MPI_Rsend

MPI_Irsend

Прием данных

MPI_Recv

MPI_Irecv

B – buffer (буферизованный), S – sync (синхронизированный), R – ready (подготовленный),

I – non-blocking (неблокируемый).

 

Итого: 8 процедур отправки и 2 – приема.

15

Передача сообщений с блокировкой

call MPI_SEND(buf, cnt, type, dest, tag, comm, err)

buf адрес первого элемента в буфере передачи, например, buf(10) = начиная с 10-ого элемента из массива buf будет передано cnt элементов. Тип данных buf должен соответствовать типу type (см. слайд №14).

cnt количество предаваемых элементов. type тип пересылаемых данных.

dest номер (ранг) процесса, которому отправляется сообщение.

tag тэг (идентификатор) сообщения, они нужны, чтобы различать сообщения от одного отравителя.

Возврат из MPI_SEND не означает ни того, что сообщение уже передано процессу dest, ни того, что сообщение покинуло процесс, выполнивший MPI_SEND.

Порядок отправки сообщений из процессов A и B процессу C неопределен. Но 2 сообщения отправляемые от A к B приходят16 по порядку.

Прием сообщений с блокировкой

call MPI_RECV(buf, cnt, type, source, tag, comm, stat, err)

buf – адрес первого элемента в буфере приема (выходной арг); cnt количество принимаемых элементов в буфер buf;

type тип принимаемых данных;

source номер (ранг) процесса, который отправил сообщение; tag тэг сообщения;

comm коммуникатор;

stat массив, содержащий атрибуты принятого сообщения,

размера MPI_STATUS_SIZE типа integer (выходной арг).

В нем имеются следующие элементы:

stat(MPI_SOURCE) – номер процесса-отправителя сообщения; stat (MPI_TAG) – тэг сообщения;

stat(MPI_ERROR) – код ошибки.

Блокировка гарантирует, что после возврата из подпрограммы MPI_RECV все элементы сообщения

приняты и расположены в буфере buf. Размер buf должен

17

быть достаточным для приема данных.

Получение информации о структуре ожидаемого сообщения с блокировкой

call MPI_PROBE(source, tag, comm, stat, err) source - номер процесса-отправителя;

tag – тэг ожидаемого сообщения; comm – коммуникатор.

stat - параметры обнаруженного сообщения (выходной аргумент). См. слайд №17.

Возврата из MPI_PROBE не произойдет до тех пор, пока сообщение с подходящим тэгом и номером процессаотправителя не будет доступно для получения.

Подпрограмма определяет только факт прихода сообщения, но реально его не принимает.

! процесс с номером 0 рассылает if(rk == 0)then

do reciever = 1, sz-1 do i=1,CNT

data(i) = reciever ** i enddo

! посылка (ранг = 0)

call MPI_SEND(data, CNT, MPI_INTEGER, reciever, tag,&

MPI_COMM_WORLD, err) enddo

else

! прием, все остальные, ранг /= 0 с любым тэгом

call MPI_RECV(data, CNT, MPI_INTEGER, 0, MPI_ANY_TAG,& MPI_COMM_WORLD, stat, err)

print'("Процесс ",i2.2, " получил данные ",5(i8," "))',& rk, data

endif

19

Неблокирующая посылка

call MPI_ISEND(buf, cnt, dest, tag, comm, req, err)

Все аргументы аналогичны MPI_SEND .За исключением нового выходного аргумента req типа integer, идентификатора асинхронной передачи данных.

Возврат из подпрограммы происходит сразу после инициализации процесса передачи без ожидания обработки всего сообщения, находящегося в буфере buf. Это означает,

что нельзя повторно использовать этот буфер для других целей без получения дополнительной информации о завершении данной посылки.

20

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