让我们说,我们将找到最大值的问题分成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很新。
另一个想法是使用主任务发送 localMax 的所有值,然后广播最大的一个?我想在这种情况下可以使用reduce函数,但这是一个好主意吗?如果可能的话,我不想使用屏障操作(不要等到每个任务都做了什么),因为我预测它会真的减慢一切。
答案 0 :(得分:0)
非阻塞沟通可能是你的朋友!
使用根级别。
从这里开始假设:
发布从所有排名中获得根级别,并从根级别获得所有级别。
在所有等级的每N次迭代上ping接收。如果从根级别收到一个值,则比较并替换为您的本地最大值(如果它更大)。
每当排名找到的数字大于存储的排名时,请将其新的最大值发送到根排名。
让根级别循环通过其所有接收帖子。如果它收到一个值,则将它与它看到的根最大值进行比较。如果该值大于收到的值,请将其替换并发送给所有级别。
没有任何好的同步。所有等级的实际最大值可能略有滞后,但100%准确并不重要。
听起来像一个有趣的并行问题。祝你好运!