在 MPI 中,如何将"shared"数组的一部分传达给所有其他等级?



我有一个带有一些数据数组的 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 .

相关内容

最新更新