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]
    指向要发送到组中的所有进程的数据的指针。 缓冲区中元素的数量和数据类型在 sendcountsendtype 参数中指定。 缓冲区中的每个元素对应于组中的一个进程。

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

    发送和接收的数据必须具有相同的类型映射(由 recvcounts 数组和 recvtype 参数指定),并且从接收缓冲区的位置读取,如 rdispls 参数所指定。

  • sendcounts [in]
    此进程在 sendbuf 参数中指定的缓冲区中发送的数据元素数。 如果 sendcount 中的元素为零,则来自该进程的消息的数据部分为空。

  • sdispls [in]
    每个通信器进程的数据相对于 sendbuf 参数的位置(以字节为单位)。

    Entry j 指定相对于 sendbuf 参数的位移,从中获取发往进程 j 的传出数据。

  • sendtypes [in]
    发送缓冲区中每个元素的数据类型。 条目 j 指定发送到组中处理 j 的数据类型。

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

  • recvcounts [in]
    接收缓冲区中每个通信器进程的数据元素数。

  • rdispls [in]
    每个通信器进程中的数据相对于 recvbuf 参数的位置(以字节为单位)。 项 i 指定相对于 recvbuf 参数的位移,该参数用于放置来自进程 i 的传入数据。

    recvbufrecvcountsrdispls 参数数组中,每个数组的第 n个元素引用从 第 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个块中。 这些块不必具有相同的大小。

由 process isendcounts[j]sendtypes[j] 参数指定的类型签名必须等于与 process j 处的 recvcounts[i]recvtypes[i] 关联的类型签名。 因此,发送的数据量必须等于在任何进程对之间接收的数据量。 仍允许在发送方和接收方之间进行不同的类型映射。

调用 MPI_Alltoallw 函数的结果就像每个进程使用 MPI_Send(sendbuf+sdispls[i],sendcounts[i],sendtypes[i] ,i,...)向其他每个进程发送了一条消息,并通过调用 MPI_Recv(recvbuf+rdispls[i],recvcounts[i],recvtypes[i] ,i,...)从其他每个进程接收消息。

指定就地选项指示在通信器组中的任意两个进程之间发送和接收相同数量和类型的数据。 不同的进程对可以交换不同量的数据。 用户必须确保 process i 上的 recvcounts[j]recvtype 匹配 process j 上的 recvcounts[i]recvtype

如果 comm 参数引用通信器,则结果就像组 A 中的每个进程向组 B 中的每个进程发送消息一样,反之亦然。 组 A 中进程 i 的第 j个发送缓冲区应与组 B 中进程 j 的第 i个接收缓冲区一致,反之亦然。

要求

产品

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_Alltoallv

MPI_Gather

MPI_Scatter

MPI_Send

MPI_Recv