TypechoJoeTheme

MetMan's Blog

网站页面

MPI程序调试小技巧

MetMan博 主
2024-05-27
/
0 评论
/
197 阅读
/
317 个字
/
百度已收录
05/27
本文最后更新于 2024年08月02日,已超过 48天没有更新。如果文章内容或图片资源失效,请留言反馈,我会及时处理,谢谢!

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 合并每个进程的标准错误到标准输出中。
DEBUGmpi
朗读
赞(0)
赞赏
感谢您的支持,我会继续努力哒!
版权属于:

MetMan's Blog

本文链接:

https://blog.metman.top/index.php/archives/108/(转载时请注明本文出处及文章链接)

评论 (0)

互动读者

标签云

最新回复

暂无回复

登录
X
用户名
密码