【发布时间】:2011-08-17 10:58:48
【问题描述】:
MPI_Allgather() 和 MPI_Allgatherv() 有什么区别?
【问题讨论】:
MPI_Allgather() 和 MPI_Allgatherv() 有什么区别?
【问题讨论】:
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)
您可以使用 recvcounts 和 displs 使用 v 变体为每个进程的数据指定大小和目标偏移量。
【讨论】:
只是为了补充@Scott Wales 已经给出的答案:
一般来说,MPI 提供三种类型的集合调用:
从每个目标等级发送/接收相同数量的数据元素和相同数据类型的简单数据。典型示例有:MPI_Scatter、MPI_Gather、MPI_Alltoall 等。您只需为数据元素中的块大小提供一个参数,为数据类型提供一个参数;
向量变体可以向/从每个目标等级发送/接收不同数量的元素,但所有发送/接收的数据类型仍然相同。这些变体具有后缀“v”:MPI_Scatterv、MPI_Gatherv、MPI_Alltoallv 等。除了块大小的参数被两个整数向量参数替换(因此vector):一个用于元素数量,一个用于从每个数据块的数据缓冲区开始的偏移量(以元素为单位)(始终按该顺序);
最通用的类型,也可以将不同数据类型的元素发送到通信器中的每个进程。这些变体具有后缀“w”。并非所有的集体都有这样的变体,MPI_Alltoallw 是 MPI 标准 2.2 版(最新发布的标准)中唯一的一个,并且在 3.0 版中还会有更多。
由于 MPI 是一个标准,并且所有 MPI 实现都必须符合该标准(事实上大多数都这样做),您可以使用您最喜欢的搜索引擎搜索感兴趣的 MPI 函数,然后只需阅读第一本手册出现的页面。
【讨论】: