Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Параллельные вычисления. Учебное пособие
.pdf
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>
#dene 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
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
