MPI_Gather 函数

将数据从组的所有成员收集到一个成员。

语法

int MPIAPI MPI_Gather(
  _In_      void         *sendbuf,
            int          sendcount,
            MPI_Datatype sendtype,
  _Out_opt_ void         *recvbuf,
            int          recvcount,
            MPI_Datatype recvtype,
            int          root,
            MPI_Comm     comm
);

参数

  • sendbuf [in]
    指向缓冲区的指针,该缓冲区包含要发送到根进程的数据。

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

  • sendcount
    发送缓冲区中的元素数。 如果 sendcount 为零,则消息的数据部分为空。

  • sendtype
    缓冲区中每个元素的数据类型。

  • recvbuf [out, 可选]
    指向根进程上的缓冲区的指针,该缓冲区包含从每个进程接收的数据。 它包括根进程发送的数据。 此参数仅在根进程中有效。 对于所有非根进程,将忽略 recvbuf 参数。

  • recvcount
    从每个进程接收的元素数。 此数字不是缓冲区中的项总数。 如果计数为零,则消息的数据部分为空。 此参数仅在根进程中有效。

  • recvtype
    缓冲区中每个元素的 MPI 数据类型。 此参数仅在根进程中有效。

  • root
    指定通信器内接收进程的排名。

  • comm
    MPI_Comm通信器句柄。

返回值

返回成功 时MPI_SUCCESS 。 否则,返回值为错误代码。

在 Fortran 中,返回值存储在 IERROR 参数中。

Fortran

    MPI_GATHER(SENDBUF, SENDCOUNT, SENDTYPE, RECVBUF, RECVCOUNT, RECVTYPE, ROOT, COMM, IERROR)
        <type> SENDBUF(*), RECVBUF(*)
        INTEGER SENDCOUNT, SENDTYPE, RECVCOUNT, RECVTYPE, ROOT, COMM, IERROR

注解

所有函数参数在根进程上都很重要,只有 sendbufsendcountsendtyperootcomm 在其他进程中是重要的。 参数和 comm 参数在所有进程中都必须相同。

通常, sendtyperecvtype 参数都允许使用派生数据类型。 每个进程中的 sendtyperecvtype 参数指定的类型签名必须等于根进程中 recvcountsendcount 参数的类型签名。 发送的数据量必须等于根进程与每个单独进程之间收到的数据量。 仍允许发送方和接收方之间的非重复类型映射。

计数和类型的规范不应导致根上的任何位置多次写入。 此类调用是错误的。

如果 comm 参数引用内部通信器,则所有进程都会将其发送缓冲区的内容发送到根进程。 根进程接收消息并按排名顺序存储它们。 结果就像组中的每个 n 个进程都执行了对 MPI_Send(sendbuf, sendcount, sendtype, root, …)的调用,而根已 执行 n 个 对 的 MPI_Recv(recvbuf + i*recvcount*extent(recvtype), recvcount, recvtype, i, …)调用。 extent(recvtype)的值是使用 MPI_Type_get_extent 函数获取的。 函数的另一种说明是,组中的进程发送的 n 条消息按排名顺序连接,生成的消息由根用户接收,就像通过对 的调用 MPI_RECV(recvbuf, recvcountn, recvtype, ...)一样接收。 对于所有非根进程,将忽略接收缓冲区。

如果 comm 参数引用对讲器,则调用涉及交互器中的所有进程,但包含一个组 A,用于定义根进程。 其他组 B 组中的所有进程在参数中设置相同的值,即组 A 中根进程的排名。根进程在参数中MPI_ROOT设置值。 组 A 中的所有其他进程在参数中MPI_PROC_NULL设置值。 数据从根进程广播到组 B 中的所有进程。组 B 中进程的 缓冲区 参数必须与根进程的 缓冲区 参数一致。

要求

产品

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_Gatherv