MPI_allgather()
和MPI_allgatherv()
之间的区别是什么?
答案 0 :(得分:6)
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)
您可以使用v变体使用recvcounts
和displs
为每个流程的数据指定大小和目标偏移量。
答案 1 :(得分:3)
只是为了增加@Scott Wales已经给出的答案:
通常,MPI提供三种类型的集体呼叫:
从每个目的地等级发送/接收相同数量的数据元素和相同数据类型的简单数据。典型示例包括:MPI_Scatter
,MPI_Gather
,MPI_Alltoall
等。您只为数据元素中的块大小提供一个参数,为数据类型提供一个参数;
向量变体,其中可以向/从每个目标等级发送/接收不同数量的元素,但是对于所有发送/接收,数据类型仍然相同。这些变体的后缀为" v":MPI_Scatterv
,MPI_Gatherv
,MPI_Alltoallv
等。它们与简单的签名具有几乎相同的签名,除了参数为块大小由两个整数向量参数(因此向量)替换:一个用于元素数量,一个用于从每个数据块的数据缓冲区开始的偏移量(在元素中)(始终在那个订单);
最通用的类型,也可以将不同数据类型的元素发送到通信器中的每个进程。这些变体有后缀" w"。并非所有集体都有这样的变体,其中MPI_Alltoallw
是MPI标准2.2版(最新发布的标准版)中唯一的变体,并且3.0版本中还有更多。
由于MPI是一个标准,并且由于所有MPI实现都需要符合标准(事实上大多数都是这样),您只需使用自己喜欢的搜索引擎搜索感兴趣的MPI功能,然后阅读第一本手册出现的页面。