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

Параллельные вычисления. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
08.09.2026
Размер:
2 Мб
Скачать
4.5. Обзор коллективных операций
В MPI глобальные операции редукции представлены в несколь-
ких вариантах:
‒ с сохранением результата в адресном пространстве одного про-
цесса (MPI_Reduce);
‒ с сохранением результата в адресном пространстве всех процес-
сов (MPI_Allreduce);
‒ префиксная операция редукции, которая в качестве результа­та операции возвращает вектор. i-я компонента этого вектора явля­ется результатом редукции первых i компонент распределенного век­тора (MPI_Scan);
‒ совмещенная операция Reduce/Scatter (MPI_Reduce_scatter).
Совмещенные
операции
Операция глобальной редукции, указанная параметром op, вы­полняется над первыми элемен­тами входного буфера, и резуль­тат посылается в первый элемент буфера приема процесса root. За­тем то же самое делается для вто­рых элементов буфера и т. д.
MPI_Reduce
Синтаксис
C FORTRAN
int MPI_Reduce (void* sendbuf, void* recvbuf, int count, MPI_Datatype datatype, MPI_Op op, int root, MPI_ Comm comm)
MPI_REDUCE (SENDBUF, RECVBUF, COUNT, DATATYPE, OP, ROOT, COMM, IERROR) <type> SENDBUF(*), RECVBUF(*) INTEGER COUNT, DATATYPE, OP, ROOT, COMM, IERROR IN sendbuf — адрес начала входного буфера; OUT recvbuf — адрес начала буфе­ра результатов (ис­пользуется только в процессе-полу­чателе root); IN count — число элементов во вход­ном буфере;
81
4. Среда параллельного программирования MPI
IN datatype — тип элементов во вход­ном буфере; IN op — опера­ция, по которой выполняется ре­дукция; IN root — номер процесса-полу­чателя результата операции; IN comm — ком­муникатор
На рис. 18 представлена графическая интерпретация операции Reduce. На данной схеме операция «+» означает любую допустимую операцию редукции.
sendbuf
процесс 0
процесс 1
процесс 2
a0
sendbuf
a1
sendbuf
a2
b0
b1
b2
c0
c1
c2
Reduce
recvbuf
a0+a1+a2
процесс root
b0+b1+b2
c0+c1+c2
Рис. 18. Графическая интерпретация операции Reduce
В качестве операции (op) можно использовать либо одну из предо­пределенных операций, либо операцию, сконструированную пользо­вателем. Все предопределенные операции являются ассоциативны­ми и коммутативными. Сконструированная пользователем операция, по крайней мере, должна быть ассоциативной. Порядок редукции определяется номерами процессов в группе. Тип datatype элементов должен быть совместим с операцией (op). В табл. 6 представлен пере­чень предопределенных операций, которые могут быть использованы в функциях редукции MPI.
82
4.5. Обзор коллективных операций
Таблица 6
Предопределенные операции в функциях редукции MPI
Название Операция Разрешенные типы
MPI_MAX MPI_MIN
MPI_SUM MPI_PROD
MPI_LAND MPI_LOR MPI_LXOR
MPI_BAND MPI_BOR MPI_BXOR
MPI_MAXLOC MPI_MINLOC
Максимум Минимум
Сумма Произведение
Логическое AND Логическое OR Логическое исключающее OR
Поразрядное AND Поразрядное OR Поразрядное исключающее OR
Максимальное значение и его индекс Минимальное значение и его индекс
C integer, FORTRAN integer, Floating point
C integer, FORTRAN integer, Floating point, Сomplex
C integer, Logical
C integer, FORTRAN integer, Byte
Специальные типы для этих функций
В таблице 6 используются следующие обозначения: C integer: MPI_INT, MPI_LONG, MPI_SHORT, MPI_UNSIGNED_ SHORT, MPI_UNSIGNED, MPI_UNSIGNED_LONG FORTRAN integer: MPI_INTEGER Floating point: MPI_FLOAT, MPI_DOUBLE, MPI_REAL, MPI_ DOUBLE_PRECISION, MPI_LONG_DOUBLE Logical: MPI_LOGICAL Complex: MPI_COMPLEX Byte: MPI_BYTE
Операции MAXLOC и MINLOC выполняются над специальны­ми парными типами, каждый элемент которых хранит две величины: значения, по которым ищется максимум или минимум, и индекс эле­мента. В MPI имеется 9 таких предопределенных типов. Типы пере­числяются в следующих табличных формах.
Типы MPI Типы языка C
MPI_FLOAT_INT float and int MPI_DOUBLE_INT double and int MPI_LONG_INT long and int MPI_2INT int and int
83
4. Среда параллельного программирования MPI
MPI_SHORT_INT short and int MPI_LONG_DOUBLE_INT long double and int
Типы MPI Типы языка FORTRAN
MPI_2REAL REAL and REAL MPI_2DOUBLE_PRECISION DOUBLE PRECISION
and DOUBLE PRECISION
MPI_2INTEGER INTEGER and INTEGER
Совмещенные
операции
MPI_Allreduce
Сохраняет результат редукции в адресном пространстве всех процессов, поэтому в списке па­раметров функции отсутствует идентификатор корневого про­цесса root. В остальном набор па­раметров такой же, как и в пре­дыдущей функции
Синтаксис
C FORTRAN
int MPI_Allreduce (void* sendbuf, void* recvbuf, int count, MPI_Datatype datatype, MPI_Op op, MPI_Comm comm)
MPI_ ALLREDUCE (SENDBUF, RECVBUF, COUNT, DATATYPE, OP, COMM, IERROR) <type> SENDBUF(*), RECVBUF(*) INTEGER COUNT, DATATYPE, OP, ROOT, COMM, IERROR IN sendbuf — адрес начала входного буфера; OUT recvbuf — адрес начала бу­фера приема; IN count — число элементов во вход­ном буфере; IN datatype — тип элементов во вход­ном буфере;
84
4.5. Обзор коллективных операций
процесс
процесс
процесс
IN op — опера­ция, по которой выполняется ре­дукция; IN comm — ком­муникатор
На рис. 19 представлена графическая интерпретация операции Allreduce.
sendbuf
0
1
2
a0
sendbuf
a1
sendbuf
a2
b0
b1
b2
c0
c1
c2
Рис. 19. Графическая интерпретация операции Allreduce
Совмещенные
операции
MPI_Reduce_
scatter
Совмещает в себе операции ре­дукции и распределения резуль­тата по процессам. Функция MPI_Reduce_scatter от­личается от MPI_Allreduce тем, что результат операции разреза­ется на непересекающиеся части по числу процессов в группе, i-я часть посылается i-му процессу в его буфер приема. Длины этих частей задает третий параметр, являющийся массивом
recvbuf
a0+a1+a2
Allr educ e
recvbuf
a0+a1+a2
recvbuf
a0+a1+a2
Синтаксис
C FORTRAN
MPI_Reduce_ scatter (void* sendbuf, void* recvbuf, int *recvcounts, MPI_ Datatype datatype, MPI_Op op, MPI_ Comm comm)
b0+b1+b2
b0+b1+b2
b0+b1+b2
c0+c1+c2
c0+c1+c2
c0+c1+c2
MPI_REDUCE_ SCATTER (SENDBUF, RECVBUF, RECVCOUNTS, DATATYPE, OP, COMM, IERROR) <type> SENDBUF(*), RECVBUF(*) INTEGER RECVCOUNTS(*), DATATYPE, OP, COMM, IERROR IN sendbuf — адрес начала входного буфера;
85
4. Среда параллельного программирования MPI
OUT recvbuf — адрес начала бу­фера приема; IN revcount — массив, в котором задаются размеры блоков, посылае­мых процессам; IN datatype — тип элементов во входном буфере; IN op — опера­ция, по которой выполняется ре­дукция; IN comm — ком­муникатор
На рис. 20 представлена графическая интерпретация операции
Reduce_scatter.
sendbuf
процесс 0
процесс 1
процесс 2
a0
sendbuf
a1
sendbuf
a2
b0
b1
b2
Рис. 20. Графическая интерпретация операции Reduce_scatter
Совмещенные
операции
MPI_Scan
Выполняет префиксную редук­цию. Параметры такие же, как в MPI_Allreduce, но получаемые каждым процессом результаты от­личаются друг от друга. Операция
86
c0
Reduce_scatter
c1
c2
Синтаксис
C FORTRAN
int MPI_Scan (void* sendbuf, void* recvbuf, int count, MPI_Datatype
recvbuf
a0+a1+a2
recvbuf
b0+b1+b2
recvbuf
c0+c1+c2
MPI_MPI_SCAN (SENDBUF, RECVBUF, COUNT, DATATYPE, OP,
4.5. Обзор коллективных операций
пересылает в буфер приема i-го процесса редукцию значений из входных буферов процессов с номерами 0… i включительно
datatype, MPI_Op op, MPI_Comm comm)
COMM, IERROR) <type> SENDBUF (*), RECVBUF (*) INTEGER COUNT, DATATYPE, OP, ROOT, COMM, IERROR IN sendbuf — адрес начала входного буфера; OUT recvbuf — адрес начала бу­фера приема; IN count — число элементов во вход­ном буфере; IN datatype — тип элементов во вход­ном буфере; IN op — опера­ция, по которой выполняется ре­дукция; IN comm — ком­муникатор
На рис. 21 представлена графическая интерпретация операции Scan.
recvbuf
a0
recvbuf
a0+a1
recvbuf
a0+a1+a2
b0 c0
b0+b1
b0+b1+b2
c0+c1
c0+c1+c2
процесс 0
процесс 1
процесс 2
sendbuf
a0
sendbuf
a1
sendbuf
a2
b0
b1
b2
c0
Scan
c1
c2
Рис. 21. Графическая интерпретация операции Scan
87
5. Примеры параллельных программ
x
xn
на языках C и FORTRAN
5.1. Параллельное вычисление числа π
Значение числа π может быть получено при помощи интеграла:
1
4

1
0
Для численного интегрирования используется метод прямоуголь-
ников (рис. 22)
4,5
y
4
3,5
3
2,5
2
1,5
1
0,5
0
0 0,1 0,2 0,3 0,4 0,5 0,6 0,7 0,8 0,9 1
dx.
2
x
Рис. 22. Разбиение области интегрирования
n
i
1
411
i
,
2
x
— координаты точек
i

где n — число точек разбиения отрезка [0,1]; сетки.
Распределим вычисления между m процессорами (см. рис. 23) и про-
суммируем получаемые на отдельных процессорах частные суммы.
88
5.1. Параллельное вычисление числа π
x
π
4,5
y
4
3,5
3
2,5
2
1,5
1
0,5
0
0 0,1 0,2 0,3 0,4 0,5 0,6 0,7 0,8 0,9 1
Процессы
0 1 2 3
Рис. 23. Схема распределения вычислений по процессам
В табл. 7 приведены времена счета и коэффициенты ускорения и эф­фективности вычисления числа À при
Вычисление числа
Число
процессоров m
Время T
1 15,93 — 2 7,96 1,999 0,999 3 5,31 2,998 0,999 4 3,99 3,991 0,997 5 3,19 4,999 0,999 6 2,66 5,987 0,997 7 2,28 6,985 0,997 8 1,99 7,976 0,998
9 1,87 8,508 0,945 10 1,60 9,979 0,997 11 1,46 10,906 0,991 12 1,44 11,061 0,921
, с Ускорение S
m
n=1000000000
Эффективность E
m
для МВС-1000.
Таблица 7
m
89
5. Примеры параллельных программ на языках C и FORTRAN
Ниже приводятся примеры программы вычисления числа π. C:
#include <mpi.h> #include <math.h> #include <stdio.h>
#dene PI25DT 3.141592653589793238462643
int main (int argc, char** argv) {
double mypi, pi, h, sum, x, f, a;
double t1, t2, t;
int n, myid, numprocs, i, rc;
MPI_Init (NULL, NULL); MPI_Comm_size (MPI_COMM_WORLD, &numprocs); MPI_Comm_rank (MPI_COMM_WORLD, &myid);
printf ("Process%d of%d is alive\n", myid, numprocs);
t1 = MPI_Wtime ();
if (myid == 0)
n = 1000000000;
MPI_Bcast (&n, 1, MPI_INTEGER, 0, MPI_COMM_WORLD);
//calculate the interval size
h = 1.0 / n; sum = 0.0;
for (i = myid; i < n; i += numprocs) {
x = h * (i - 0.5);
x = 4.0 / (1.0 + x * x);
sum = sum + x; } mypi = h * sum;
//collect all the partial sums
MPI_Reduce (&mypi, &pi, 1, MPI_DOUBLE_PRECISION, MPI_
SUM, 0, MPI_COMM_WORLD);
t2 = MPI_Wtime ();
//process 0 prints the answer
if (myid == 0)
printf ("pi is approximately:%.16f \n Error is:%.16f\n",
pi, fabs (pi - PI25DT));
90
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]