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


функция MPI_Alltoallw

Собирает данные из группы и распределяет их по всем членам группы. Функция MPI_Alltoallw является наиболее общей формой полного обмена данными в этом API. MPI_Alltoallw включает отдельную спецификацию количества, смещения и типа данных.

Синтаксис

int MPIAPI MPI_Alltoallw(
  _In_  void         *sendbuf,
  _In_  int          *sendcounts[],
  _In_  int          *sdispls[],
  _In_  MPI_Datatype sendtypes[],
  _Out_ void         *recvbuf,
  _In_  int          *recvcounts[],
  _In_  int          *rdispls[],
  _In_  MPI_Datatype recvtypes[],
        MPI_Comm     comm
);

Параметры

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

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

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

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

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

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

  • sendtypes [in]
    Тип данных для каждого элемента в буфере отправки. Запись j указывает тип данных, отправляемых в процесс j в группе.

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

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

  • rdispls [in]
    Расположение (в байтах) относительно параметра recvbuf данных из каждого процесса коммуникатора. Запись i указывает смещение относительно параметра recvbuf , в котором размещаются входящие данные из процесса i.

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

  • recvtypes [in]
    Тип данных каждого элемента в буфере. Запись i указывает тип данных, получаемых из процесса i.

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

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

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

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

Fortran

    MPI_ALLTOALLW(SENDBUF, SENDCOUNT, SDISPLS, SENDTYPE, RECVBUF, RECVCOUNTS, RDISPLS, RECVTYPE,COMM, IERROR)
        <type> SENDBUF(*), R.ECVBUF(*)
        INTEGER SENDCOUNT, SENDTYPES(*), SDISPLS(*), RECVCOUNTS(*), RDISPLS(*), RECVTYPE, COMM, IERROR

Комментарии

Важно!

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

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

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

Сигнатура типа, указанная параметрами sendcounts[j] и sendtypes[j] для процесса i , должна быть равна сигнатуре типа, связанной с recvcounts[i] и recvtypes[i] в процессе j. Таким образом, объем отправленных данных должен быть равен объему данных, получаемых между любой парой процессов. Сопоставление различающихся типов между отправителем и получателем по-прежнему разрешено.

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

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

Если параметр comm ссылается на интеркоммуникатор, результат будет таким же, как если бы каждый процесс в группе А отправлял сообщение каждому процессу в группе 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_Alltoallv

MPI_Gather

MPI_Scatter

MPI_Send

MPI_Recv