| |
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
Закладки на сайте Проследить за страницей |
Created 1996-2024 by Maxim Chirkov Добавить, Поддержать, Вебмастеру |