I think this回答“如何调试 MPI 程序?”线程做你想做的事。
EDITS:
作为对评论的回应,您可以更轻松地做到这一点,尽管“简洁”并不完全是我会使用的术语:
通过 mpirun 启动独立屏幕 - 运行调试器和进程。我已调用会话 mpi,并且我正在传递我的库路径,因为它被屏幕剥离,而我的演示需要它(而且我在 Mac 上,因此 lldb 和 DYLD):
mpirun -np 4 screen -AdmS mpi env DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH lldb demo.out
然后启动一个单独的屏幕会话,我称之为“调试”:
screen -AdmS debug
Use screen -ls
列出正在运行的会话:
>> 屏幕-ls
屏幕上有:
19871.mpi(分离)
19872.mpi(分离)
19875.mpi(分离)
19876.mpi(分离)
20105.debug(已分离)
现在在调试会话中启动 4 个新选项卡,将每个选项卡附加到其中一个 mpi 会话:
screen -S debug -X screen -t tab0 screen -r 19871.mpi
screen -S debug -X screen -t tab1 screen -r 19872.mpi
screen -S debug -X screen -t tab2 screen -r 19875.mpi
screen -S debug -X screen -t tab3 screen -r 19876.mpi
然后只需附加到您的调试会话screen -r debug
。现在您有 4 个选项卡,每个选项卡都运行附加到 mpi 进程的调试器的串行实例,类似于您之前描述的 xterm 方法。它并不完全是最快的命令集,但至少你不需要修改你的代码或追逐 PID 等。
我尝试过另一种方法,但似乎不起作用:
启动独立屏幕
screen -AdmS ashell
启动两个 mpi 进程,在分离会话中启动新的屏幕选项卡,并使用我的演示 mpi 应用程序启动 lldb:
mpirun -np 1 screen -S ashell -X screen -t tab1 env DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH lldb demo.out : -np 1 screen -S ashell -X screen -t tab2 env DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH lldb demo.out
或者只是
mpirun -np 2 screen -S ashell -X screen env DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH lldb demo.out
然后附加到屏幕上
screen -r ashell
您将有 3 个选项卡,其中 2 个选项卡与您的程序一起运行 lldb,另外一个选项卡与您的标准 shell 一起运行。不幸的是,当您尝试运行程序时,每个进程都认为它是通信世界中唯一的进程,我不知道该怎么办......