【问题标题】:Synchronazing data between all MPI tasks在所有 MPI 任务之间同步数据
【发布时间】:2015-08-07 09:41:47
【问题描述】:

假设我们将一个寻找最大值的问题分成 n 个部分,n 个任务中的每个任务都有一个变量 localmax,用于找到某种最大值。 localmax 越接近实际最大值,程序找到原始最大值的速度就越快,因此保持 localmax 等于最大 localmax是有好处的> 所有任务的价值。有哪些可行的方法来实现这一点? 这是算法的示例伪代码

while(!isWorkFinished()){
  possibleMax = lookForMax(localmax);
  if(possibleMax > localmax){
    localmax = possibleMax;
  }
}

显然,在每次迭代之后发送和接收 localmax 是个坏主意,因为大部分时间会浪费在通信上,而不是计算上。我可以每 k 次迭代进行一次同步,但是如何实现同步呢?一个完美的场景是,如果任何任务在任何时候都可以接收到当前最大的 globalMax,如果它小于 localMax 然后发送 localMax 来更新 globalMax 在主任务中。在代码中:

MPI_Recv(&globalMax, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
if(localMax > globalMax){
    MPI_Send(&localMax, 1, MPI_INT, 0, 0, MPI_COMM_WORLD);
}

但我想不出办法让它发挥作用。也许是因为我对 MPI 很陌生。

另一种思路是用master task发送localMax的所有值,然后广播最大的那个?我想在这种情况下可以使用 reduce 函数,但这是个好主意吗?如果可能的话,我不想使用屏障操作(不要等到每个任务都做某事),因为我预测它真的会减慢一切。

【问题讨论】:

  • 我认为没有理想的一刀切解决方案。您的问题与设计分布式分支定界算法非常相似:谷歌搜索导致我找到rci.rutgers.edu/~yannis/publications/distributed%20abb.pdf(35 页)和citeseerx.ist.psu.edu/viewdoc/…(47 页)等。
  • 是的,它实际上是一个分支定界算法。我去看看这些文件,谢谢
  • 不客气。如果您在其中发现任何有用的东西,我鼓励您为自己的问题写一个答案来总结它!

标签: algorithm parallel-processing synchronization mpi


【解决方案1】:

非阻塞通信可能是您的朋友!

使用根等级。

从这里开始假设:

  1. 当我说所有等级时,我实际上是指除根之外的所有等级
  2. 我指的是所有非阻塞通信。

Post 接收来自所有等级的根等级,以及来自根等级的所有等级。

在所有等级的每 N 次迭代中 Ping 接收。如果从 root rank 接收到一个值,如果它更大,则与您的本地最大值进行比较并替换。

每当一个等级发现比存储的更大的数字时,让它将其新的最大值发送到根等级。

让根等级循环通过其所有接收帖子。如果它接收到一个值,将它与它看到的根最大值进行比较。如果该值大于收到的值,则将其替换并发送给所有等级。

不会有任何好的同步。所有等级的实际最大值可能略有滞后,但 100% 准确并不重要。

听起来像是一个有趣的并行问题。祝你好运!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-26
    • 1970-01-01
    • 1970-01-01
    • 2020-06-18
    相关资源
    最近更新 更多