分类:
2006-04-30 14:25:19
MARMOT简介――一个MPI程序检测分析工具
(C) icymoon@NKU
$Date:
0. 并行程序编程与分析调试的困难
除了串行程序的所有问题之外,MPI并行程序还会有一些其它的问题存在:
(1) MPI程序的复杂性
显然,并行程序要比串行程序难写,比如,一些不当的消息传递方式可能导致死锁;多进程之间的协同工作(任务的映射与分发等)导致并行程序比串行程序更难于驾驭。而且,不同版本的MPI实现中一些细节上的差异也会使问题变得更加复杂,比如,程序的可移植性。
(2) 调试并行程序的困难
在一个gdb受到广泛赞誉的时代,调试并行程序仍然是一个有难度的问题。当不同的进程运行于不同的物理节点上的时候,单一节点上的一个debuger是无法知道进程要等待的消息何时才会到达的,也难于知道其它相关进程的运行情况(在某些程序中这是不必要的,但是在大多数程序中,这是需要的)。
1. 并行程序调试工具简介
目前为止,有几种不同的思路来做并行程序的调试器:
(1) 扩展传统的调试工具,对每个进程都起动一个调试器。像Totalview, DDT,p2d2(这几个都不是free的),还有mpigdb,是以gdb做为后台的。
(2) 提供一个MPI库的调试版。像mpich那样,检测内部错误,也检查用户的误用(比如类型不匹配等问题)。
(3) 开发单独的工具来检查MPI应用程序的问题。MPI-CHECK, Umpire,还有MARMOT。MPI_CHECK目前支持fortran,而Umpire只限于共享内存的平台。
2. MARMOT简介
2.1 作者&支持
作者:
支持:欧洲项目支持。
2.2 设计目标&主要功能
Portability: 检查程序是否遵循MPI标准,以确认程序能运行于任何平台。
Scalability: 不需要用户干涉而使调试器在多个进程中运行。
Reproducibility: 检测可能的竞态条件与死锁。
2.3 设计结构图(出自[3])
3. 对MPI程序的检查内容
MARMOT使用一个额外的进程做调试进程,不需要更改任何应用程序的源码,而是通过MPI的“profiling”接口(MPI_PCONTROL)来截获MPI调用然后进行分析。
(1) MPI环境(MPI_Init, MPI_Get_processor_name, MPI_Finalize):
检查在MPI_Init前和MPI_Finalize之后是否有不恰当的MPI调用,以及MPI_Init是否被多次调用。目前为止,对MPI_Get_processor_name没有任何检查。
(2) 通信环境(MPI_Comm_size, MPI_Comm_rank, MPI_Barrier):
检查一个MPI通信域是否合法,比如不能用MPI_COMM_NULL,如果是用户自定义的通信域,要看创建得是否合适并且在使用时没被释放掉。
(3) 数据类型的构造(MPI_Type_extent, MPI_Type_struct, MPI_Type_hvector, MPI_Type_commit):
检测调用参数的类型是否合法,对于MPI_Type_struct, MPI_Type_hvector,还要检查数据长度与个数是否大于0。还要防止MPI_Type_commit重复递交已经递交过的数据类型。
(4) 点对点通信(MPI_Sent, MPI_Recv, MPI_Sendrecv):
检查调用参数是否合法,包括通信域、标识、数据类型、数量,源/目标进程等。数据类型不能是MPI_DATATYPE_NULL,数据的数量与长度也不能小于或等于0,标识与进程号也不可以超出范围。
还有一个要考虑的问题是不同的MPI实现中,发送与接收消息(标准模式)给的缓冲区大小不同,这就给程序的可移植性带来问题。所以,最好不要过分依赖于MPI实现中给出的缓冲区。
(5) 其它一些操作(MPI_Bcast, MPI_Reduce, MPI_Gather, MPI_Gatherv, MPI_Scatterv):
除了检查(4)中提到的参数外,还要检查root进程是否合法,对一MPI_Reduce,还得检查operator是否合法,而对于MPI_Gatherv和MPI_Scatterv,要检查偏移量。
除了上述调用外,MARMOT支持了所有MPI-1.2标准中的调用,但是并没有实现所有情况的检测(这太困难了)。
目前,关于死锁的检测采用的是超时机制,由调试服务进程等待并给出警告。
对于竞态条件,则列出所有的源进程调用,比如要从MPI_ANY_SOURCE接收消息的时候。MARMOT不会记录并追踪这些问题。
从测试结果来看,这样的分析调试工具效率还是很不错的。
4. 参考文献
[1] MPI Application Development Using The Analysis Tool MARMOT
[2]
[3]
[4]
5. 下载地址: