C程序并行区域的检测方法

文档序号:8223421阅读:246来源:国知局
C程序并行区域的检测方法
【技术领域】
[0001] 本发明涉及计算机技术领域,更具体地说,它涉及一种C程序并行区域的检测方 法。
【背景技术】
[0002] 并行处理是计算机系统中能同时执行两个或更多个处理机的一种计算方法。处理 机可同时工作于同一程序的不同方面。并行处理的主要目的是节省大型和复杂问题的解决 时间。为使用并行处理,首先需要对程序进行并行化处理,也就是说将工作各部分分配到不 同处理机中。而主要问题是并行是一个相互依靠性问题,而不能自动实现,因此我们需要对 程序实施并行化。
[0003] 要想对C程序并行化,应该首先确定并行区域,而并行区域的确定要借助于对程 序的分析。
[0004] 程序分析有很多种类,按照分析出现的时机可以分为静态分析和动态分析。
[0005] 静态分析是指分析程序的源代码或机器码,而不去运行它。有很多工具可以用来 进行静态分析,比如gcc、lint、cflow等,它们可以检查类型、分析程序控制流。
[0006] 动态分析是指在程序运行时分析它。动态分析的工具包括gprof、valgrind等。 它们会在代码中加入额外的分析代码,然后把分析结果以元数据的形式保存起来。
[0007] 静动态分析方法互为补充。静态分析方法更为深入,因为它可以考虑整个程序的 结构,而不只是动态执行的部分;而动态分析方法更精确,因为它是执行在实际数据上的, 而不像静态分析一样需要猜测。
[0008] 按照分析的代码类型,程序分析可以分为源代码分析和二进制分析。
[0009] 源代码分析就是指在源代码的级别进行程序分析,很多静态分析工具都是在源代 码级别进行分析的,它们着眼于编程语言的结构,如函数、语句、表达式、变量等。
[0010] 二进制分析是在机器码的层面上进行的,对象可以是目标文件,可以是可执行文 件,也可以是字节码。二进制分析着眼于机器的入口结构,比如进程、指令、寄存器和内存地 址。
[0011] 源代码分析和二进制分析也是互补的,前者平台无关而语言相关,后者语言无关 而平台相关。
[0012] 并行区域检测包括对数据并行区域、任务并行区域、流水并行区域的检测。现存 的并行区域检测方法多是在编译期间进行静态检测,如LLVM。LLVM是Low Level Virtual Machine的简称,是一个编译器的基础框架,它为任意一种编程语言写成的程序,利用虚拟 技术,创造出编译时期、链接时期、执行时期以及"闲置时期"的最佳化。LLVM属于编译器的 中间层,它的输入是编译器的中间代码,再输出经过优化的代码。然后再被编译器转化为机 器相关的汇编代码。LLVM还提供许多编译器以外的功能,比如一些静态分析工具,可以帮助 程序员找出源代码中的漏洞,以及源程序的模块间依赖关系。但这种基于LLVM的静态分析 工具采用自底向上的策略,分析出来的数据可读性差,模块繁多,正确性难以验证,不利于 理解和掌握。而且对于指针和数组的间接访问,会有所遗漏。
[0013]总体来说,已有的程序结构分析和并行区域检测方法存在以下缺点:1、数据可读 性差;2、没有针对循环结构的分析;3、动静态分析没有结合。

【发明内容】

[0014] 本发明的目的是针对现有的程序分析工具无法生成适合于并行化分析的程序调 用图的问题,提出一种动静态结合的检测方法,该方法能够在得到以函数和循环为单元的 程序调用图的基础上,进一步动态分析程序各部分各种粒度并行的可能性。
[0015] 一种C程序并行区域的检测方法,包括以下步骤:
[0016] (1)对源文件中系统头文件以外的部分进行预编译;
[0017] (2)将预编译后的源代码连同系统头文件进行编译并进行动态分析;
[0018] (3)向预编译后得到的源代码中插入动态分析结果,得到中间文件;
[0019] (4)对所述中间文件进行静态分析,生成程序调用图;
[0020] (5)结合所述程序调用图,检测C程序中的任务并行区域、流水任务并行区域以及 数据并行区域。
[0021] 本发明中步骤(1)?(4)为程序结构分析部分,步骤(5)为并行区域检测部分,下 面分别对两部分进行说明。
[0022] 程序结构分析部分
[0023] 步骤(1)中首先要对源代码进行预编译,否则可能会不符合语法,或者会给出错 误的分析结果,因为无法把宏名转换为相应的函数名。为了不引入无谓的系统库头文件,要 把其引用注释掉,仅针对源文件中系统头文件以外的部分进行预编译。
[0024] 可选的,在预编译前,对系统头文件进行屏蔽,在预编译后解除对系统头文件的屏 蔽。
[0025] 屏蔽系统头文件的方法为在源代码中#include〈>前加上#pragma akira,预编译 后去掉 #pragma akira。
[0026] #pragma指令是预编译指令,它的作用是设定编译器的状态或者是指示编译器完 成一些特定的动作。#pragma不受预处理影响,所以可以保留后面的include语句。为了区 分本工具添加的#pragma和程序本身的#pragma,这里在#pragma后面添加特殊的字符串 akira。然后进行预编译,这里调用gcc的预处理器,调用方法为gcc-E。步骤(2)中,首先 解除对系统头文件的屏蔽,即去掉加上akira指令,加上和去掉#pragma akira 指令都是通过正则表达式完成的。
[0027] 解除对系统头文件的屏蔽后连同预编译后的源代码进行编译,并调用Callgrind 进行动态分析。所述动态分析的结果至少包括各语句的开销。
[0028] 步骤(3)中可以编写脚本对步骤(2)的动态分析结果调用,并且利用源代码的行 号信息,向预编译后得到的源代码中插入各语句的开销。
[0029] 具体方法为,以注释的形式将各语句的开销加到相应语句的左侧。
[0030] 注释格式如下:
[0031] /*>〈 \d* ? >〈*/
[0032] 其中,\d*?代表任意多个连续的数字,代表该条语句的开销(在这里,开销指耗 费的CPU周期数)。然后,把所有加入注释的源文件合并为一个中间文件。该中间文件的形 式如下:
【主权项】
1. 一种c程序并行区域的检测方法,其特征在于,包括W下步骤: (1) 对源文件中系统头文件W外的部分进行预编译; (2) 将预编译后的源代码连同系统头文件进行编译并进行动态分析; (3) 向预编译后得到的源代码中插入动态分析结果,得到中间文件; (4) 对所述中间文件进行静态分析,生成程序调用图; (5) 结合所述程序调用图,检测C程序中的任务并行区域、流水任务并行区域W及数据 并行区域。
2. 根据权利要求1所述的C程序并行区域的检测方法,其特征在于,步骤(1)中,在预 编译前,对系统头文件进行屏蔽,在预编译后解除对系统头文件的屏蔽。
3. 根据权利要求2所述的C程序并行区域的检测方法,其特征在于,屏蔽系统头文件的 方法为在源代码中#includeO前加上牠ragma akira,预编译后去掉牠ragma akira。
4. 根据权利要求1所述的C程序并行区域的检测方法,其特征在于,所述动态分析的结 果至少包括各语句的开销。
5. 根据权利要求4所述的C程序并行区域的检测方法,其特征在于,步骤(3)中,W注 释的形式将各语句的开销加到相应语句的左侧。
6. 根据权利要求1所述的C程序并行区域的检测方法,其特征在于,步骤(4)中,分析 中间文件可得到AST,遍历该AST得到调用树,对调用树进行遍历,转化为图形描述文件格 式,再转化为图片格式的程序调用图。
7. 根据权利要求1所述的C程序并行区域的检测方法,其特征在于,步骤巧)中,针对 写操作,检测对于连续地址的连续写操作,如果连续写入的地址相差恒定不变,那么在连续 写入次数超过阔值之后,就将当前区域判定为数据并行区域。
8. 根据权利要求1所述的C程序并行区域的检测方法,其特征在于,步骤巧)中,针对 读操作,检测两个连续地址的连续读操作,如果每个连续地址上连续读的地址相差恒定不 变,那么在连续读次数超过阔值之后,就将当前区域判定为数据并行区域。
9. 根据权利要求1所述的C程序并行区域的检测方法,其特征在于,步骤巧)中,任务 并行检测时,对两个任务进行判断,若该两个任务能够并行,且该两个任务之间没有依赖关 系,则将该两个任务对应的区域判定为任务并行区域。
10. 根据权利要求1所述的C程序并行区域的检测方法,其特征在于,步骤(5)中,流水 任务并行检测时,选定一个循环,使用脚本自动在循环前后和循环体中插入指令,W提示进 出循环和当前轮次; 在进入循环之后,维护一个变量指示当前的迭代数,每次遇到循环体中的指令后,都会 对迭代数自增; 对于循环体中的每个函数,都在函数名后加入迭代数后缀,W标识不同的迭代; 分析循环体中各函数之间的依赖。
【专利摘要】本发明公开了一种C程序并行区域的检测方法,其特征在于,包括以下步骤:(1)对源文件中系统头文件以外的部分进行预编译;(2)将预编译后的源代码连同系统头文件进行编译并进行动态分析;(3)向预编译后得到的源代码中插入动态分析结果,得到中间文件;(4)对所述中间文件进行静态分析,生成程序调用图;(5)结合所述程序调用图,检测C程序中的任务并行区域、流水任务并行区域以及数据并行区域。本发明提出一种动静态结合的检测方法,该方法能够在得到以函数和循环为单元的程序调用图的基础上,进一步动态分析程序各部分各种粒度并行的可能性。
【IPC分类】G06F11-36
【公开号】CN104536898
【申请号】CN201510025847
【发明人】刘鹏, 耿洋, 史册
【申请人】浙江大学
【公开日】2015年4月22日
【申请日】2015年1月19日
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1