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

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

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 作者&支持

作者:

Bettina Krammer

Katrin Bidmon

Matthias Mueller

支持:欧洲CrossGrid项目支持。

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] http://www.hlrs.de/organization/amt/projects/marmot/

[3] MARMOT- MPI Analysis and Checking Tool

[4] http://www.huihoo.com/npact/content.htm

 

5.      下载地址:

http://gridportal.fzk.de/cgi-bin/viewcvs.cgi/crossgrid/crossgrid/wp2/wp2_2-verif/src/MARMOT/

 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
# -*- coding: utf-8 -*- &quot;&quot;&quot; Transform the data type from ascii to ubyte format (8 bits unsigned binary) and save to new files, which would reduce the data size to 1/3, and would save the data transforming time when read by the python @author: Marmot &quot;&quot;&quot; import numpy as np import time from itertools import islice import pandas as pd # data_folder = '../../data/' set_list = ['train','testA','testB'] size_list = [10000,2000,2000] time1= time.time() for set_name,set_size in zip(set_list,size_list): output_file = data_folder + set_name + '_ubyte.txt' f = open(output_file, &quot;w&quot;) f.close() Img_ind = 0 input_file = data_folder + set_name +'.txt' with open(input_file) as f: for content in f: Img_ind = Img_ind +1 print('transforming ' + set_name + ': ' + str(Img_ind).zfill(5)) line = content.split(',') title = line[0] + ' '+line[1] data_write = np.asarray(line[2].strip().split(' ')).astype(np.ubyte) data_write = (data_write + 1).astype(np.ubyte) if data_write.max()>255: print('too large') if data_write.min()<0: print('too small') f = open(output_file, &quot;a&quot;) f.write(data_write.tobytes()) f.close() time2 = time.time() print('total elapse time:'+ str(time2- time1)) #%% generate train label list value_list =[] set_name = 'train' input_file = data_folder + set_name +'.txt' with open(input_file) as f: for content in f: line = content.split(',') value_list.append(float(line[1])) value_list = pd.DataFrame(value_list, columns=['value']) value_list.to_csv(data_folder + 'train_label.csv',index = False,header = False)
06-10

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值