Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1864447
  • 博文数量: 283
  • 博客积分: 10141
  • 博客等级: 上将
  • 技术积分: 2931
  • 用 户 组: 普通用户
  • 注册时间: 2005-12-21 14:33
文章分类

全部博文(283)

文章存档

2013年(2)

2012年(2)

2011年(17)

2010年(36)

2009年(17)

2008年(18)

2007年(66)

2006年(105)

2005年(20)

分类:

2006-04-30 14:25:19

MARMOT简介――一个MPI程序检测分析工具

(C) icymoon@NKU

$Date: 2006-4-30

 

0.    并行程序编程与分析调试的困难

除了串行程序的所有问题之外,MPI并行程序还会有一些其它的问题存在:

(1)    MPI程序的复杂性

显然,并行程序要比串行程序难写,比如,一些不当的消息传递方式可能导致死锁;多进程之间的协同工作(任务的映射与分发等)导致并行程序比串行程序更难于驾驭。而且,不同版本的MPI实现中一些细节上的差异也会使问题变得更加复杂,比如,程序的可移植性。

(2)    调试并行程序的困难

  在一个gdb受到广泛赞誉的时代,调试并行程序仍然是一个有难度的问题。当不同的进程运行于不同的物理节点上的时候,单一节点上的一个debuger是无法知道进程要等待的消息何时才会到达的,也难于知道其它相关进程的运行情况(在某些程序中这是不必要的,但是在大多数程序中,这是需要的)。

 

1.      并行程序调试工具简介

目前为止,有几种不同的思路来做并行程序的调试器:

(1)    扩展传统的调试工具,对每个进程都起动一个调试器。像Totalview, DDTp2d2(这几个都不是free),还有mpigdb,是以gdb做为后台的。

(2)    提供一个MPI库的调试版。像mpich那样,检测内部错误,也检查用户的误用(比如类型不匹配等问题)。

(3)    开发单独的工具来检查MPI应用程序的问题。MPI-CHECK, Umpire,还有MARMOTMPI_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_GathervMPI_Scatterv,要检查偏移量。

    除了上述调用外,MARMOT支持了所有MPI-1.2标准中的调用,但是并没有实现所有情况的检测(这太困难了)

目前,关于死锁的检测采用的是超时机制,由调试服务进程等待并给出警告。

对于竞态条件,则列出所有的源进程调用,比如要从MPI_ANY_SOURCE接收消息的时候。MARMOT不会记录并追踪这些问题。

从测试结果来看,这样的分析调试工具效率还是很不错的。

 

4.      参考文献

[1] MPI Application Development Using The Analysis Tool MARMOT

[2]

[3] MARMOT- MPI Analysis and Checking Tool

[4]

 

5.      下载地址:

 

阅读(3561) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~