next up previous contents
Next: Другие операции Up: Расширенные коллективные операции Previous: ''All'' формы и ''all-to-all''   Contents

Редукции


------------------------------------------------------------------ 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 элементов. Иначе для коммуникаций необходимо вычислять, сколько элементов редуцируется. []


next up previous contents
Next: Другие операции Up: Расширенные коллективные операции Previous: ''All'' формы и ''all-to-all''   Contents
Alex Otwagin 2002-12-10