MPI_Gatherv 函数

从组的所有成员收集到一个成员的变量数据。 MPI_Gatherv 函数通过允许每个进程的不同数据计数,为 MPI_Gather 函数增加了灵活性。

语法

int MPIAPI MPI_Gatherv(
  _In_      void         *sendbuf,
            int          sendcount,
            MPI_Datatype sendtype,
  _Out_opt_ void         *recvbuf,
  _In_opt_  int          *recvcounts[],
  _In_opt_  int          *displs[],
            MPI_Datatype recvtype,
            int          root,
            MPI_Comm     comm
);

参数

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

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

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

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

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

  • recvcounts[] [in, optional]
    从每个进程接收的元素数。 数组中的每个元素都对应于发送进程的排名。 如果计数为零,则消息的数据部分为空。 此参数仅在根进程中有效。

  • displs[] [in, optional]
    每个通信器进程中的数据相对于 recvbuf 参数的位置。 从进程 j 接收的数据放置在来自 sendbuf 指针的根进程偏移量 displs[j] 元素的接收缓冲区中。

    recvbufrecvcountsdispls 参数数组中,每个数组的第 n个元素引用从 第 n个通信器进程接收的数据。

    此参数仅在根进程中有效。

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

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

  • comm
    MPI_Comm通信器句柄。

返回值

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

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

Fortran

    MPI_GATHERV(SENDBUF, SENDCOUNT, SENDTYPE, RECVBUF, RECVCOUNTS, DISPLS, RECVTYPE, ROOT, COMM, IERROR)
        <type> SENDBUF(*), RECVBUF(*)
        INTEGER SENDCOUNT, SENDTYPE, RECVCOUNTS(*), DISPLS(*), RECVTYPE, ROOT, COMM, IERROR

注解

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

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

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

如果 comm 参数引用内部通信器,则所有进程都会将其发送缓冲区的内容发送到根进程。 根进程接收消息并按排名顺序存储它们。 结果就好像组中执行了对 的调用MPI_Send(sendbuf, sendcount, sendtype, root, …)的每个 n 个进程,而根执行了对 的 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 组中进程的 缓冲区 参数必须与根进程的 buffer 参数一致。

要求

产品

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_Gather