使用MPI终止所有进程

我正在使用MPI来搜索解决方案,以便在不同线程之间划分问题空间。 每个线程都经过一个for循环,每次迭代都是解决方案的候选者。

问题是,当一个线程找到解决方案时,我希望它通知其他线程并且它们应该立即终止(或者至少在它们当前迭代结束时 – 或者下一个的开始)。

我怎么能用MPI做到这一点?

您可以使用MPI_Abort(MPI_COMM_WORLD)完全关闭所有内容。 一个更受控制的解决方案是将进程在发现解决方案时将带有指定标记的非阻塞发送发布到每个其他进程,并且每个进程在迭代结束时检查非阻塞接收是否已发布此类消息任何人。

MPI没有太多的“推送”通知,所以你不能真正强迫其他进程(不是线程;在这种情况下的一个重要区别!)来知道发生了什么。

@pmg是对的,你可以更新每个人都可以看到的标志。 如何使用MPI-2“单面消息”用另一个问题的代码描述: 创建一个在MPI进程中保持同步的计数器 。 你可以使用这种方法,让每个人在继续他们的批处理之前检查计数器。 请注意,每次迭代的每个进程都有很多网络流量! 另一种方法是每隔几次迭代就可以进行allreduce或类似的事情来查看是否有人遇到了解决方案。 至少在带宽方面稍微优化一下,但只有在迭代可能或多或少同步时才能很好地工作。 另一种方法是如果一个进程在找到答案后向所有其他人发送消息,并在每次迭代(或每几次)中测试这样的消息。