Debugging 如何在错误终止之前调试MPI程序? 我现在正在开发一个用MPI+pTrac范例编写的C++程序。

Debugging 如何在错误终止之前调试MPI程序? 我现在正在开发一个用MPI+pTrac范例编写的C++程序。,debugging,mpi,Debugging,Mpi,我在程序中添加了一些功能,但是一个MPI进程发出了错误的终止消息,如下所示: =================================================================================== = BAD TERMINATION OF ONE OF YOUR APPLICATION PROCESSES = PID 37805 RUNNING AT node165 = EXIT CODE: 11 = CLEANING UP REM

我在程序中添加了一些功能,但是一个MPI进程发出了错误的终止消息,如下所示:

===================================================================================
=   BAD TERMINATION OF ONE OF YOUR APPLICATION PROCESSES
=   PID 37805 RUNNING AT node165
=   EXIT CODE: 11
=   CLEANING UP REMAINING PROCESSES
=   YOU CAN IGNORE THE BELOW CLEANUP MESSAGES
===================================================================================
[proxy:0:0@node162] HYD_pmcd_pmip_control_cmd_cb (pm/pmiserv/pmip_cb.c:887): assert (!closed) failed
[proxy:0:0@node162] HYDT_dmxu_poll_wait_for_event (tools/demux/demux_poll.c:76): callback returned error status
[proxy:0:2@node166] HYD_pmcd_pmip_control_cmd_cb (pm/pmiserv/pmip_cb.c:887): assert (!closed) failed
[proxy:0:2@node166] HYDT_dmxu_poll_wait_for_event (tools/demux/demux_poll.c:76): callback returned error status
[proxy:0:2@node166] main (pm/pmiserv/pmip.c:202): demux engine error waiting for event
srun: error: node162: task 0: Exited with exit code 7
[proxy:0:0@node162] main (pm/pmiserv/pmip.c:202): demux engine error waiting for event
srun: error: node166: task 2: Exited with exit code 7
[mpiexec@node162] HYDT_bscu_wait_for_completion (tools/bootstrap/utils/bscu_wait.c:76): one of the processes terminated badly; aborting
[mpiexec@node162] HYDT_bsci_wait_for_completion (tools/bootstrap/src/bsci_wait.c:23): launcher returned error waiting for completion
[mpiexec@node162] HYD_pmci_wait_for_completion (pm/pmiserv/pmiserv_pmci.c:218): launcher returned error waiting for completion
[mpiexec@node162] main (ui/mpich/mpiexec.c:340): process manager error waiting for completion
我的问题是,我不知道为什么会有这样的信息,因此也不知道如何纠正它

我只使用MPI中的一些基本函数,并确保没有使用MPI调用的线程(只允许我的“主进程”调用此类函数)

我还检查了一个进程是否不向自身发送消息,以及在发送消息之前是否存在进程目标

我的问题很简单:如何知道问题来自哪里,然后调试我的应用程序


非常感谢。

您的一个进程出现了分段错误。这意味着读取或写入不允许读取的内存区域

这就是原因,MPI函数在第一次使用时通常很难正确执行-例如,可能是大小或位置不正确的MPI发送和接收函数

最好的解决方案是启动一个并行调试器,以便您可以监视所有进程。看起来您使用的是正确的HPC系统,因此系统上可能安装了一个——ddt或totalview是最流行的


首先看一下

,您可以强制生成一个内核
ulimit-c unlimited;MPI运行…
并使用
gdb
对其进行事后调试(例如,不需要并行调试器)。如果错误没有任何意义,请尝试
ulimit-s unlimited;mpirun…
并查看是否有帮助。ulimit不会那么容易工作:示例位于两个节点上(node162是mpirun,但node165是它崩溃的地方),而ulimit不会一直运行到node165。您可以(对于大多数MPI)让mpirun执行脚本,设置ulimit-c,然后执行应用程序。注意:ulimit-c对于HPC不是一个好的实践,因为当您进入更高的规模时,每个进程可能会同时崩溃,并生成Gb的核心转储文件,这些文件都会同时写入文件系统。在配置良好的集群上,ulimit是从
mpirun
传播的。显然,
ulimit-c unlimited
不应该是默认值。除非你有无限的预算,(商业)并行调试器也不能扩展。