MPI имеет варианты каждой из операций редукции, где результат возвращается всем процессам группы. MPI требует, чтобы все процессы, участвующие в этих операциях, получили идентичные результаты.
Синтаксис функции MPI_ALLREDUCE представлен ниже.
MPI_ALLREDUCE(sendbuf, recvbuf, count, datatype, op, comm)
IN | sendbuf | начальный адрес буфера посылки (альтернатива) | |
OUT | recvbuf | начальный адрес буфера приема (альтернатива) | |
IN | count | количество элементов в буфере посылки (целое) | |
IN | datatype | тип данных элементов буфера посылки () | |
IN | op | операция (дескриптор) | |
IN | comm | коммуникатор (дескриптор) |
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, COMM, IERROR
void MPI::Intracomm::Allreduce(const void* sendbuf, void* recvbuf,
int count, const Datatype& datatype, const Op& op) const
Функция MPI_ALLREDUCE отличается от MPI_REDUCE тем, что результат появляется в буфере приема у всех членов группы.
Совет разработчикам: Операции типа all-reduce могут быть реализованы как последовательность операций reduce и bcast. Однако, прямая реализация может быть эффективнее.[]
Пример 4.21 Процедура вычисляет произведение вектора и массива, которые распределены по всем процессам группы, и возвращает ответ всем узлам (см.также пример 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_ALLREDUCE(sum, c, n, MPI_REAL, MPI_SUM, comm, ierr)
! возвращение результата всем узлам
RETURN