PobedilRomanskogo / Введение в MPI
.pdfАварийный останов программы
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