openmpi参数_MPI并行程序的调试技巧

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。

好࿰

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值