我有一个带有一些数据的MPI程序。每个等级都需要所有数组来完成其工作,但只能在数组的补丁上工作。在计算步骤之后,我需要每个等级将其计算的数组传递给所有其他等级。
如何有效地实现这一目标?
在伪代码中,我会做第一种方法:
if rank == 0: // only master rank
initialise_data()
end if
MPI_Bcast(all_data,0) // from master to every rank
compute which part of the data to work on
for ( several steps ): // each rank
execute_computation(part_of_data)
for ( each rank ):
MPI_Bcast(part_of_data, rank_number) // from every rank to every rank
end for
end for
缺点是存在尽可能多的广播,即有排名的障碍。那么我该如何更换MPI_Bcast?
编辑:我可能已经找到了提示......我正在寻找MPI_Allgather吗?
答案 0 :(得分:1)
是的,您正在寻找MPI_Allgather
。请注意,recvcount
不是整个接收缓冲区的长度,但应从一个进程接收数据量。类似地,在MPI_Allgatherv
recvcount[i]
中是您希望从第i个流程接收的数据量。此外,recvcount
应与相应的sendcount
相等(不少于)。我在我的实现(OpenMPI)上对它进行了测试,如果我尝试收到较少的已发送元素,则会出现MPI_ERR_TRUNCATE
错误。
在极少数情况下,我使用MPI_Allreduce
表示该puprose。例如,如果我们有以下数组:
process0: AA0000
process1: 0000BB
process2: 00CC00
然后我们可以使用MPI_SUM
操作执行Allreduce,并在所有进程中获取AACCBB
。显然,可以用一个而不是零MPI_PROD
而不是MPI_SUM
来完成相同的技巧。