Поделиться через


функция MPI_Reduce

Выполняет глобальную операцию уменьшения для всех членов группы. Можно указать предопределенную математическую или логическую операцию или определяемую приложением операцию.

Синтаксис

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

Параметры

  • sendbuf [in]
    Дескриптор буфера, который содержит данные, отправляемые корневому процессу.

    Если параметр comm ссылается на внутриобщие данные, можно указать параметр на месте, указав MPI_IN_PLACE во всех процессах. Параметры sendcount и sendtype игнорируются. Каждый процесс вводит данные в соответствующий элемент буфера получения. N-йпроцесс отправляет данные в n-йэлемент буфера приема. Корневой процесс принимает входные данные из соответствующего элемента буфера приема и заменяет их выходными данными.

  • recvbuf [out, optional]
    Дескриптор буфера для получения результата операции сокращения. Этот параметр имеет значение только в корневом процессе.

  • count
    Количество элементов, отправляемых из этого процесса.

  • datatype
    Тип данных каждого элемента в буфере. Этот параметр должен быть совместим с операцией, как указано в параметре op .

  • Op
    Выполняемая операция глобального сокращения. Дескриптор может указывать на встроенную или определяемую приложением операцию. Список предопределенных операций см. в разделе MPI_Op .

  • root
    Ранг принимающего процесса в указанном коммуникаторе.

  • Comm
    Дескриптор коммуникатора MPI_Comm .

Возвращаемое значение

Возвращает MPI_SUCCESS при успешном выполнении. В противном случае возвращаемое значение представляет собой код ошибки.

В Fortran возвращаемое значение хранится в параметре IERROR .

Fortran

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

Комментарии

Функция MPI_Reduce реализуется с предположением, что указанная операция является ассоциативной. Все предопределенные операции предназначены для ассоциативного и коммутативного. Пользователи могут определять операции, которые предназначены для ассоциативных, но не коммутативных. Порядок оценки по умолчанию для операции сокращения определяется рангами процессов в группе. Однако реализация может воспользоваться преимуществами ассоциативности или ассоциативности и коммутативности для изменения порядка вычисления. Этот процесс может изменить результат сокращения для операций, которые не являются строго ассоциативными и коммутативными, такими как сложение с плавающей запятой.

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

  1. Соберите все операнды в одном процессе, например с помощью функции MPI_Gather .
  2. Примените операцию сокращения в требуемом порядке, например с помощью функции MPI_Reduce_local .
  3. При необходимости выполните трансляцию или рассеяние результата другим процессам.

Примечание

Функцию MPI_Reduce в каждом процессе можно предоставить различные определяемые пользователем операции. Функция не определяет, какие операции используются для каких операндов в данном случае. Нельзя делать никаких предположений о том, как реализуется функция MPI_Reduce . Безопаснее всего указывать одну и ту же операцию в каждом процессе.

 

Определяемые пользователем операторы могут работать с общими производными типами данных. В этом случае каждый аргумент, к которому применяется операция reduce, является одним элементом, который описывается таким типом данных, который может содержать несколько базовых значений.

Перекрывающиеся типы данных разрешены в буферах отправки, но не в буферах приема. Перекрывающиеся типы данных в буферах получения могут давать непредсказуемые результаты и считаются ошибкой.

Если параметр comm ссылается на внутриобщие данные, функция MPI_Reduce объединяет элементы, указанные во входном буфере каждого процесса в группе, и с помощью указанной операции возвращает объединенное значение в выходном буфере корневого процесса.

Входной и выходной буфер имеют одинаковое количество элементов одного типа данных. Вызовите функцию во всех членах группы, используя одинаковые значения для параметров count, datatype, op, root и comm . Это гарантирует, что все процессы предоставляют входные и выходные буферы одинаковой длины с элементами одного типа.

Каждый процесс может предоставить один элемент или последовательность элементов, в этом случае операция выполняется для каждого элемента в каждой записи последовательности. Например, если операция MPI_MAX и буфер отправки содержит два элемента, которые являются числами с плавающей запятой, то recvbuf(1) получает глобальное максимальное значение (sendbuf(1)) и recvbuf(2) получает глобальное максимальное значение (sendbuf(2)).

Если параметр comm ссылается на интеркоммуникатор, то вызов включает все процессы в интеркоммуникаторе, но с одной группой, группой A, которая определяет корневой процесс. Все процессы в другой группе, группе B, задают одно и то же значение в корневом параметре, то есть ранг корневого процесса в группе A. Корневой процесс задает значение , MPI_ROOT в параметре root . Все остальные процессы в группе A задают значение , MPI_PROC_NULL в корневом параметре. В процессах группы B важны только параметры буфера отправки, а в корневом процессе важны только параметры буфера получения.

Требования

Продукт

Распространяемый пакет HPC 2012 MS-MPI, пакет HPC 2008 R2 распространяемый пакет MS-MPI, пакет HPC 2008 MS-MPI или клиентские служебные программы пакета HPC 2008

Заголовок

Mpi.h; Mpif.h

Библиотека

Msmpi.lib

DLL

Msmpi.dll

См. также раздел

Коллективные функции MPI

MPI_Datatype

MPI_Gather

MPI_Op

MPI_Bcast