如何在 MPI 应用程序中安全地处理信号(例如 SIGUSR1,它应该告诉应用程序其运行时间已过期,并应在接下来的 10 分钟内终止。)
我有几个限制:
- 在退出应用程序之前,请先完成所有并行/串行 IO!
- 在所有其他情况下,应用程序可以毫无问题地退出
如何安全地实现这一点,在尝试退出时不会出现死锁,并正确地让当前上下文跳回到main()
并打电话MPI_FINALIZE()
?
不知何故,进程必须就退出达成一致(我认为这在多线程应用程序中是相同的),但是如何在无需进行太多通信的情况下有效地完成这一点呢?有人知道正确执行此操作的标准方法吗?
以下是一些可能有效或无效的想法:
Idea 1:
假设对于每个进程,我们在信号处理程序中捕获信号并将其推送到“未处理的信号堆栈”(USS)上,然后我们只需从信号处理程序例程返回即可。然后,我们的应用程序中有某些终止点,特别是在 IO 操作之前和之后,然后处理 USS 中的所有信号。
例如,如果 USS 中有 SIGUSR1,则每个进程将在终止点退出。
- 这个想法存在一个问题,即仍然可能存在死锁,进程 1 只是在终止点之前捕获信号,而进程 2 已经通过了该点,现在正在启动并行 IO。进程 1 将退出,这会导致进程 2 死锁(等待进程 1 退出的 IO)...
Idea 2:
只有主进程0在信号处理程序中捕获该信号,然后发送广播消息:“所有进程退出!”在应用程序中的特定点。所有进程都会收到广播并抛出并捕获异常main
and MPI_FINALIZE
叫做。
- 这样退出会安全发生,但代价是必须接收连续的广播消息来查看是否应该退出
多谢!
如果您的目标是在同一点停止所有进程,那么就无法始终在可能的终止点进行同步。即需要在端点进行集中呼叫。
当然,您可以尝试通过使用另一个集体调用的同步来确保正确终止来避免额外的广播,或者将终止信息存储在现有广播上,但我认为这不值得。毕竟,您只需要在 I/O 之前进行同步,并且至少每十分钟同步一次。在这样的频率下,即使是广播也不是性能问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)