The following predefined operations are supplied for MPI_REDUCE and related functions MPI_ALLREDUCE, MPI_REDUCE_SCATTER_BLOCK, MPI_REDUCE_SCATTER, MPI_SCAN, MPI_EXSCAN, all nonblocking variants of those (see Section Nonblocking Collective Operations), and MPI_REDUCE_LOCAL. These operations are invoked by placing the following in op.
Name | Meaning |
MPI_MAX | maximum |
MPI_MIN | minimum |
MPI_SUM | sum |
MPI_PROD | product |
MPI_LAND | logical and |
MPI_BAND | bit-wise and |
MPI_LOR | logical or |
MPI_BOR | bit-wise or |
MPI_LXOR | logical exclusive or (xor) |
MPI_BXOR | bit-wise exclusive or (xor) |
MPI_MAXLOC | max value and location |
MPI_MINLOC | min value and location |
C integer: | MPI_INT, MPI_LONG, MPI_SHORT, |
MPI_UNSIGNED_SHORT, MPI_UNSIGNED, | |
MPI_UNSIGNED_LONG, | |
MPI_LONG_LONG_INT, | |
MPI_LONG_LONG (as synonym), | |
MPI_UNSIGNED_LONG_LONG, | |
MPI_SIGNED_CHAR, | |
MPI_UNSIGNED_CHAR, | |
MPI_INT8_T, MPI_INT16_T, | |
MPI_INT32_T, MPI_INT64_T, | |
MPI_UINT8_T, MPI_UINT16_T, | |
MPI_UINT32_T, and MPI_UINT64_T | |
Fortran integer: | MPI_INTEGER |
and handles returned from | |
MPI_TYPE_CREATE_F90_INTEGER | |
and, if available, MPI_INTEGER1, | |
MPI_INTEGER2, MPI_INTEGER4, | |
MPI_INTEGER8, and MPI_INTEGER16 | |
Floating point: | MPI_FLOAT, MPI_DOUBLE, MPI_REAL, |
MPI_DOUBLE_PRECISION, | |
MPI_LONG_DOUBLE, | |
and handles returned from | |
MPI_TYPE_CREATE_F90_REAL | |
and, if available, MPI_REAL2, | |
MPI_REAL4, MPI_REAL8, and MPI_REAL16 | |
Logical: | MPI_LOGICAL, MPI_C_BOOL, |
MPI_CXX_BOOL, | |
and, if available, MPI_LOGICAL1, | |
MPI_LOGICAL2, MPI_LOGICAL4, | |
MPI_LOGICAL8, and MPI_LOGICAL16, | |
Complex: | MPI_COMPLEX, MPI_C_COMPLEX, |
MPI_C_FLOAT_COMPLEX (as synonym), | |
MPI_C_DOUBLE_COMPLEX, | |
MPI_C_LONG_DOUBLE_COMPLEX, | |
MPI_CXX_FLOAT_COMPLEX, | |
MPI_CXX_DOUBLE_COMPLEX, | |
MPI_CXX_LONG_DOUBLE_COMPLEX, | |
and handles returned from | |
MPI_TYPE_CREATE_F90_COMPLEX | |
and, if available, MPI_DOUBLE_COMPLEX, | |
MPI_COMPLEX4, MPI_COMPLEX8, | |
MPI_COMPLEX16, and MPI_COMPLEX32 | |
Byte: | MPI_BYTE |
Multi-language types: | MPI_AINT, MPI_OFFSET, and MPI_COUNT |
[170pt] Op | Allowed Types |
| Multi-language types |
| Multi-language types |
|
The following examples use intra-communicators.
Example
A routine that computes
the dot product of two vectors that are distributed across a
group of MPI processes and returns the answer at node zero.
SUBROUTINE PAR_BLAS1(m, a, b, c, comm) USE MPI REAL a(m), b(m) ! local slice of array REAL c ! result (at node zero) REAL sum INTEGER m, comm, i, ierr ! local sum sum = 0.0 DO i = 1, m sum = sum + a(i)*b(i) END DO ! global sum CALL MPI_REDUCE(sum, c, 1, MPI_REAL, MPI_SUM, 0, comm, ierr) RETURN END
Example
A routine that computes
the product of a vector and an array that are distributed across a
group of MPI processes and returns the answer at node zero.
SUBROUTINE PAR_BLAS2(m, n, a, b, c, comm) USE MPI REAL a(m), b(m,n) ! local slice of array REAL c(n) ! result REAL sum(n) INTEGER m, n, comm, i, j, ierr ! local sum 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 ! global sum CALL MPI_REDUCE(sum, c, n, MPI_REAL, MPI_SUM, 0, comm, ierr) ! return result at node zero (and garbage at the other nodes) RETURN END