next up previous contents
Next: Предопределенные операции редукции Up: Глобальные операции редукции Previous: Глобальные операции редукции   Contents

Функция Reduce

Синтаксис функции редукции MPI_REDUCE представлен ниже.

MPI_REDUCE(sendbuf, recvbuf, count, datatype, op, root, comm)

IN sendbuf адрес посылающего буфера (альтернатива)
OUT recvbuf адрес принимающего буфера (альтернатива, используется только корневым процессом)
IN count количество элементов в посылающем буфере (целое)
IN datatype тип данных элементов посылающего буфера (дескриптор)
IN op операция редукции (дескриптор)
IN root номер главного процесса (целое)
IN comm коммуникатор (дескриптор)

int MPI_Reduce(void* sendbuf, void* recvbuf, int count,
MPI_Datatype datatype, MPI_Op op, int root, MPI_Comm comm)

MPI_REDUCE(SENDBUF, RECVBUF, COUNT, DATATYPE, OP, ROOT, COMM, IERROR)
<type> SENDBUF(*), RECVBUF(*)
INTEGER COUNT, DATATYPE, OP, ROOT, COMM, IERROR

void MPI::Intracomm::Reduce(const void* sendbuf, void* recvbuf,
int count, const Datatype& datatype, const Op& op, int root) const

Функция MPI_REDUCE объединяет элементы входного буфера каждого процесса в группе, используя операцию op , и возвращает объединенное значение в выходной буфер процесса с номером root. Буфер ввода определен аргументами sendbuf, count и datatype; буфер вывода определен параметрами recvbuf, count и datatype; оба буфера имеют одинаковое число элементов одинакового типа. Функция вызывается всеми членами группы с одинаковыми аргументами count, datatype, op, root и comm. Таким образом, все процессы имеют входные и выходные буферы одинаковой длины и с элементами одного типа. Каждый процесс может содержать либо один элемент, либо последовательность элементов, в последнем случае операция выполняется над всеми элементами в этой последовательности. Например, если выполняется операция MPI_MAX , и посылающий буфер содержит два элемента - числа с плавающей точкой (count = 2, datatype = MPI_FLOAT), то recvbuf(1) = sendbuf(1) и recvbuf(2) = sendbuf(2).

В разделе 4.9.2 представлен список предопределенных операций редукций в MPI . В этом разделе также перечислены все типы данных, к которым могут быть применены эти операции. Дополнительно пользователи могут определять свои собственные операции, которые могут быть применены для различных типов данных, как базовых, так и переопределенных. Это объясняется далее в разделе 4.9.4.

Операция op всегда считается ассоциативной, а все предопределенные операции - коммутативными. Пользователи могут создавать операции, которые могут быть ассоциативными, но не коммутативными. ``Канонический'' порядок оценки редукции определен нумерацией процессов в группе. Однако, реализация может воспользоваться преимуществом либо ассоциативности, либо ассоциативности и коммутативности, чтобы изменить порядок оценки. Но это может изменить результат редукции для операций, которые не строго ассоциативны и коммутативны, например, для сложения чисел с плавающей точкой.

Совет разработчикам: Настоятельно рекомендуется, чтобы операция MPI_REDUCE была реализована так, чтобы всякий раз, когда функция вызывается с теми же параметрами, поставленными в том же порядке, получался одинаковый результат. Возможно, это может ограничивать оптимизацию, которую можно было бы получить, используя преимущество физического расположения процессоров.[]

Аргумент datatype в MPI_REDUCE должен быть совместимым с аргументом op. Предопределенные операции работают только с типами MPI , описанными в разделах 4.9.2 и 4.9.3. Определяемые пользователем операции могут оперировать и с производными типами. В этом случае каждый аргумент, к которому применяется операция редукции - это аргумент, описанный таким datatype , который может содержать несколько базисных значений. Это далее объяснено в разделе 4.9.4.


next up previous contents
Next: Предопределенные операции редукции Up: Глобальные операции редукции Previous: Глобальные операции редукции   Contents
Alex Otwagin 2002-12-10