------------------------------------------------------------------
MPI_REDUCE(sendbuf, recvbuf, count, datatype, op, root, comm)
------------------------------------------------------------------
IN | sendbuf | Адрес буфера передачи (по выбору) | ||||
OUT | recvbuf | Адрес буфера приема (по выбору, имеет значение только для корня) | ||||
IN | count | Количество элементов в буфере передачи (целое) | ||||
IN | datatype | Тип данных элементов буфера передачи (указатель) | ||||
IN | op | Операция редукции (указатель) | ||||
IN | root | Ранг корневого процесса (целое) | ||||
IN | comm | Коммуникатор (указатель) |
void MPI::Comm::Reduce(const void* sendbuf, void* recvbuf,
int count, const MPI::Datatype& datatype,
const MPI::Op& op, int root) const = 0
Опция in-place
для интракоммуникаторов указывается передачей
MPI_IN_PLACE
в качестве значения аргумента sendbuf
для
корня. В этом случае входные данные берутся в корне из буфера приема,
где они будут замещены выходными данными.
Если comm
- интеркоммуникатор, то вызов затронет все процессы в
интеркоммуникаторе, но корневой процесс будет определять одна группа
(группа A
). Все процессы в другой группе (группе B
) получат
одинаковые значения в аргументе root
, который является номером
корня в группе A
. Корню в root
будет передано значение
MPI_ROOT
. Все другие процессы из группы A в root
получат
значение MPI_PROC_NULL
. Только аргументы буферов передачи являются
существенными в группе B
и только аргументы буфера приема
существенны для корня.
------------------------------------------------------------------
MPI_ALLREDUCE(sendbuf, recvbuf, count, datatype, op, comm)
------------------------------------------------------------------
IN | sendbuf | Стартовый адрес буфера передачи (по выбору) | ||||
OUT | recvbuf | Стартовый адрес буфера приема (по выбору) | ||||
IN | count | Количество элементов в буфере передачи (целое) | ||||
IN | datatype | Тип данных элементов буфера передачи (указатель) | ||||
IN | op | Операция (указатель) | ||||
IN | comm | Коммуникатор (указатель) |
void MPI::Comm::Allreduce(const void* sendbuf,
void* recvbuf, int count,
const MPI::Datatype& datatype,
const MPI::Op& op) const = 0
Опция in-place
для интракоммуникаторов указывается передачей
MPI_IN_PLACE
в качестве значения аргумента sendbuf для корня. В
этом случае, входные данные берутся каждым процессом из буфера приема, где они
будут замещены выходными данными.
Если comm
- интеркоммуникатор, то результат редукции данных,
предоставляемых процессами из группы A
, сохраняется в каждом
процессе из группы B
, и наоборот. Для обеих групп должно
обеспечиваться равенство значений count
.
------------------------------------------------------------------
MPI_REDUCE_SCATTER(sendbuf, recvbuf, recvcounts,
datatype, op, comm)
------------------------------------------------------------------
IN | sendbuf | Стартовый адрес буфера передачи (по выбору) | ||||
OUT | recvbuf | Стартовый адрес буфера приема (по выбору) | ||||
IN | recvcounts | Целочисленный массив, указывающий количество элементов в результате, распределяемом каждому процессу. Массив должен быть одинаков в каждом из вызывающих процессов | ||||
IN | datatype | Тип данных элементов входного буфера (указатель) | ||||
IN | op | Операция (указатель) | ||||
IN | comm | Коммуникатор (указатель) |
void MPI::Comm::Reduce_scatter(const void* sendbuf,
void* recvbuf, int recvcounts[],
const MPI::Datatype& datatype,
const MPI::Op& op) const = 0
Опция in-place
для интракоммуникаторов указывается передачей
MPI_IN_PLACE
в качестве значения аргумента sendbuf
. В этом
случае, входные данные берутся с вершины буфера приема. Заметим, что
область, занимаемая входными данными, может быть длиннее либо короче, чем
выходные данные.
Если comm
- интеркоммуникатор, то результат редукции данных,
предоставляемых процессами из группы A
, рассылается процессам из
группы B
, и наоборот. В пределах каждой группы все процессы
обеспечивают одинаковые аргументы recvcounts
, и общее число
элементов recvcounts
должно быть равным для двух групп.
Объяснение:
Последнее ограничение необходимо для того, чтобы длина буфера передачи
могла быть установлена сложением локальных recvcounts
элементов.
Иначе для коммуникаций необходимо вычислять, сколько элементов
редуцируется. []