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

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.

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