导致在OpenMPI下运行的所有进程转储核心

时间:2014-08-12 22:57:54

标签: linux openmpi

我正在linux下的OpenMPI下运行分布式进程。

当一个进程终止时,mpirun将检测到这个并终止其他进程。但即使我从死亡过程中获得核心,我也没有从OpenMPI杀死的进程中获得核心。

为什么我没有获得这些其他核心文件?我怎样才能获得这些核心文件?

2 个答案:

答案 0 :(得分:0)

其他进程刚被Open MPI杀死。他们并没有自我分裂。从MPI的角度来看,他们的执行是错误的,但从C的角度来看,这很好。因此,他们没有理由倾销核心。

答案 1 :(得分:0)

OMPI mpiexec通过先发送SIGTERM然后SIGKILL(如果其中任何一个幸存SIGTERM)来杀死其余排名。这些信号都不会导致核心被倾倒。您可以为调用SIGTERM的{​​{1}}安装一个信号处理程序,以便在kill时强制执行核心转储。

以下是一些适用于Open MPI 1.6.5的示例代码:

abort(3)

打开MPI #include <stdlib.h> #include <signal.h> #include <mpi.h> void term_handler (int sig) { // Restore the default SIGABRT disposition signal(SIGABRT, SIG_DFL); // Abort (dumps core) abort(); } int main (int argc, char **argv) { int rank; MPI_Init(&argc, &argv); // Override the SIGTERM handler AFTER the call to MPI_Init signal(SIGTERM, term_handler); MPI_Comm_rank(MPI_COMM_WORLD, &rank); // Cause division-by-zero exception in rank 0 rank = 1 / rank; // Make other ranks wait for rank 0 MPI_Bcast(&rank, 1, MPI_INT, 0, MPI_COMM_WORLD); MPI_Finalize(); return 0; } 为某些已知信号安装特殊处理程序,这些信号可以打印有用的调试信息或生成回溯文件(MPI_Init)。这就是为什么.btr处理程序必须在调用SIGTERM之后安装MPI_Init的默认操作(由{{1}使用} }}必须在调用SIGABRT之前恢复。

请注意,信号处理程序将出现在核心文件中调用堆栈的顶部:

abort(3)

我宁愿建议您使用并行调试器,例如TotalView或DDT,如果您有一个可供使用的话。