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


функция MPI_Gather

Собирает данные от всех участников группы к одному участнику.

Синтаксис

int MPIAPI MPI_Gather(
  _In_      void         *sendbuf,
            int          sendcount,
            MPI_Datatype sendtype,
  _Out_opt_ void         *recvbuf,
            int          recvcount,
            MPI_Datatype recvtype,
            int          root,
            MPI_Comm     comm
);

Параметры

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

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

  • sendcount
    Количество элементов в буфере отправки. Если значение sendcount равно нулю, часть данных сообщения пуста.

  • sendtype
    Тип данных каждого элемента в буфере.

  • recvbuf [out, optional]
    Указатель на буфер корневого процесса, который содержит данные, полученные от каждого процесса. Он включает данные, отправляемые корневым процессом. Этот параметр имеет значение только в корневом процессе. Параметр recvbuf игнорируется для всех некорневых процессов.

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

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

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

  • Comm
    Дескриптор MPI_Comm .

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

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

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

Fortran

    MPI_GATHER(SENDBUF, SENDCOUNT, SENDTYPE, RECVBUF, RECVCOUNT, RECVTYPE, ROOT, COMM, IERROR)
        <type> SENDBUF(*), RECVBUF(*)
        INTEGER SENDCOUNT, SENDTYPE, RECVCOUNT, RECVTYPE, ROOT, COMM, IERROR

Комментарии

Все параметры функции важны для корневого процесса, только sendbuf, sendcount, sendtype, root и comm имеют важное значение в других процессах. Параметры root и comm должны быть одинаковыми во всех процессах.

Как правило, производные типы данных разрешены для параметров sendtype и recvtype . Подпись типа, заданная параметрами sendtype и recvtype для каждого процесса, должна быть равна сигнатуре типа параметров recvcount и sendcount в корневом процессе. Объем отправляемых данных должен быть равен объему данных, получаемых между корневым процессом и каждым отдельным процессом. Отдельные сопоставления типов между отправителем и получателем по-прежнему разрешены.

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

Если параметр comm ссылается на внутриобщие данные, все процессы отправляют содержимое буфера отправки корневому процессу. Корневой процесс получает сообщения и сохраняет их в порядке ранжирования. Результат будет таким, как если бы каждый из процессов n в группе выполнял вызов MPI_Send(sendbuf, sendcount, sendtype, root, …); а корневой элемент выполнил n вызовов .MPI_Recv(recvbuf + i*recvcount*extent(recvtype), recvcount, recvtype, i, …) Значение extent(recvtype) получается с помощью функции MPI_Type_get_extent . Альтернативное описание функции заключается в том, что n сообщений, отправляемых процессами в группе, объединяются в порядке ранжирования, а полученное сообщение получается корнем, как при вызове MPI_RECV(recvbuf, recvcountn, recvtype, ...). Буфер получения игнорируется для всех некорневых процессов.

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

Требования

Продукт

Распространяемый пакет 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_Gatherv