终止所有使用MPI的进程

14

我正在使用MPI进行搜索,通过将问题空间分配给不同的线程来实现。每个线程都通过一个for循环,每次迭代都是解决方案的候选。

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

我该如何使用MPI实现这一点?


1
不要让解决方案线程与其他线程通信,可以让它更新一个标志并使每个线程检查该标志。 - pmg
2个回答

10

你可以使用MPI_Abort(MPI_COMM_WORLD)来完全关闭所有进程。一个更加可控的解决方案是,当某个进程找到解决方案时,向每个其他进程提交带有指定标记的非阻塞发送,并在每个迭代结束时使用非阻塞接收检查是否有任何人发布了这样的消息。


MPI_Abort() 不是更好吗?因为它不需要在所有线程上进行常量检查的开销。 - Kennet Celeste

3

MPI没有太多的“推送”通知,因此您无法强制其他进程(不是线程;在这种情况下很重要!)知道发生了什么。

@pmg是正确的,您可以更新每个人都可以看到的标志。如何使用MPI-2“单边消息”完成此操作,在另一个问题中使用代码进行了描述:创建跨MPI进程保持同步的计数器。您可以使用该方法,只需让每个人在继续他们的批处理进程之前检查计数器即可。请注意,这对于每个迭代的每个进程来说是大量的网络流量!另一种方法是每隔几次迭代执行allreduce或类似操作,以查看是否有人已经找到了解决方案。至少在带宽方面,这种方法更加优化,但仅在迭代可能是更或多或少同步的情况下才有效。还有一种方法是,如果某个进程找到了答案,则向所有其他进程发送消息,并在每次迭代(或每隔几次迭代)测试是否存在这样的消息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接