- •Задание 3.
- •Программирование в MPI
- •1. Операции “точка-точка” (новые сведения)
- •1.3.1. Передача с буферизацией
- •Схема использования памяти при передаче с буферизацией
- •1.3.1.1. Выделение пользовательского буфера
- •Пример простой программы обмена с буферизацией
- •1.3.2. Передача с cинхронизацией
- •Схема использования памяти при передаче с синхронизацией
- •1.3.3. Передача по готовности (редко используется)
- •Схема использования памяти при передаче по готовности
- •Замечания к семантике взаимодействия “точка-точка”
- •Далее – функции обмена без блокировки.
- •Пример параллельной программы вычисления числа π 1
- •PROGRAM Example4_Pi
- •C Результат – Пи – будет получен в процессоре 0 IF (RANK .EQ.
Схема использования памяти при передаче по готовности
Процессор 1 |
Процессор 2 |
(отправитель) |
(получатель) |
MPI_RSEND(BUFS,…)
MPI_RECV (BUFR, …)
BUFS : |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
BUFR : |
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||
|
SYSTEM : |
||||||||||||||||||||||
Блокировка – необходимо гарантировать начало выполнения приема в Процессе 2, например, явной синхронизацией (функция BARRIER), иначе ошибка.
Возможность оптимизации в реализации MPI
Замечания к семантике взаимодействия “точка-точка”
1. Функция RECV
осуществляет прием сообщений, посланных любой из
функций отправки MPI_SEND, MPI_BSEND, MPI_SSEND, MPI_RSEND
2. Правило “необгона сообщений”
Последовательность отправленных сообщений, посланных одним процессом другому, соответствует последовательности принимаемых, логический
обгон в пути невозможен, даже если физически возможен
|
|
|
|
|
|
Процесс 0 |
|
|
|
|
|
|
|
|
|
||
|
Dest =1 |
|
Dest =1 |
|
|
|||
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
Tag =1 |
|
|
Tag =2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Source= ٭ |
|
Source= ٭ |
|
Source= 2 |
|
Source= 2 |
|
|
Tag =1 |
|
Tag =1 |
|
Tag = ٭ |
|
Tag = ٭ |
|
|
|
|
|
|
|
|
|
Процесс 2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Dest =1 |
|
|
Dest =1 |
Dest =1 |
|||
|
|
|
||||||
|
|
|
|
|||||
|
Tag =1 |
|
Tag =2 |
Tag =2 |
|
|||
Процесс 1 |
Source= ٭ |
Tag = ٭ |
Далее – функции обмена без блокировки.
Наиболее часто используемые функции, позволяющие обеспечивать совмещение вычислений (асинхронность действий)
1.4 Передача без блокировки
стандартный |
MPI_ISEND, |
буферизованный |
MPI_IBSEND, |
синхронный |
MPI_ISSEND, |
по готовности |
MPI_IRSEND |
1.5 Прием без блокировки
MPI_IRECV
Пример параллельной программы вычисления числа π 1
∫ 1/(1+x٭x) dx = arctan(1)- arctan(0) = π/4
0
Интегрирование F(x) = 4/(1 + x * x) , метод прямоугольников
0 |
1 |
PROGRAM Example4_Pi
include 'mpif.h'
DOUBLE PRECISION myPi, Pi, h, Sum, x, F, a
INTEGER n, ERR, SIZE, RANK, STATUS(MPI_STATUS_SIZE)
CИнтегрируемая функция F(a) = 4.0 D0 / (1.0 D0 + a * a) CALL MPI_INIT (ERR)
CALL MPI_COMM_RANK (MPI_COMM_WORLD,RANK,ERR) CALL MPI_COMM_SIZE (MPI_COMM_WORLD,SIZE,ERR)
CВвод числа отрезков разбиения
OPEN(10, FILE = ‘in.dat' ) READ(10,*) n
IF (n .LE. 0) THEN GOTO 30
C Вычисление частичной суммы h = 1.0D0 / n
Sum = 0.0 D0
DO 20 I = rank +1, n, size x = h * ( I – 0.5 D0) Sum = Sum + F(x)
20CONTINUE myPi = h * Sum
C Результат – Пи – будет получен в процессоре 0 IF (RANK .EQ. 0) THEN
Pi = myPi
С Прием результатов от остальных процессоров
|
DO 40 I = 1, size-1 |
|
|
CALL MPI_RECV (myPi,1,MPI_ DOUBLE_PRECISION,I,0, |
|
|
* |
MPI_COMM_WORLD,STATUS,ERR) |
|
Pi = Pi + myPi |
|
40 |
CONTINUE |
|
|
WRITE (* , *) ' |
Pi = ‘, Pi |
|
ELSE |
|
С Отправка результатов остальными процессорами
CALL MPI_SEND (myPi,1, MPI_ DOUBLE_PRECISION,0,0,
* |
MPI_COMM_WORLD , IERR) |
ENDIF |
|
C |
Завершение MPI |
30CALL MPI_FINALIZE(ERR) END
Как ускорить эту программу? Получите бонус ))
