在MPI中如何将“共享”数组的一部分传递给所有其他等级?

时间:2013-01-23 11:25:09

标签: mpi broadcast

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

1 个答案:

答案 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来完成相同的技巧。