我正在linux下的OpenMPI下运行分布式进程。
当一个进程终止时,mpirun将检测到这个并终止其他进程。但即使我从死亡过程中获得核心,我也没有从OpenMPI杀死的进程中获得核心。
为什么我没有获得这些其他核心文件?我怎样才能获得这些核心文件?
答案 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,如果您有一个可供使用的话。