MPI调试技巧

您所在的位置:网站首页 ppsspp调试日志 MPI调试技巧

MPI调试技巧

2023-03-16 01:30| 来源: 网络整理| 查看: 265

问题背景

最近在学习MPI(由微软维护的那个msmpi,其他还有OpenMPI、MPICH等,感觉大同小异),跑了一段《并行计算与高性能计算》这本书上会导致进程死锁的代码,然后突发奇想说能不能用传统的断点调试方法看一看中间变量以及定位问题出现的位置,结果打了断点再点击调试运行,程序直接略过了断点,并且断点显示为“不可用”。(见下图)

问题描述

当时实在是百思不得其解,搜索了一圈关键词,并且也在提问区发表了问题,还是没有找到合适的解决办法,一度以为MPI调试只能依靠打日志,但C++似乎没有相关的库可以用,而且打日志也面临着几个问题:

在MPI中,直接使用cout或者printf无法实时查看输出,或许可以选择用flush函数实时刷新提示信息到控制台,但如果日志体量庞大,如何快速定位问题出现的位置也成了一大麻烦事(打印一大堆中间变量无疑会让问题变得复杂),而且控制台的输出很难再现,尤其面对一些随机出现的bug束手无策;将日志写入文件或许是一个不错的选择,但在并发环境中维护日志可能涉及IO的高频使用,甚至进程可能在竞争IO的时候发生死锁;网上也有高手分享自己编写的基于并发环境的日志系统,如果有需要肯定得自己串一遍日志的写法,当然这需要较长的时间。

gdb调试的一个明显的优越性就是查看或修改中间变量很方便,如果能结合控制台输出大致定位bug的位置,再在对应位置敲上断点,调试时就会方便得多。

解决方案:使用Clion的“附加到进程“

如果调试器为gdb,那么这个功能其实就是将gdb调试器挂载到一个正在运行的进程上,这里有一个小技巧,就是为了保证调试能同步执行,需要在断点前后加上MPI_Barrier函数使各进程同步,随后调用sleep函数(头文件为unistd.h)让所有进程暂停运行,就像这样:

插入可调试代码

暂停的时间可以尽量设长一些,这样才有充足的时间等待gdb程序命中所有进程的断点,接下来考验手速的时候到了——

以“调试”运行当前代码:调试运行开始运行后赶紧点击菜单栏的”运行”->“附加到进程”:选择相应功能在弹出列表中选择需要调试的进程(我这里创建了6个进程,可以逐个附加,也可以只调试主进程):附加进程到这里,如果之前设置的sleep时间比较长,断点可能还未命中,可以耐心等待片刻,然后就能看到常规的debug界面了:调试界面

目前来看,这个方法虽然比较麻烦,但是网上似乎也没有更好的办法可以解决多进程调试的问题,而且我个人真的喜欢clion的debug界面(不然也不会花时间琢磨如何在Clion中调试多进程了),后续如果发现什么更好的办法就会在这里更新,也期待看到这里的朋友给出相应的反馈意见。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3