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


функция MPI_Gatherv

Собирает переменные данные от всех членов группы к одному члену. Функция MPI_Gatherv обеспечивает гибкость функции MPI_Gather , позволяя получать разное количество данных из каждого процесса.

Синтаксис

int MPIAPI MPI_Gatherv(
  _In_      void         *sendbuf,
            int          sendcount,
            MPI_Datatype sendtype,
  _Out_opt_ void         *recvbuf,
  _In_opt_  int          *recvcounts[],
  _In_opt_  int          *displs[],
            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 игнорируется для всех некорневых процессов.

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

  • displs[] [in, необязательный]
    Расположение данных из каждого процесса коммуникатора относительно параметра recvbuf . Данные, полученные из процесса j , помещаются в буфер получения элементов корневого смещения процесса displs[j] из указателя sendbuf .

    В массивах параметров recvbuf, recvcounts и displsn-йэлемент каждого массива ссылается на данные, полученные из процесса n-гокоммуникатора.

    Этот параметр имеет значение только в корневом процессе.

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

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

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

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

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

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

Fortran

    MPI_GATHERV(SENDBUF, SENDCOUNT, SENDTYPE, RECVBUF, RECVCOUNTS, DISPLS, RECVTYPE, ROOT, COMM, IERROR)
        <type> SENDBUF(*), RECVBUF(*)
        INTEGER SENDCOUNT, SENDTYPE, RECVCOUNTS(*), DISPLS(*), 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 в корневом параметре. Данные передаются из корневого процесса во все процессы в группе 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_Gather