原文地址: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>解决方案。