使用MPI终止所有进程

Ami*_*hum 12 c multithreading mpi

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

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

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

sus*_*att 9

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


Jon*_*rsi 3

MPI 没有太多“推送”通知的方式,因此您无法真正强制其他进程(不是线程;在这种情况下是一个重要的区别!)知道发生了某些事情。

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