MPI并行程序的调试技巧

本文介绍了如何调试MPI并行程序,包括使用Valgrind Memcheck检查内存错误和message passing问题,以及如何利用gdb进行调试。文中提供了开源工具如Valgrind和Parallel Application Debugger(padb)的使用方法,并给出了在源代码中设置hook以暂停程序的技巧。此外,还讨论了在没有debugger的情况下如何使用gdb进行调试。
摘要由CSDN通过智能技术生成

原文地址:http://galoisplusplus.gitcafe.com/blog/2013/06/08/mpi-debug-tips/


debug一个并行程序(parallel program)向来是件很麻烦的事情(```Erlang```等functional programming language另当别论),
对于像MPI这种非shared memory的inter-process model来说尤其如此。


## 与调试并行程序相关的工具 ##


### 非开源工具 ###


目前我所了解的商业调试器(debugger)有:


- [TotalView](http://www.roguewave.com/products/totalview.aspx)
- [Allinea DDT](http://www.allinea.com/products/ddt/)


据说parallel debug的能力很屌,
本人没用过表示不知,
<del>说不定只是界面做得好看而已</del>。
不过我想大部分人应该跟本屌一样是用不起这些商业产品的,
<del>高富帅们请无视</del>。
以下我介绍下一些有用的open source工具:


### 开源工具 ###


#### - [Valgrind Memcheck](http://valgrind.org) #####


首先推荐```valgrind```的```memcheck```。
大部分MPI标准的实现(implementation)(如[openmpi](http://www.open-mpi.org/)、[mpich](http://www.mpich.org/))支持的是C、C++和Fortran语言。
Fortran语言我不了解,但C和C++以复杂的内存管理(memory management)见长可是出了名的XD。
有些时候所谓的MPI程序的bug,不过是一般sequential程序常见的内存错误罢了。
这个时候用memcheck检查就可以很容易找到bug的藏身之处。
你可能会争论说你用了RAII(Resource Allocation Is Initialization)等方式来管理内存,
不会有那些naive的问题,
但我还是建议你使用memcheck检查你程序的可执行文件,
因为memcheck除了检查内存错误,
还可以检查message passing相关的错误,
例如:MPI\_Send一块没有完全初始化的buffer、
用来发送消息的buffer大小小于MPI\_Send所指定的大小、
用来接受消息的buffer大小小于MPI\_Recv所指定的大小等等,
<del>我想你的那些方法应该对这些不管用吧?</del>。


这里假设你已经安装并配置好了memcheck,例如如果你用的是openmpi,那么执行以下命令


```bash
ompi_info | grep memchecker
```
会得到类似


```bash
MCA memchecker: valgrind (MCA v2.0, API v2.0, Component v1.6.4)
```
的结果。
否则请参照[Valgrind User Manual 4.9. Debugging MPI Parallel Programs with Valgrind](http://valgrind.org/docs/manual/mc-manual.html#mc-manual.mpiwrap)进行配置。


使用memcheck需要在compile时下```-g```参数。
运行memcheck用下面的命令:
```
mpirun [mpirun-args] valgrind [valgrind-args] <application> [app-args]
```


<!-- more -->


#### - [Parallel Application Debugger](http://padb.pittman.org.uk/) ####


padb其实是个job monitor,它可以显示MPI message queue的状况。
推荐padb的一大理由是它可以检查deadlock。


## 使用gdb ##


假设你没有parallel debugger,不用担心,我们还有gdb这种serial debugger大杀器。


首先说说mpirun/mpiexec/orterun所支持的打开gdb的方式。


openmpi支持:
```
mpirun [mpirun-args] xterm -e gdb <application>
```
执行这个命令会打开跟所指定的进程数目一样多的终端——一下子蹦出这么多终端,神烦~——每个终端都跑有gdb。
我试过这个方式,它不支持application带有参数的[app-args]情况,
而且进程跑在不同机器上也无法正常跑起来——这一点[openmpi的FAQ](http://www.open-mpi.org/faq/?category=debugging)已经有<del>比较复杂的</del>解决方案。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值