Следующие предопределенные операции могут использоваться MPI_REDUCE и родственными функциями MPI_ALLREDUCE, MPI_REDUCE_SCATTER и MPI_SCAN. Аргумент op может принимать следующие значения:
Имя | Значение |
MPI_MAX | максимум |
MPI_MIN | минимум |
MPI_SUM | сумма |
MPI_PROD | произведение |
MPI_LAND | логическое И |
MPI_BAND | поразрядное И |
MPI_LOR | логическое ИЛИ |
MPI_BOR | поразрядное ИЛИ |
MPI_LXOR | логическое исключающее ИЛИ |
MPI_BXOR | поразрядное исключающее ИЛИ |
MPI_MAXLOC | максимальное значение и местонахождения |
MPI_MINLOC | минимальное значение и местонахождения |
Операции MPI_MINLOC и MPI_MAXLOC обсуждаются далее в разделе 4.9.3. Для остальных предопределенных операций ниже приводятся разрешенные комбинации аргументов op и datatype. Но прежде определим группу основных типов данных MPI следующим образом:
Си integer: | MPI_INT, MPI_LONG, MPI_SHORT, MPI_UNSIGNED_SHORT, MPI_UNSIGNED, MPI_UNSIGNED_LONG |
ФОРТРАН 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 |
Правильные типы данных для каждой операции определены ниже.
Op | Разрешенные типы |
MPI_MAX, MPI_MIN | Си integer, ФОРТРАН integer, Floating point |
MPI_SUM, MPI_PROD | Си integer, ФОРТРАН integer, Floating point, Complex |
MPI_LAND, MPI_LOR, MPI_LXOR | Си integer, Logical |
MPI_BAND, MPI_BOR, MPI_BXOR | Си integer, ФОРТРАН integer, Byte |
Пример 4.15 Процедура вычисляет скалярное произведение двух векторов, распределенных в группе процессов, и возвращает результат в нулевой узел.
SUBROUTINE PAR_BLAS1(m, a, b, c, comm)
REAL a(m), b(m) ! локальная часть массива
REAL c ! результат (на узле ноль)
REAL sum
INTEGER m, comm, i, ierr
! локальная сумма
sum = 0.0
DO i = 1, m
sum = sum + a(i)*b(i)
END DO }
!глобальная сумма
CALL MPI_REDUCE(sum, c, 1, MPI_REAL, MPI_SUM, 0, comm, ierr)
RETURN
Пример 4.16 Процедура вычисляет произведение вектора на массив, которые распределены в группе процессов, и возвращает результат в нулевой узел.
SUBROUTINE PAR_BLAS2(m, n, a, b, c, comm)
REAL a(m), b(m,n) ! локальная часть массива
REAL c(n) ! результат
REAL sum(n)
INTEGER n, comm, i, j, ierr
!локальная сумма
DO j= 1, n
sum(j) = 0.0
DO i = 1, m
sum(j) = sum(j) + a(i)*b(i,j)
END DO
END DO
! глобальная сумма
CALL MPI_REDUCE(sum, c, n, MPI_REAL, MPI_SUM, 0, comm, ierr)
RETURN