使用 MPI 终止所有进程

Posted

技术标签:

【中文标题】使用 MPI 终止所有进程【英文标题】:Terminating all processes with MPI 【发布时间】:2011-07-22 23:11:03 【问题描述】:

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

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

如何使用 MPI 做到这一点?

【问题讨论】:

与其让解决方案线程与其他线程通信,不如让它更新一个标志并让每个线程检查该标志。 【参考方案1】:

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

【讨论】:

MPI_Abord() 不是更好,因为没有持续检查所有线程的开销?【参考方案2】:

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

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

【讨论】:

以上是关于使用 MPI 终止所有进程的主要内容,如果未能解决你的问题,请参考以下文章

MPI_Rank 为所有进程返回相同的进程号

为啥我所有的开放 MPI 进程的排名都是 0?

MPI C 将矩阵逐行发送到所有进程子进程 (MPI_COMM_SPAWN)

如何在 C++ 中使用 MPI 收集字符字符串并为每个进程打印它们?

MPI:rand() 在每次运行中为所有进程提供相同的常数

MPI中每个进程的随机数