MPI_allgather和MPI_allgatherv之间的区别

koo*_*ool 5 parallel-processing mpi

MPI_allgather()和之间有什么区别MPI_allgatherv()

Sco*_*les 6

MPI标准

MPI_GATHERV通过允许来自每个进程的不同数据来扩展MPI_GATHER的功能,因为recvcounts现在是一个数组.通过提供新参数displs,它还允许更灵活地将数据放在根目录上

MPI_ALLGATHERV是这个的扩展.

这两个函数的签名是

int MPI_Allgather(void * sendbuff, int sendcount, MPI_Datatype sendtype, 
                  void * recvbuf, int recvcount, MPI_Datatype recvtype, 
                  MPI_Comm comm)
int MPI_Allgatherv(void * sendbuff, int sendcount, MPI_Datatype sendtype, 
                   void * recvbuf, int * recvcounts, int * displs, 
                   MPI_Datatype recvtype, MPI_Comm comm)
Run Code Online (Sandbox Code Playgroud)

您可以使用recvcountsdispls使用v变量为每个进程的数据指定大小和目标偏移量.

  • @Nick您应该能够在链接的标准文档第5章"集体沟通"中找到它们. (3认同)

Hri*_*iev 5

只是为了增加@Scott Wales 已经给出的答案:

一般而言,MPI 提供三种类型的集合调用:

  • 简单的,其中相同数量的数据元素和相同的数据类型被发送到/从每个目标等级接收。典型的例子是:MPI_ScatterMPI_GatherMPI_Alltoall等。在那里你只提供一个数据元素块大小参数和一个数据类型参数;

  • 向量变体,其中可以向/从每个目标等级发送/接收不同数量的元素,但所有发送/接收的数据类型仍然相同。这些变体的后缀为“v”: MPI_Scatterv, MPI_Gatherv,MPI_Alltoallv等。除了块大小的参数被两个整数向量参数(因此向量)替换之外,它们与简单的具有几乎相同的签名:一个是元素数量一个用于从每个数据块的数据缓冲区开始处的偏移量(以元素为单位)(始终按该顺序);

  • 最通用的类​​型,其中还可以将不同数据类型的元素发送到通信器中的每个进程。这些变体具有后缀“w”。并非所有集合都有这样的变体,MPI_Alltoallw它是 MPI 标准 2.2 版(最新发布的)中唯一的变体,并且在 3.0 版本中还会有更多变体。

由于 MPI 是一个标准,并且因为所有 MPI 实现都需要遵守该标准(实际上大多数都这样做),您只需使用您喜欢的搜索引擎搜索感兴趣的 MPI 函数,然后阅读随附的第一个手册页向上。