MPI имеет варианты каждой из операций редукции, когда результат рассылается всем процессам в группе в конце операции.
Синтаксис функции MPI_REDUCE_SCATTER представлен ниже.
MPI_REDUCE_SCATTER(sendbuf, recvbuf, recvcounts, datatype, op, comm)
IN | sendbuf | начальный адрес буфера посылки (альтернатива) | |
OUT | recvbuf | начальный адрес буфера приема (альтернатива) | |
IN | recvcounts | целочисленный массив, определяющий количество элементов результата, распределенных каждому процессу. Массив должен быть идентичен во всех вызывающих процессах. | |
IN | datatype | тип данных элементов буфера ввода (дескриптор) | |
IN | op | операция (дескриптор) | |
IN | comm | коммуникатор (дескриптор) |
int MPI_Reduce_scatter(void *sendbuf, void *recvbuf,
int *recvcounts, MPI_Datatype datatype, MPI_Op op, MPI_Comm comm)
MPI_REDUCE_SCATTER(SENDBUF, RECVBUF, RECVCOUNTS,
DATATYPE, OP, COMM, IERROR)
<type> SENDBUF(*), RECVBUF(*)
INTEGER RECVCOUNTS(*), DATATYPE, OP, COMM, IERROR
void Intracomm::Reduce_scatter(const void* sendbuf, void* recvbuf,
int recvcounts[], const Datatype& datatype, const Op& op) const
Функция MPI_REDUCE_SCATTER сначала производит поэлементную редукцию вектора из count = recvcount[i] элементов в буфере посылки, определенном sendbuf, count и datatype. Далее полученный вектор результатов разделяется на n непересекающихся сегментов, где n - число членов в группе. Сегмент i содержит recvcount[i] элементов. i-й сегмент посылается i-му процессу и хранится в буфере приема, определяемом recvbuf, recvcounts[i] и datatype.
Совет разработчикам: Функция MPI_REDUCE_SCATTER функционально эквивалентна операции MPI_REDUCE с count, равным сумме recvcounts[i], за которой следует MPI_SCATTER с sendcount, равным recvcounts. Однако, прямая реализация может работать быстрее. []