如何处理safley in和MPI应用程序(例如,SIGUSR1应该告诉应用程序它的运行时已经过期,并且应该在接下来的10分钟内终止)。我有几个制约因素:
如何安全地实现这一点,在尝试退出时没有死锁,并正确地将当前上下文跳转回main()并调用MPI_FINALIZE()?不知何故,进程不得不在退出时受到攻击(我认为在多线程应用程序中也是如此),但是这是如何有效地完成而不必与很多人进行通信的呢?有人知道一些标准的方法来正确地做这件事吗?
以下是一些可能有用或不起作用的想法:
Idea 1:
假设对于每个进程,我们在信号处理程序中捕获信号,并将其推到“未处理的信号堆栈”(USS)上,然后从信号处理程序例程返回。然后,我们在应用程序中有特定的终止点,特别是在IO操作之前和之后,IO操作之后处理USS中的所有信号。例如,如果USS中有一个SIGUSR1,那么每个进程都会在终止点退出。
Idea 2:
只有主进程0在信号处理程序中捕获信号,然后发送广播消息:“所有进程退出!”在应用程序中的特定点。所有进程都接收广播和抛出,调用main和MPI_FINALIZE中捕获的异常。
非常感谢!
发布于 2015-01-18 11:50:21
如果您的目标是在同一点停止所有进程,那么就没有办法总是在可能的终止点进行同步。也就是说,需要在终止点进行集体呼叫。
当然,您可以尝试通过使用另一个集体调用的同步来避免额外的广播,以确保正确的终止,或者将终止信息打包到现有的广播中,但我认为这不值得。毕竟,您只需要在I/O之前进行同步,并且每十分钟至少同步一次。在这样的频率下,即使广播也不是一个性能问题。
发布于 2015-01-19 17:26:40
一般来说,在MPI应用程序中使用信号是不安全的。一些实现可能支持它,而另一些则可能不支持它。
例如,在MPICH中,进程管理器使用SIGUSR1对异常故障进行内部通知。
http://lists.mpich.org/pipermail/discuss/2014-October/003242.html
打开MPI后,had将把SIGUSR1和SIGUSR2从mpiexec转发到其他进程。
http://www.open-mpi.org/doc/v1.6/man1/mpirun.1.php#sect14
其他实现将有所不同。因此,在您走得太远之前,请确保您所使用的实现能够处理它。
https://stackoverflow.com/questions/28009086
复制相似问题