1

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

4

1 回答 1

1

是的,您正在寻找MPI_Allgather. 请注意,这recvcount不是整个接收缓冲区的长度,而是应该从一个进程接收的数据量。类似地,inMPI_Allgatherv recvcount[i]是您希望从第 i 个进程接收的数据量。此外,recvcount应该等于(不小于)各自的sendcount. 我在我的实现(OpenMPI)上对其进行了测试,如果我试图接收更少的发送元素,我会MPI_ERR_TRUNCATE出错。

同样在一些罕见的情况下,我使用MPI_Allreduce了那个 puprose。例如,如果我们有以下数组:

process0: AA0000
process1: 0000BB
process2: 00CC00

然后我们可以通过操作进行 AllreduceMPI_SUM并进入AACCBB所有进程。显然,同样的技巧可以用 1 代替 0MPI_PROD代替MPI_SUM.

于 2013-01-23T14:24:50.893 回答