Синтаксис функции редукции 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.