【发布时间】: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