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


функция MPI_Alltoall

Собирает данные из группы и распределяет их по всем членам группы. MPI_Alltoall является расширением функции MPI_Allgather. Каждый процесс отправляет отдельные данные каждому из получателей. Блок j, отправляемый из процесса i , получается процессом j и помещается в i-йблок буфера получения.

Синтаксис

int MPIAPI MPI_Alltoall(
  _In_  void         *sendbuf,
        int          sendcount,
        MPI_Datatype sendtype,
  _Out_ void         *recvbuf,
        int          recvcount,
        MPI_Datatype recvtype,
        MPI_Comm     comm
);

Параметры

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

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

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

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

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

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

  • 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

Комментарии

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

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

Если параметр comm ссылается на внутриобщий коммуникационатор, результат вызова MPI_ALLGATHER(...) будет таким же, как если бы каждый процесс выполнял отправку в каждый процесс, включая сам с помощью MPI_Send(sendbuf + i*sendcount*extent(sendtype), sendcount, sendtype, I, …), и получение от каждого другого процесса с помощью MPI_Recv(recvbuf + i*recvcount*extent(recvtype), recvcount, recvtype, I, …).

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

Количество элементов, отправляемых процессами в группе A, не должно совпадать с числом элементов, отправляемых процессами в группе B. В частности, можно перемещать данные только в одном направлении, указав sendcount == 0 для обмена данными в обратном направлении.

Требования

Продукт

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

MPI_Send

MPI_Recv