MPI程序调试小技巧
05/27
本文最后更新于
2024年08月02日,已超过
211天没有更新。如果文章内容或图片资源失效,请留言反馈,我会及时处理,谢谢!
MPI并行程序调试除了使用专业的并行调试器(Totalview、DDT)外,可能还是print大法用的多。对于MPI程序调试,我们通常需要知道输出的信息来自哪个进程,一般会在输出语句中加上进程号信息。
write(0,*) "Task from ",pid,":debug info ..."
但这需要引入表示进程号的变量(通常这会引入其它模块变量),如果输出的诊断信息太多每个都加变量也很麻烦。
如果希望自动输出进程号信息,可以尝试每个MPI实现附带的功能。
- Intel MPI/MVAPICH2/MPICH
Intel MPI/MVAPICH2/MPICH三种MPI实现的mpirun
都提供一个选项-prepend-rank
能够实现在输出信息前自动添加进程号,在标准输出/错误每一行前面添加MPI rank进程号。
输出示例:
[6] Hello from rank 6, on cmac0483. (core affinity = 38)
[13] Hello from rank 13, on cmac0483. (core affinity = 45)
[34] Hello from rank 34, on cmac0483. (core affinity = 18)
- OpenMPI
OpenMPI的mpirun
提供了一个选项--tag-output
(或者-tag-output
)实现类似功能。
标准输出/错误每一行输出使用[jobid, MCW_rank]<stdxxx>
进行标记,其中jobid是进程任务号,MCW_rank是MPI_COMM_WORLD通信域的rank进程号,stdxxx表示标准I/O类型。
输出示例:
[1,57]<stdout>:Hello from rank 57, on cmac0388. (core affinity = 57)
[1,53]<stdout>:Hello from rank 53, on cmac0388. (core affinity = 53)
[1,37]<stdout>:Hello from rank 37, on cmac0388. (core affinity = 37)
OpenMPI的mpirun还有几个管理标准I/O的选项比较实用:
-timestamp-output
或--timestamp-output
每一行输出标记时间戳。-output-filename
或--output-filename
每个进程的标准输出/错误存放到单独的文件中。-merge-stderr-to-stdout
或--merge-stderr-to-stdout
合并每个进程的标准错误到标准输出中。

