Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Выполняет глобальную операцию уменьшения для всех членов группы. Можно указать предопределенную математическую или логическую операцию или определяемую приложением операцию.
Синтаксис
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 реализуется с предположением, что указанная операция является ассоциативной. Все предопределенные операции предназначены для ассоциативного и коммутативного. Пользователи могут определять операции, которые предназначены для ассоциативных, но не коммутативных. Порядок оценки по умолчанию для операции сокращения определяется рангами процессов в группе. Однако реализация может воспользоваться преимуществами ассоциативности или ассоциативности и коммутативности для изменения порядка вычисления. Этот процесс может изменить результат сокращения для операций, которые не являются строго ассоциативными и коммутативными, такими как сложение с плавающей запятой.
Некоторые приложения не могут игнорировать не ассоциативный характер операций с плавающей запятой или могут использовать определяемые пользователем операции, которые требуют особого порядка оценки и не могут рассматриваться как ассоциативные. В этом случае можно явно применить порядок оценки. Например, в случае операций, требующих строгого порядка вычисления слева направо или справа налево, можно использовать следующий процесс:
- Соберите все операнды в одном процессе, например с помощью функции MPI_Gather .
- Примените операцию сокращения в требуемом порядке, например с помощью функции MPI_Reduce_local .
- При необходимости выполните трансляцию или рассеяние результата другим процессам.
Примечание
Функцию 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 |