我有一个带有一些数据数组的 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_Bcasts呢?
编辑:我可能只是发现了一个提示...是我要找MPI_Allgather吗?
是的,您正在寻找MPI_Allgather
.请注意,recvcount
不是整个接收缓冲区的长度,而是应从一个进程接收的数据量。类似地,MPI_Allgatherv
recvcount[i]
是您希望从第 i 个进程接收的数据量。此外,recvcount
应等于(不小于)相应的sendcount
。我在实现(OpenMPI)上对其进行了测试,如果我尝试接收较少发送的元素,则会出现MPI_ERR_TRUNCATE
错误。
同样在极少数情况下,我用MPI_Allreduce
来制作那个木偶。例如,如果我们有以下数组:
process0: AA0000
process1: 0000BB
process2: 00CC00
然后,我们可以通过MPI_SUM
操作来执行Allreduce,并在所有过程中获得AACCBB
。显然,同样的技巧可以用 1 而不是 0 和 MPI_PROD
而不是 MPI_SUM
.