MPI_Alltoall 函数

从中收集数据,并将数据分散到组的所有成员。 MPI_AlltoallMPI_Allgather 函数的扩展。 每个进程都向每个接收方发送不同的数据。 从进程 i 发送的第 j个块由进程 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]
    指向要发送到组中的所有进程的数据的指针。 缓冲区中元素的数量和数据类型在 sendcountsendtype 参数中指定。

    如果 comm 参数引用内部通信器,可以通过在所有进程中指定 MPI_IN_PLACE 来指定就地选项。 忽略 sendcountsendtype 参数。 每个进程在相应的接收缓冲区元素中输入数据。 第 n个进程将数据发送到接收缓冲区的第 n个元素。

  • sendcount
    在 sendbuf 参数中指定的缓冲区中的元素数。 如果 sendcount 为零,则消息的数据部分为空。

  • sendtype
    发送缓冲区中元素的 MPI 数据类型。

  • recvbuf [out]
    指向缓冲区的指针,该缓冲区包含从每个进程接收的数据。 缓冲区中元素的数量和数据类型在 recvcountrecvtype 参数中指定。

  • 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 中的每个进程发送一条消息一样,反之亦然。 组 A 中进程 i 的第 j个发送缓冲区应与组 B 中进程 j 的第 i个接收缓冲区保持一致,反之亦然。

组 A 中的进程发送的项数不必等于组 B 中的进程发送的项数。具体而言,可以通过为反向通信指定 sendcount == 0 来仅向一个方向移动数据。

要求

产品

HPC Pack 2012 MS-MPI 可再发行程序包、HPC Pack 2008 R2 MS-MPI 可再发行程序包、HPC Pack 2008 MS-MPI 可再发行程序包或 HPC Pack 2008 客户端实用工具

标头

Mpi.h;Mpif.h

Msmpi.lib

DLL

Msmpi.dll

另请参阅

MPI 集合函数

MPI_Datatype

MPI_Allgather

MPI_Send

MPI_Recv