首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MPI应用程序中的信号处理/优雅退出

MPI应用程序中的信号处理/优雅退出
EN

Stack Overflow用户
提问于 2015-01-18 11:18:55
回答 2查看 1.3K关注 0票数 2

如何处理safley in和MPI应用程序(例如,SIGUSR1应该告诉应用程序它的运行时已经过期,并且应该在接下来的10分钟内终止)。我有几个制约因素:

  • 在退出应用程序之前,先完成所有并行/串行IO!
  • 在所有其他情况下,应用程序可以没有任何问题地退出。

如何安全地实现这一点,在尝试退出时没有死锁,并正确地将当前上下文跳转回main()并调用MPI_FINALIZE()?不知何故,进程不得不在退出时受到攻击(我认为在多线程应用程序中也是如此),但是这是如何有效地完成而不必与很多人进行通信的呢?有人知道一些标准的方法来正确地做这件事吗?

以下是一些可能有用或不起作用的想法:

Idea 1:

假设对于每个进程,我们在信号处理程序中捕获信号,并将其推到“未处理的信号堆栈”(USS)上,然后从信号处理程序例程返回。然后,我们在应用程序中有特定的终止点,特别是在IO操作之前和之后,IO操作之后处理USS中的所有信号。例如,如果USS中有一个SIGUSR1,那么每个进程都会在终止点退出。

  • 这种想法存在的问题是仍然可能存在死锁,进程1只是捕捉终止点之前的信号,而进程2已经通过了这个点,现在正在启动并行IO。进程1将退出,这将导致进程2中的死锁(等待进程1等待退出的IO ).

Idea 2:

只有主进程0在信号处理程序中捕获信号,然后发送广播消息:“所有进程退出!”在应用程序中的特定点。所有进程都接收广播和抛出,调用mainMPI_FINALIZE中捕获的异常。

  • 这样出口就安全了,但为了保证我们是否应该退出,必须不断地接收广播信息的成本。

非常感谢!

EN

回答 2

Stack Overflow用户

发布于 2015-01-18 11:50:21

如果您的目标是在同一点停止所有进程,那么就没有办法总是在可能的终止点进行同步。也就是说,需要在终止点进行集体呼叫。

当然,您可以尝试通过使用另一个集体调用的同步来避免额外的广播,以确保正确的终止,或者将终止信息打包到现有的广播中,但我认为这不值得。毕竟,您只需要在I/O之前进行同步,并且每十分钟至少同步一次。在这样的频率下,即使广播也不是一个性能问题。

票数 1
EN

Stack Overflow用户

发布于 2015-01-19 17:26:40

一般来说,在MPI应用程序中使用信号是不安全的。一些实现可能支持它,而另一些则可能不支持它。

例如,在MPICH中,进程管理器使用SIGUSR1对异常故障进行内部通知。

http://lists.mpich.org/pipermail/discuss/2014-October/003242.html

打开MPI后,had将把SIGUSR1SIGUSR2mpiexec转发到其他进程。

http://www.open-mpi.org/doc/v1.6/man1/mpirun.1.php#sect14

其他实现将有所不同。因此,在您走得太远之前,请确保您所使用的实现能够处理它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28009086

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档