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


функция MPI_Alltoallv

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

Синтаксис

int MPIAPI MPI_Alltoallv(
  _In_  void         *sendbuf,
  _In_  int          *sendcounts,
  _In_  int          *sdispls,
        MPI_Datatype sendtype,
  _Out_ void         *recvbuf,
  _In_  int          *recvcounts,
  _In_  int          *rdispls,
        MPI_Datatype recvtype,
        MPI_Comm     comm
);

Параметры

  • sendbuf [in]
    Указатель на данные, отправляемые всем процессам в группе. Число и тип данных элементов в буфере указываются в параметрах sendcount и sendtype . Каждый элемент в буфере соответствует процессу в группе.

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

    Отправляемые и получаемые данные должны иметь ту же карту типов, что и массив recvcounts и параметр recvtype . Данные считываются из расположений буфера приема, заданного параметром rdispls .

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

  • sdispls [in]
    Расположение данных для каждого процесса коммуникатора относительно параметра sendbuf .

    Запись j указывает смещение относительно параметра sendbuf , из которого будут приниматься исходящие данные, предназначенные для процесса j.

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

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

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

  • rdispls [in]
    Расположение данных из каждого процесса коммуникатора относительно параметра recvbuf .

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

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

  • Comm
    Указывает дескриптор MPI_Comm коммуникатора.

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

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

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

Fortran

    MPI_ALLTOALL(SENDBUF, SENDCOUNT, SENDTYPE, RECVBUF, RECVCOUNT, RECVTYPE,
                COMM, IERROR)
        <type> SENDBUF(*), R.ECVBUF(*)
        INTEGER SENDCOUNT, SENDTYPE, RECVCOUNT, RECVTYPE, COMM, IERROR

Комментарии

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

Все параметры важны для всех процессов. Параметр comm должен быть одинаковым во всех процессах.

Если параметр comm ссылается на внутриобщий коммуникатор, то блок j, отправляемый из процесса i , получается процессом j и помещается в i-йблок буфера приема. Эти блоки не должны иметь одинаковый размер.

Результат вызова функции MPI_Alltoallv таков, как если бы каждый процесс отправлял сообщение каждому другому процессу с , MPI_Send(sendbuf + sdispls[i]*extent(sendtype), sendcounts[i], sendtype, I, …)и получал сообщение от каждого другого процесса с вызовом MPI_Recv(recvbuf + rdispls[i]*extent(recvtype), recvcounts[i], recvtype, I, …).

Указание параметра на месте указывает, что один и тот же объем и тип данных отправляются и получаются между любыми двумя процессами в группе коммуникатора. Различные пары процессов могут обмениваться разными объемами данных. Пользователи должны убедиться, что recvcounts[j] и recvtype в процессе i соответствуют recvcounts[i] и recvtype в процессе j. Этот симметричный обмен может быть полезен в приложениях, в которых отправляемые данные не используются процессом отправки после вызова функции MPI_Alltoallv .

Если параметр comm ссылается на интеркоммуникатора, результат будет таким, как если бы каждый процесс в группе A посылает сообщение каждому процессу в группе B и наоборот. J-йбуфер отправки процесса i в группе A должен соответствовать i-мубуферу получения процесса j в группе 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_Alltoall

MPI_Gather

MPI_Scatter

MPI_Send

MPI_Recv