- •Программирование в MPI
- •Общие свойства коллективных операций
- •2.1 Барьерная синхронизация
- •2.2 Коллективные операции рассылки-сборки данных 2.2.1 Коллективная операция рассылки данных
- •Свойства коллективной операции BroadCast рассылки данных
- •2.2.2 Коллективная операция рассылки данных c разборкой
- •Свойства коллективной операции Scatter рассылки данных с разборкой
- •2.2.3 Коллективная операция сборки данных (обратная к Scatter)
- •Свойства коллективной операции Gather сборки данных
- •2.2.4. Коллективные операции сборки-разборки данных переменной длины
- •2.2.5 Коллективная операция сборки данных “все от всех”
- •Свойства коллективной операции ALLGather сборки данных “все от всех”
- •2.2.5 Коллективная операция полного обмена данными “все со всеми”
- •Свойства коллективной операции ALLToAll полного обмена данными “все со всеми”
- •2.2.5 Коллективные редукционные операции 2.2.5.1 Простая редукция
- •Пример. Вычисление скалярного произведения
- •Предопределенные редукционные операции
- •2.2.5.2 Редукция “для всех”
- •PROGRAM Example8_Pi_Reduce include 'mpif.h'
- •MPI: операции над коммуникаторами
2.2.5 Коллективная операция сборки данных “все от всех”
MPI_ALLGATHER (SBUF,SCOUNT,STYPE, RBUF,RCOUNT,RTYPE,COMM,IERR)
INTEGER |
SCOUNT,STYPE, RCOUNT,RTYPE,ROOT,COMM,IERR |
SBUF |
- буфер рассылки |
SCOUNT |
- состоящий из SCOUNT элементов |
STYPE |
- типа STYPE |
RBUF |
- буфер приема |
RCOUNT |
- состоящий из RCOUNT элементов |
RTYPE |
- типа RTYPE |
COMM |
- коммуникатор взаимодействующих процессов |
IERR |
- код ошибки |
Нет корневого процесса ROOT ! |
|
|
|
|
|
|
|
|
|
Данные |
|
|
|
|
|
|
|
Процессы |
А0 |
|
А0 |
B0 |
C0 |
D0 |
E0 |
F0 |
|
B0 |
|
А0 |
B0 |
C0 |
D0 |
E0 |
F0 |
|
C0 |
AllGather |
А0 |
B0 |
C0 |
D0 |
E0 |
F0 |
|
D0 |
А0 |
B0 |
C0 |
D0 |
E0 |
F0 |
|
|
|
|||||||
|
E0 |
|
А0 |
B0 |
C0 |
D0 |
E0 |
F0 |
|
F0 |
|
А0 |
B0 |
C0 |
D0 |
E0 |
F0 |
Свойства коллективной операции ALLGather сборки данных “все от всех”
При возврате из операции локальные буфера SBUF по SCOUNT элементов со всех процессов будут скопированы в буфер RBUF каждого процесса коммуникатора COMM.
Принятые данные записываются в RBUF в порядке номеров процессов (блок данных, посланных процессом i-1 , размещается блоке i буфера RBUF)
SCOUNT должен быть равен RCOUNT во всех процессах, иначе ошибка
Преобразование типов допускается
Может рассматриваться, как MPI_GATHER, при выполнении которой результат получается во всех процессах коммуникатора COMM
2.2.5 Коллективная операция полного обмена данными “все со всеми”
MPI_ALLTOALL |
(SBUF,SCOUNT,STYPE, RBUF,RCOUNT,RTYPE,COMM,IERR) |
INTEGER |
SCOUNT,STYPE, RCOUNT,RTYPE,ROOT,COMM,IERR |
SBUF |
- буфер рассылки |
SCOUNT |
- состоящий из SCOUNT элементов |
STYPE |
- типа STYPE |
RBUF |
- буфер приема |
RCOUNT |
- состоящий из RCOUNT элементов |
RTYPE |
- типа RTYPE |
COMM |
- коммуникатор взаимодействующих процессов |
IERR |
- код ошибки |
Нет корневого процесса ROOT ! Данные
Процессы |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
А0 |
|
A1 |
|
A2 |
|
A3 |
|
A4 |
|
A5 |
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
B0 |
|
B1 |
|
B2 |
|
B3 |
|
B4 |
|
B5 |
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
C0 |
|
C1 |
|
C2 |
|
C3 |
|
C4 |
|
C5 |
|
AllToAll |
|
|
|
|
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
D0 |
|
D1 |
|
D2 |
|
D3 |
|
D4 |
|
D5 |
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
E0 |
|
E1 |
|
E2 |
|
E3 |
|
E4 |
|
E5 |
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
F0 |
|
F1 |
|
F2 |
|
F3 |
|
F4 |
|
F5 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
А0 |
B0 |
C0 |
D0 |
E0 |
F0 |
|
|
|
|
|
|
|
|
|
|
А1 |
B1 |
C1 |
D1 |
E1 |
F1 |
|
|
|
|
|
|
|
|
|
|
А2 |
B2 |
C2 |
D2 |
E2 |
F2 |
|
|
|
|
|
|
|
|
|
|
А3 |
B3 |
C3 |
D3 |
E3 |
F3 |
|
|
|
|
|
|
|
|
|
|
А4 |
B4 |
C4 |
D4 |
E4 |
F4 |
|
|
|
|
|
|
|
|
|
|
А5 |
B5 |
C5 |
D5 |
E5 |
F5 |
|
|
|
|
|
|
|
|
|
Свойства коллективной операции ALLToAll полного обмена данными “все со всеми”
Рассылка каждым процессом коммуникатора COMM различных порций данных всем другим процессам. J-й блок данных буфера SBUF(i-1) будет скопирован i-й блок данных буфера RBUF процесса j-1.
Принятые данные записываются в RBUF в порядке номеров процессов
SCOUNT должен быть равен RCOUNT во всех процессах, иначе ошибка
Преобразование типов допускается
2.2.5 Коллективные редукционные операции 2.2.5.1 Простая редукция
MPI_REDUCE |
(SBUF,RBUF,COUNT,DATATYPE,OP,ROOT,COMM,IERR) |
INTEGER |
COUNT,DATATYPE, ROOT,COMM,IERR |
SBUF |
- вектор, над элементами которого выполняется |
|
поэлементная операция OP (выполняется всеми |
|
процессами из коммуникатора COMM) |
SCOUNT |
- длина вектора |
RBUF |
- буфер результата выполнения операции OP |
OP |
- вид операции |
ROOT |
- процессор, получающий результат |
DATATYPE |
- тип элементов |
COMM |
- коммуникатор взаимодействующих процессов |
IERR |
- код ошибки |
Данные
Процессы
А0 B0 C0
A1 B1 C1
A2 B2 C2
А0+A1+A2 B0+B1+B2 C0+C1+C2
Reduce
Пример. Вычисление скалярного произведения
SUBROUTINE Example8 (A, B, n, c, COMM) INCLUDE “mpif.h”
C Распределенные вектора А и В DOUBLE_PRECISION A[n], B[n], sum, c
C Коммуникатор группы процессов, выполняющих суммирование INTEGER COMM
sum = 0.0 DO i = 1, n
sum = sum + A(i)*B(i)
ENDDO
CALL MPI_REDUCE(sum,c,1,MPI_FLOAT,MPI_SUM,0,COMM,IERR) END
Предопределенные редукционные операции
MPI_MAX |
- максимум |
MPI_MIN |
- минимум |
MPI_SUM |
- сумма |
MPI_PROD |
- произведение |
MPI_LAND |
- логическое И |
MPI_BAND |
- поразрядное И |
MPI_LOR |
- логическое ИЛИ |
MPI_BOR |
- поразрядное ИЛИ |
MPI_MAXLOC |
- максимум и его индекс |
MPI_MINLOC |
- минимум и его индекс |
MPI_MAX, MPI_MIN |
- над целыми, вещественными (Фортран) |
MPI_SUM, MPI_PROD |
- над целыми, вещественными, |
|
комплексными (Фортран) |
Возможно определение собственных (пользовательских) редукционных функций
2.2.5.2 Редукция “для всех”
MPI_ALLREDUCE (SBUF,RBUF,COUNT,DATATYPE,OP,COMM,IERR)
INTEGER |
COUNT,DATATYPE, ROOT,COMM,IERR |
SBUF |
- вектор, над элементами которого выполняется |
|
поэлементная операция OP (выполняется всеми |
|
процессами из коммуникатора COMM) |
SCOUNT |
- длина вектора |
RBUF |
- буфер результата выполнения операции OP |
OP |
- вид операции |
DATATYPE |
- тип элементов |
COMM |
- коммуникатор взаимодействующих процессов |
IERR |
- код ошибки |
Нет ROOT |
- результат получают все процессы из коммуникатора COMM |
Данные
Процессы
А0 B0 C0
A1 B1 C1
A2 B2 C2
AllReduce
А0+A1+A2 B0+B1+B2 C0+C1+C2
А0+A1+A2 B0+B1+B2 C0+C1+C2
А0+A1+A2 B0+B1+B2 C0+C1+C2
PROGRAM Example8_Pi_Reduce 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)
20 Sum = Sum + F(x) myPi = h * Sum
С Вычисление итогового значения Пи
CALL MPI_REDUCE(myPi,Pi, 1, MPI_ DOUBLE_PRECISION,MPI_SUM,0, * MPI_COMM_WORLD,RANK,ERR)
30CALL MPI_FINALIZE(ERR) END
MPI: операции над коммуникаторами
Распараллеливание по данным.
Задание 4. Уравнение Пуассона. Явные и неявные схемы.
О времени выполнения параллельной программы. Метрики параллелизма. Передача данных.
Некоторые понятия теории параллельных вычислений. Виды параллелизма. Зависимости. Граф зависимостей. Состояние дел в области распараллеливания.
Параллельное программирование в модели с общей памятью. Стандарт OpenMp.
