MP_
05/27
本文最后更新于
2024年08月02日,已超过
248天没有更新。如果文章内容或图片资源失效,请留言反馈,我会及时处理,谢谢!
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进程号。
输出示例:
1 2 3 | [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 2 3 | [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
合并每个进程的标准错误到标准输出中。


版权属于:
MetMan's Blog
本文链接:
https://blog.metman.top/index.php/archives/108/(转载时请注明本文出处及文章链接)
作品采用:
《署名-非商业性使用-相同方式共享 4.0 国际 》许可协议授权