debug一个并行程序(parallel program)向来是件很麻烦的事情(Erlang等functional programming language另当别论),
对于像MPI这种非shared memory的inter-process model来说尤其如此。
与调试并行程序相关的工具
非开源工具
目前我所了解的商业调试器(debugger)有:
据说parallel debug的能力很屌,
本人没用过表示不知,
说不定只是界面做得好看而已。
不过我想大部分人应该跟本屌一样是用不起这些商业产品的,
高富帅们请无视。
以下我介绍下一些有用的open source工具:
开源工具
首先推荐valgrind的memcheck。
大部分MPI标准的实现(implementation)(如openmpi、mpich)支持的是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所指定的大小等等,
我想你的那些方法应该对这些不管用吧?。
这里假设你已经安装并配置好了memcheck,例如如果你用的是openmpi,那么执行以下命令
ompi_info | grep memchecker
会得到类似
MCA memchecker: valgrind (MCA v2.0, API v2.0, Component v1.6.4)
使用memcheck需要在compile时下-g参数。
运行memcheck用下面的命令:
mpirun [mpirun-args] valgrind [valgrind-args] [app-args]
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
执行这个命令会打开跟所指定的进程数目一样多的终端——一下子蹦出这么多终端,神烦~——每个终端都跑有gdb。
我试过这个方式,它不支持application带有参数的[app-args]情况,
而且进程跑在不同机器上也无法正常跑起来——这一点openmpi的FAQ已经有比较复杂的解决方案。
mpich2支持:
mpirun -gdb
但在mpich较新的版本中,该package的进程管理器(process manager)已经从MPD换为Hydra,这个-gdb的选项随之消失。
详情请猛戳这个链接(http://trac.mpich.org/projects/mpich/ticket/1150)。
像我机器上的mpich版本是3.0.3,所以这个选项也就不能用了。
如果你想试试可以用包含MPD的旧版mpich。
好