CN103645930B - 汇编级跨文件调度框架的构建方法 - Google Patents
汇编级跨文件调度框架的构建方法 Download PDFInfo
- Publication number
- CN103645930B CN103645930B CN201310697997.6A CN201310697997A CN103645930B CN 103645930 B CN103645930 B CN 103645930B CN 201310697997 A CN201310697997 A CN 201310697997A CN 103645930 B CN103645930 B CN 103645930B
- Authority
- CN
- China
- Prior art keywords
- assembly level
- register
- analysis
- instruction
- construction method
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Fee Related
Links
Landscapes
- Devices For Executing Special Programs (AREA)
Abstract
本发明涉及一种汇编级跨文件调度框架的构建方法,其步骤包括:判断、分析并描述汇编级寄存器内指令之间的数据依赖关系,构建汇编级数据依赖图ADDG,并且利用伪相关检测算法进行寄存器重新分配;分析汇编级基本块之间的调用关系,构建汇编级控制流图ACFG,并选择性添加控制依赖图CDG中删除冗余信息的特性来辅助后续调度;构建汇编级程序调用图APCG,组织管理全局源文件内函数调用关系。本发明提供了一种汇编级跨文件调度框架的构建方法,该方法从汇编级着手构建更高效的结构来完成更深层次的优化,其存储资源占用代价低、构建方法简单,并且支持全文件级的指令再调度与优化。
Description
技术领域
本发明涉及计算机领域,尤其涉及一种汇编级跨文件调度框架的构建方法。
背景技术
编译优化的效果与编译器可见的视野息息相关,更宽的视野能给编译器更大的发挥空间,从而获得更好的优化效果。采用跨文件调度框架能使编译器的视野扩大至整个程序是未来编译领域的发展方向。然而,跨文件调度框架下进行的过程间分析、优化等均占用了过多的编译时间和较大的存储空间,这就导致绝大多数编译器并不支持跨文件调度框架。
现有技术方案一般是针对编译框架的中间语言提出,其中特征较为明显的实现方法包括Vortex编译器、SYZYGY编译系统、LLVM编译系统。其中:
VorteX是华盛顿大学实现的支持跨文件优化的编译器。Vortex编译器前端正常的处理整个应用程序,然后利用它的专用中间语言Vortex IL中间代码表示把所有的编译结果保存下来,一旦得到全部的过程的VIL表示,也就形成了跨文件调度框架。
SYZYGY是HP公司的Sungdo Moon等人于2004年实现的基于HP-UX的Itanium处理器的编译器的连接时跨文件过程间优化框架。它将传统编译流程划分为四个阶段,包括:前端、连接时、过程间分析和后端,它选择来连接时来可见全部的过程信息,所以在连接前保存目标代码的编译结果。
LLVM是伊利诺斯大学2004年提出的连接时全程序优化框架。为了支持全程序优化,LLVM选择的是通过一个伪连接器来保存编译的中间结果,这个中间结果以目标文件的面貌出现。但不同于SYZYGY的目标代码。LLVM扩展 了GCC原编译器的Link阶段。在LLVM系统中提供了一个用于进行跨文件过程间分析和优化的伪连接器,这个连接器主要用来处理LLVM系统自身生成的目标代码和LLVM汇编代码。LLVM修改了GCC前端,这个前端完成对源程序的处理生成树表示后将树表示转换成LLVM的中间代码表示形式,中级优化器对这个中间代码表示进行一系列优化后生成LLVM的.o文件。全部程序都被修改后的前端转换为LLVM的.o文件后,再调用LLVM的优化连接器将它们Link为一个单独的文件。这样编译器就可见到全部的过程并基于这个文件进行跨文件的过程间分析和优化变形。完成优化变形后,这个LLVM中间代码表示被转换成GCC自身所使用的RTL表示。GCC编译器处理RTL表示,生成真正的目标代码,然后调用真正的Nati ve Li nker生成最终的可执行文件。
现有技术主要是通过保存编译器的中间结果实现跨文件调度框架,而保存中间结果是为了辅助跨文件间过程调度,但这并不能提供合适的结构去实现指令级再调度。
发明内容
本发明的目的是针对上述问题,提供了一种有效的汇编级跨文件调度框架的构建方法。
为实现上述目的,本发明提供了一种汇编级跨文件调度框架的构建方法,其包括以下步骤:
构建汇编级数据依赖图ADDG,判断、分析并描述汇编级寄存器内指令之间的数据依赖关系,并且利用伪相关检测算法进行寄存器重新分配,避免临时寄存器的复用带来数据间的伪相关;以及
构建汇编级控制依赖图ACFG,控制数据依赖分析,并添加控制依赖图CDG中删除冗余信息的特性来辅助后续调度,构建基于多叉树结构的谓词分析方法,通过遍历控制流图,跨基本块的分析条件判断相关指令间的数据依赖关系来完成谓词分析;以及
构建汇编级程序调用图APCG,组织管理全局源文件间的关系;
所述APCG中每个节点对应一个所述ACFG,所述ACFG中每个节点可映射到一个汇编级基本块,所述ACFG中每个节点对应一个独立的ADDG。
进一步地,所述ADDG包括数据依赖检测算法、ADDG创建算法以及所述伪相关检测算法,其中,
所述数据依赖检测算法用于判断两条指令之间为何种所述数据依赖关系;
所述ADDG创建算法反映了汇编级基本块内全部指令之间为何种所述数据依赖关系,并表现出来;
所述伪相关检测算法用于寄存器重新分配,避免伪相关带来的数据依赖关系。
进一步地,所述ADDG是一个有向无环图DAG。
进一步地,所述ACFG是一个有向有环图DCG。
进一步地,所述构建基于多叉树结构的谓词分析方法是通过遍历控制流图,跨基本块的分析条件判断相关指令之间的数据依赖关系来完成谓词分析。
进一步地,所述寄存器重新分配包括以下步骤:
函数栈框架分析,首先分析程序的栈框架,并统计函数内即将用到的同类寄存器;以及
路径分析,分析后文将介绍的ACFG统计当前汇编级基本块的全部前驱动点对同类寄存器的使用情况;以及
判断所述路径分析中同类寄存器是否全部被使用。
进一步地,所述函数栈框架分析用于保存函数内使用到的临时寄存器。
进一步地,若所述路径分析中同类寄存器全部被使用,则判断修改栈结构
时导致的指令带来的影响是否小于对依赖关系的减少。
进一步地,若所述路径分析中同类寄存器未全部被使用,则任意选择一个
未使用的寄存器进行重新分配。
进一步地,若所述修改栈结构时导致的指令带来的影响小于对依赖关系的减少,则重新进行分配,否则放弃分配。
进一步地,构建所述APCG的步骤包括:
前端分析过程中收集全部的函数,并创建所述APCG的点集合;以及
顺序分析点集元素对应的汇编指令片段,分析其中的函数调用指令目标地址,并在点元素之间添加边;以及
生成未经边冗余删除的APCG;
进一步地,所述APCG是一个DCG。
本发明带来的有益效果是:本发明提供了一种汇编级跨文件调度框架的构建方法,该方法从汇编级着手构建更高效的结构来完成更深层次的优化,其存储资源占用代价低、构建方法简单,并且支持全文件级的指令再调度与优化。
附图说明
图1为本发明一实施例一种汇编级跨文件调度框架的构建方法流程图;
图2为本发明一实施例中I1-I6的ADDG示意图;
图3为寄存器重新分配后的ADDG示意图;
图4为本发明进行寄存器重分配时的流程图;
图5为表8中对应的基本控制流图;
图6为表8中所示的代码片段的谓词关系示意图;图7为本发明一实施例中ACFG示意图;
图8为本发明汇编级跨文件调度框架的构建方法中APCG、ACFG及ADDG间的嵌套关系示意图。
具体实施方式
下面通过附图和实施例,对本发明的技术方案做进一步地详细描述。
如图1所示是本发明一实施例一种汇编级跨文件调度框架的构建方法流程图,如图所示,本发明具体包括以下步骤:
步骤101、构建汇编级数据依赖图(Assembly Data Dependence Graph,ADDG),判断、分析并描述汇编级寄存器内指令之间的数据依赖关系,并且利用伪相关检测算法进行寄存器重新分配,避免临时寄存器的复用带来数据间的伪相关。
数据依赖是指语句之间存在数据约束关系,如果两个运算操作之间无重复使用的变量,或仅连续读取同一个变量,那么执行结果与它们的执行顺序无关,如果相关则这两个运算操作之间就被认定为存在数据约束关系。数据依赖关系包括:写后写、写后读、读后写以及存储依赖四种。汇编级数据依赖图就是为了描述汇编级基本块内指令之间的这四种数据依赖关系。
ADDG是一个有向无环图(Directed Acyclic Graph,DAG)。在ADDG中,G(ADDG)=(V(G),E(G),Φ(G)),其中V(G)是节点集合,E(G)是边集合,φ(G)是关联函数。
节点集合V(G)={v1,v2,v3…vn},其中vi与汇编级基本块内的指令呈一一映射关系并被其属性刻画,vi的出度(out-degree)和入度(in-degree)均不超过当前指令使用寄存器的数目。
边集合E(G)={e1,e2,e3…en},若取ei={<vj,vk>|vj,vk∈V(G)},则ei是一条以vj为初节点,以vk为终节点的有向边,它描述了vj,vk之间存在一种或多种数据依赖关系。同时,E(G)中边元素的有向性说明了初节点,终节点在执行顺序上的唯一性,如果多个边元素以及边的数据依赖关系属性可组成vm→vn的一条通路或者路径,则vm,vn可到达任意两节点之间;如果不可到达,则说明它们可以以任意顺序被执行。
关联函数φ(G)描述了边与节点之间的关联关系E→V×V,本发明实施例中V(G)内各节点元素之间至多存在一条边,因此,φ(G)是单映射的,即ADDG任意两节点之间不存在无重复边。
表1为本发明建立ADDG时所用到的数据结构。其中,结构体VexPos对ADDG中的节点的位置进行了定义,Lidx为遍历语句行的迭代器,Fidx为遍历文件的迭代器;结构体VexNode对节点集合V(G)进行了定义,FirstIn_为连接节点的第一条入边,FirstOut_为连接节点的第一条出边;结构体ArcBox定义了边集合E(G),HeadVex与TailVex分别为一条边的初节点和终节点,Id定义了边属性,PathId用于标记边对应的通路,Correlation数组存储对应边描述的全部依赖关系,HLink指针用于指向下一条与当前边共用相同初节点的下一条边,而TLink则指向共用相同终节点的下一条边;结构体Graph定义了PDG的结构,vector容器VexNode_存储ADDG,BlockNode则存储后续的汇编级控制流图。
表1
表2所示是本发明的数据依赖检测算法。由于编译器是按序生成汇编指令,所以本发明建立ADDG的过程也是按序分析指令i与其块内前序指令间的数据依赖关系。在实现本发明相关方法之前,需对汇编文件进行前端分析, 具体的分析算法依不同的目标机而定。其中,args用于存储关键字的标记符,标记符可根据实际情况由用户自由定义,argv代表关键字的枚举变量。表2中Algorithm1为本发明的数据依赖算法,其中,行2-5用于顺序比较两条指令的args数组的各个元素,行5中的函数UPPER用于将字符转换为大写;行6首先判断当Line1中的args[i]与Line2中的args[j]相同时是否为同一个寄存器;行7-11用于判断当前寄存器存在何种依赖关系,并将依赖关系保存在Rel中;行12中利用乘法获取最终结果是源定义相关性枚举变量时。本发明优选{RAR=1,RAW=2,WAR=4,WAW=8,SAS=16}。
表2
表3为本发明一实施例中由六条指令组成的汇编代码片段,表4为本发明Algorithm2.ADDG创建算法,图2为本发明一实施例中I1-I6的ADDG示意图。下面将结合表3和图2来说明表4中的ADDG创建算法。其中,表3中, 指令I1-I6的args数组的取值均为"P^aAA",但各自argv数组则由于寄存器使用的不同而有所差异。Algorithm2中的行2-5用于逐条分析指令i与其前序指令集合的数据依赖关系,其中行4用于判断存储依赖。表3中,I2中args[2]与I1中args[3]分别为'a','A',在UPPER函数下等价,且各自对应的argv数组元素相同,则I2与I1在地址寄存器ar2存在WAR相关。同理可知,I2与I1在寄存器ar1存在RAW相关的。因此,I2存在的数据依赖关系集合(data dependence set,DDS)为{I1δaI2:ar2,I1δfI2:ar1}。I4的前序指令集合为{I3,I2,I1},可以看到I4不仅与I3而且还与I1在寄存器ar1上存在RAW依赖。然而,I4读取的ar1的值在数据上仅取决于I3的执行结果。因此,本发明建立ADDG过程中并不添加I1到I4的边,但I1与I4之间的依赖关系仍可以通过路径I1→I3,I3→I4这两条边获取,这一方面可以降低对ADDG遍历的复杂度,另一方面可以节省存储资源的开销。以此类推,指令I3、I4、I5、I6的DDS分别为{I2δaI3:ar1,I1δoI3:ar1},{I3δfI4:ar1,I3δoI4:ar1},{I2δoI5:ar2},{I5δfI6:ar2,I5δoI6:ar2}。DDS描述了指令对间在何种寄存器上存在哪种依赖,基于DDS,在表4的Algorithm2中的行6在这些指令对相应的节点间添加连接有向边,并最终形成图2中的ADDG。
表3
表4
下面将结合对这六条指令的分析来阐述Algorithm2中的ADDG创建算法。前端分析后,这指令I1-I6的args数组的取值均为"P^aAA",但各自argv数组则由于寄存器使用的不同而有所差异。Algorithm2中的行2-5用于逐条分析指令i与其前序指令集合的数据依赖关系,其中行4用于判断存储依赖。I2中args[2]与I1中args[3]分别为'a','A',在UPPER函数下等价,且各自对应的argv数组元素相同,则I2与I1在地址寄存器ar2存在WAR相关。同理可知,I2与I1在寄存器ar1存在RAW相关的。因此,I2存在的数据依赖关系集合DDS(datadependence set,DDS)为{I1δaI2:ar2,I1δfI2:ar1}。I4的前序指令集合为{I3,I2,I1},可以看到I4不仅与I3还与I1在寄存器ar1上存在RAW依赖。然而,I4读取的ar1的值在数据上仅取决于I3的执行结果。因此,本发明建立ADDG过程中并不添加I1到I4的边,但I1与I4之间的依赖关系仍可以通过路径I1→I3,I3→I4这两条边获取,这一方面可以降低对ADDG遍历的复杂度,另一方面可以节省存储资源的开销。以此类推,指令I3、I4、I5、I6的DDS分别为{I2δaI3:ar1,I1δoI3:ar1},{I3δfI4:ar1,I3δoI4:ar1},{I2δoI5:ar2},{I5δfI6:ar2,I5δoI6:ar2}。DDS描述了指令对间在何种寄存器上存在哪种依赖,基于DDS,Algorithm2中的行6在这些指令 对相应的节点间添加连接有向边,并最终形成图2中的ADDG。
表5为ADDG的伪相关算法,用于检测指令间是否存在伪相关。上述建立的ADDG已经充分反映了汇编级基本块内指令间的数据依赖关系,但只是客观的描述,表4中的Algorithm2.ADDG创建算法并不能明确指令之间的依赖关系是否足够优化。通常,编译器后端进行的代码调度与寄存器分配往往是相互牵制的两个阶段。寄存器分配阶段,编译器为了减少存储访问时的延迟开销,尽可能的选择利用临时寄存器保存频繁操作的中间变量,而临时寄存器的复用就导致了指令间存在伪相关。代码调度则期望尽可能减少临时寄存器保存操作,从而避免伪相关带来的数据依赖关系。这两个阶段之间的冲突往往导致了代码不够优化,尽管市场上如Intel公司推出的IA-64体系结构处理器配置了大量的寄存器资源,又或者学术界提出的交叠执行这两个过程的编译算法都在降低它们之间冲突时起到了较好效果了,但两者之间的牵制关系仍是NP问题,这种现象的存在导致了ADDG中仍然存在可优化的部分。
表5
表6显示了一段由六条指令组成的寄存器重新分配的汇编代码片段,图3为寄存器重新分配后的ADDG示意图。在图3中,指令I1与I3间唯一的依赖关系是I1δiI3:ar1,它们均要对ar1寄存器进行写操作。I1必须在I3之前被执行,假设I1与I3一定被执行,那么I3的后序指令读取ar1寄存器的值将只取决于I3,而I4在读取ar1马上需要更新ar1。因此,在这种模式下如果将I3以及I4指令中读取的ar1寄存器替换为其他闲置的寄存器arx势必降低ADDG中边数,然而,如果I1、I3中任意一条不是确定被执行,那么已存在的依赖关系将因推断执行的关系继续存在。从图3中可以看出,进行寄存器重分配后,I1、I2与I3之间的依赖关系被消除。利用寄存器重新分配实现了ADDG的优化,解除了指令之间的伪相关。但寄存器重新分配也在一定的条件下才能进行。
表6
可进行寄存器重分配的条件可被归纳为:当两条指令Ia、Ib之间,对于某一寄存器register存在WAW依赖;Ia、Ib只存在于同一条执行路径下,且一定同时执行或不执行;可对Ia或者Ib该位置上的register进行重分配。实现这一过程的检测算法如表5中Algorithm3.ADDG伪相关检测算法所示。
如图4所示,本发明进行寄存器重分配时的步骤如下:
步骤401、函数栈框架分析,函数栈框架用于保存函数内使用到的临时寄存器,因此,本发明首先分析程序的栈框架,统计函数内即将用到的同类寄存器。
步骤402、路径分析,分析后文将介绍的构建汇编级控制流图(Assembly ControlFlow Graph,ACFG)统计当前汇编级基本块的全部前驱节点对同类寄存器的使用情况。
步骤403、判断所述路径分析中同类寄存器是否全部被使用。如果在路径分析中发现同类寄存器已经全部被使用,则评估修改栈结构时导致的指令增加带来影响是否小于对依赖关系的减少,如果是则进行重分配,否则放弃分配。如果同类寄存器尚未全部使用,则任意选择一个进行重分配。
如图1所示的一种汇编级跨文件调度框架的构建方法流程图,其中:
步骤102、构建汇编级控制流图ACFG,控制数据依赖分析,并选择性添加控制依赖图(Control Dependence Graph,CDG)中部分特性来辅助后续调度,构建基于多叉树结构的谓词分析方法,通过遍历控制流图,跨基本块的分析条件判断相关指令间的数据依赖关系来完成谓词分析。
假设存在一条途径途经节点i与j的控制路径,其中节点j是除节点i以外全部其它节点的后必经节点,那么就称节点i控制依赖(control dependence)于节点j。CDG是一个面向中间语言的DAG,其中,边集合描述了基本块间的控制依赖关系;节点集合中的根节点、中间节点是由谓词操作 划分出的基本块,叶节点则一般是谓词不敏感的基本块。编译器前端生成应用程序的CFG(control flow graph,CFG),而后端则根据分支和循环片段衍生出控制依赖子图CDSG(control dependence sub graph)。然而,中间语言历经代码调度、代码块合并、指令映射等多遍操作后,谓词相关操作被分布到多条指令甚至多个基本块内,这增添了汇编级进行谓词分析的难度。CDG相比于CFG而言,它是一个删除冗余信息后的DAG,并且更适合编译器进行优化,但由于本发明提供的构建方法主要用于面向汇编级进行再调度和优化挖掘,因此,本发明构建汇编级控制流图ACFG(assembly control dependence graph,ACFG)来进行控制依赖分析,并选择性添加CDG中部分特性来辅助后续调度。
ACFG抽象的表现了程序的执行流走向,由于循环体的存在,它是一个有向有环图DCG(directed cyclic graph,DCG),且D(ACFG)=(V(D),E(D),φ(D))。其中,节点集合V(D)={v1,v2,v3…vn},每个节点代表唯一的一个汇编级基本块;边集合E(D)={e1,e2,e3…en}。若ei={<vj,vk>|vj,vk∈V(D)},ei则是一条以vj为初节点,vk为终节点的有向边。关联函数φ(D)与ADDG中不同,它既不是单射也不是满射,这意味着它存在着方向不同的重复边。
其中,vj与vk的关系可归纳为以下几种:
1.vj称为vk的直接前驱,vk称为vj的直接后继。
2.如果节点vj的出度为1,那么节点vk是它的唯一后继。如果节点vk的入度为1,那么节点vj是它的唯一前驱。
3.如果存在通路vm→vn,且vm与vn不存在边ex={<vm,vn>},那么vm是vn的一个前驱(predecessor),vn是vm的一个后继(successor)。
循环路径的存在导致节点之间的前驱和后继关系并不唯一,即如果边ex={<vj,vk>与ey={<vk,vj>}同时存在,那么vj与vk互为前驱和后继。
如表7所示,本发明定义如下数据结构来存储ACFG,其中,结构体BlockPos标记了汇编级基本块的位置,Fidx为文件索引,Start、End记录了 汇编级基本块在文件内的起始位置,info变量定义了汇编级基本块包含指令数、所在路径id集合、所在函数名称、所在子函数名称等信息;结构体BlockArcBox对ACFG边集合属性进行了定义,BlockTailVex与BlockHeadVex分别代表一条边的初节点和终节点,BlockHLink与BlockTLink指针分别用于指向下一条同初节点和终节点的边,PInfo存储当前边成立时的谓词条件,Id用于对每一条边进行标记并用于路径统计;结构体BlockVexNode对构成汇编级基本块的节点进行了定义,与ADDG中的VexNode功能类似。
表7
表8为本发明中SuperV DSP处理器体系结构下一段汇编代码示例,函数Sample中已知5个子函数片段,它们构成了这5个汇编级基本块{.A,.B,.C,.D,.E}。其中.A是入口基本块。分析这段汇编代码后可知,函数Sample中天然存在着静态代码顺序.A→.B→.C→.D→.E,而汇编级基本块{.B,.C,.D}中各自的分支指令{2,3,4}的目标地址均是汇编级基本块.E,因此,表8对应的控制流图的边集为{<.A,.B>,<.B,.C>,<.C,.D><.B,.E>,<.C,.E>,<.D,.E>,}。
表8
图5为表8中对应的基本控制流程图。基本控制流图仅对程序静态控制流进行了如实描述,但边集合中并非全部的元素在任何条件下都是有效的,因此引入谓词分析来标记边集合成立的条件,这也是ACFG与基本控制流图的差异之一。现有超长指令字结构的处理器几乎都支持推断执行技术,并配备推断寄存器Pr,提供用于修改推断寄存器值的eq,lt,gt等条件判断类指令(Conditional Instruction),它们的执行结果均为互补的修改两个推断寄存器。谓词执行机制被提出至今,学术界在谓词分析技术上展开了广泛的探讨,如Mahlke提出的针对hyperblock的谓词层次图;Johnson在Trimaran编译器上设计的谓词查询系统;Hwu在有序二叉决策图(OBDD,Ordered Binary Decision Diagram)基础上提出的谓词分析系统,它可将二值逻辑的谓词结构转换为布尔表达式,并利用布尔函数的特性进行全面的分析。这些方法都在它们相关的领域获得很好的效果,但却不适用于本发明处理的对象,这是因为对于汇编级而言,可见的谓词结构只是与推断寄存器有关的指令操作,如果勉强采用OBDD等方法,那么进行全文件分析时的存储资源开销可能无法承受。
谓词是一种二值逻辑,而二叉树是组织二值逻辑的一种常见结构。条件判断指令可看作一棵简单二叉树的根节点,它的左右孩子分别为它修改的两个互补谓词寄存器。本发明是通过遍历控制流图,跨基本块的分析条件判断相关指令之间的数据依赖关系来完成谓词分析,但由于二叉树并不能提供更多的分支来放映多层数据依赖关系,因此,本发明在谓词分析过程中定义了多叉树结构,而分析得出控制流中不可达的指令、汇编基本块即为死代码。
图6为表8中所示的代码片段的谓词关系示意图,实线部分为指令1与指令2、3、4的数据依赖关系{I1δaI2:pr1,I1δaI3:pr2,I1δaI4:pr2},然而,指令1作为一条在入口基本块推断寄存器为pr0的条件判断指令,它必将互补的修改pr1和pr2,这也意味着分支指令2或3必有一条被执行,而指令4将因为控制流关系无法被执行,虚线部分显示了指令2、3、4所在汇编级基本块与.E之间控制依赖关系。
从上述过程中可以看到,由于推断寄存器诱发的依赖关系,指令集合{1,2,3,4}形成了一棵三叉树。这棵三叉树是以条件判断指令1为根节点,指令{2,3,4}作为孩子节点,而它们从左至右的顺序则代表了控制流的顺序。然而,依据指令1的执行结果不难看出,指令{2,3}其中的一条一定被执行且控制流将跳到.E,即指令4不可能被执行。结合这些情况,本发明对所使用到的多叉树进行了如下定义。
1)多叉树由根节点、内部节点以及叶子节点组成,所有的节点只为条件判断指令和分支指令,且分支指令只能作为叶子节点,条件判断指令可为任意节点。
2)多叉树内的树枝用于连接父节点与子节点的数据依赖关系,它是通过遍历控制流图时进行的数据依赖关系分析获得。
3)父节点对应的条件判断指令可能不被执行,因此,子节点可以存在多个父节点,而父节点是否唯一可以通过判断父节点所在汇编级基本块是否 为子节点所在汇编级基本的唯一前驱来判断;
4)父节点的全部子节点是按控制流的方向自左向右顺序排布;
5)如果一个条件判断指令使用推断寄存器为Pr0,那么它一定是根节点;
6)根节点root到节点node的全部路径上推断寄存器成立的条件,构成了决定汇编级控制流图中边是否有效的谓词条件;
7)假设一个父节点的子节点集合中由分支指令构成的子集合branch set为{b1,b2,…,bn},如果branch set有超过两个元素是以当前父节点作为唯一的父节点,那么超过的部分为死代码;
8)多叉树森林是ACFG中衍生出只用于描述条件判断、分支指令之间关系的子图,在谓词分析过程无须重新定义数据。
表9中Algorithm4是本发明实现的谓词分析算法,行2内声明的Jmp变量用于描述多叉树谓词分析中的定义7,PrReg记录当前谓词分析的过程中的目标推断寄存器,flag标记是存在满二叉树或死代码片段的;行03-26用于沿着控制流图进行数据依赖分析,它实现了跨基本块的依赖性分析,并实现谓词分析以及死代码片段删除;行04-07判断推断寄存器的依赖关系是否为RAW,并判断指导当前父节点执行的推断寄存器是否为pr0(定义5,判断父节点是否一定执行);行08-09用于判断定义7)中的父节点是否唯一;行10-14判断是否存在死代码区域,当Jmp的值为1且判断边ArcBox_的终节点执行的推断寄存器与当前保存PrReg一致时,调用DelSingle函数进行单条指令的删除;行15-20判断边ArcBox_的终节点是否为分支指令,当Jmp为0时,记录终节点使用到的推断寄存器,当Jmp为1时则根据当前flag的值来判断终节点是否为死代码,并将flag的值被置为true(见对多叉树的定义7);行21-24判断边ArcBox_的终节点是否为条件判断指令,当flag为false,保存条件判断指令并进行迭代分析,否则根据当前flag的值来判断终节点是否为死代码;行27-29根据Condition_队列记录的条件判断指令进行下一次迭代操作的,可以看出分 析过程中实际存在的是多叉树森林。
表9
如图7所示为本发明的ACFG示意图。当调用执行上述本发明的谓词分析算法后,图5中的基本控制流图将形成图7所示的ACFG,而边集合中的各元素的谓词成立条件将保存在结构体BlockArcBox内的PInfo变量中。
如图1所示的汇编级跨文件调度框架的构建方法流程图,其中:
步骤103、构建汇编级程序调用图(Assembly Procedure Call Graph,APCG),组织管理全局源文件间的关系。本发明建立了更高层次的汇编级程序调用图APCG来组织管理全局源文件间的关系。
如图8所示是本发明汇编级跨文件调度框架的构建方法中APCG、ACFG及ADDG间的嵌套关系示意图。宏观上来看,C语言中的main函数即是入口也是出口(实际上操作系统在进入main函数之前,还存在与系统安全相关的调用),exit等函数是异常出口。因此,在无操作系统的处理器平台下,可从main函数入手开始建立函数间的调用关系。下面将结合SuperV DSP平台详细描述APCG的性质以及创建过程:
1)APCG(G(graph)=(V(G),E(G)))是一个DCG,点集合V(G)中各个元素对应于工程项目中的每一个函数,并以函数名与文件名一起作为唯一的标识,有向边集合E(G)只反映了函数之间的调用与被调用的关系,并不描述函数返回的关系,其中初节点为调用函数,终节点为被调用函数。
2)APCG是一个非连通(unconnected)图,它存在叶子节点即那些不再发生函数调用的函数或出度为0的节点,而从入口函数到叶子节点的一条路径可看作程序的一条通路。
3)ACFG中每个节点的出度至多为2(汇编级基本块内至多存在一条分支指令,并分跳转与不跳转两种可能)。APCG不同于ACFG,它的入度和出度的值是不确定的,这是因为一个函数可以调用多个函数,也可以被多个函数调用。
4)建立APCG的过程中需根据汇编语言判断函数调用关系,SuperV DSP指令集中提供两条分支指令Call、Calli用于函数调用,它们在本发明中是判断函数调用关系的依据。
5)本发明构建APCG的流程为:①前端分析过程中收集全部的函数,并创建APCG的点集;②顺序分析点集元素对应的汇编指令片段,分析其中的函数调用指令的目标地址,并在点元素之间添加边;③生成未经边冗余删除的APCG。
6)独立存在的APCG并不具备实用意义,图6为本发明建立的APCG、ADDG、ACFG三个图结构之间的嵌套关系。可以看到,APCG中每个节点对应一个函数,而每个函数是由多个汇编级基本块组成而ACFG描述了它们之间的控制依赖关系。因此,APCG中每个节点对应一个ACFG,ACFG中每个节点可映射到一个汇编级基本块。由于ADDG是用于描述汇编级基本块内各指令的数据依赖关系,因此,ACFG中每个节点同样可对应为一个ADDG。按照这种嵌套关系,可从指令沿路径查询到其它文件内指令信息,并最终实现了信息的共享。
假设在一个完整的工程项目中存在N个函数,各函数中存在汇编级基本块的数目分别为{B1,B2,B3…Bn},而每个函数内存在的汇编指令条数分别为{I1,I2,I3…In}。那么APCG占用存储空间的字节数如表达式(1);ACFG占用的存储空间的字节数如表达式(2);而ADDG占用的字节数如表达式(3)。以Mpeg2Decoder的源代码为例,在本发明提出的跨文件框架在32位操作系统下占用总字节数约为867MB,这对整个编译后优化平台而言处在一个可承受的范围内。
上述为本发明的汇编级跨文件调度框架的构建方法,该方法从汇编级着 手构建更高效的结构来完成更深层次的优化,其存储资源占用代价低、构建方法简单,并且支持全文件级的指令再调度与优化。
专业人员应该还可以进一步意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本发明的范围。
结合本文中所公开的实施例描述的方法或算法的步骤可以用硬件、处理器执行的软件模块,或者二者的结合来实施。软件模块可以置于随机存储器(RAM)、内存、只读存储器(ROM)、电可编程ROM、电可擦除可编程ROM、寄存器、硬盘、可移动磁盘、CD-ROM、或技术领域内所公知的任意其它形式的存储介质中。
以上所述的具体实施方式,对本发明的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本发明的具体实施方式而已,并不用于限定本发明的保护范围,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
Claims (10)
1.一种汇编级跨文件调度框架的构建方法,其特征在于,包括以下步骤:
构建汇编级数据依赖图ADDG,判断、分析并描述汇编级寄存器内指令之间的数据依赖关系,并且利用伪相关检测算法进行寄存器重新分配,避免临时寄存器的复用带来数据间的伪相关;以及
构建汇编级控制依赖图ACFG,控制数据依赖分析,并添加控制依赖图CDG中删除冗余信息的特性来辅助后续调度,构建基于多叉树结构的谓词分析方法,通过遍历控制流图,跨基本块的分析条件判断相关指令间的数据依赖关系来完成谓词分析;以及
前端分析过程中收集全部的函数,并创建汇编级程序调用图APCG的点集合;顺序分析点集元素对应的汇编指令片段,分析其中的函数调用指令目标地址,并在点元素之间添加边;生成未经边冗余删除的APCG;组织管理全局源文件间的关系;
所述APCG中每个节点对应一个所述ACFG,所述ACFG中每个节点可映射到一个汇编级基本块,所述ACFG中每个节点对应一个独立的ADDG。
2.如权利要求1所述的汇编级跨文件调度框架的构建方法,其特征在于,所述ADDG包括数据依赖检测算法、ADDG创建算法以及所述伪相关检测算法,其中,
所述数据依赖检测算法用于判断两条指令之间为何种所述数据依赖关系;
所述ADDG创建算法反映了汇编级基本块内全部指令之间为何种所述数据依赖关系,并表现出来;
所述伪相关检测算法用于寄存器重新分配,避免伪相关带来的数据依赖关系。
3.如权利要求1或2所述的汇编级跨文件调度框架的构建方法,其 特征在于,所述ADDG是一个有向无环图DAG。
4.如权利要求1所述的汇编级跨文件调度框架的构建方法,其特征在于,所述ACFG是一个有向有环图DCG。
5.如权利要求1或2所述的汇编级跨文件调度框架的构建方法,其特征在于,所述寄存器重新分配包括以下步骤:
函数栈框架分析,首先分析程序的栈框架,并统计函数内即将用到的同类寄存器;以及
路径分析,分析后文将介绍的ACFG统计当前汇编级基本块的全部前驱动点对同类寄存器的使用情况;以及
判断所述路径分析中同类寄存器是否全部被使用。
6.如权利要求5所述的汇编级跨文件调度框架的构建方法,其特征在于,所述函数栈框架分析用于保存函数内使用到的临时寄存器。
7.如权利要求5所述的汇编级跨文件调度框架的构建方法,其特征在于,若所述路径分析中同类寄存器全部被使用,则判断修改栈结构时导致的指令带来的影响是否小于对依赖关系的减少。
8.如权利要求5所述的汇编级跨文件调度框架的构建方法,其特征在于,若所述路径分析中同类寄存器未全部被使用,则任意选择一个未使用的寄存器进行重新分配。
9.如权利要求7所述的汇编级跨文件调度框架的构建方法,其特征在于,若所述修改栈结构时导致的指令带来的影响小于对依赖关系的减少,则重新进行分配,否则放弃分配。
10.如权利要求1所述的汇编级跨文件调度框架的构建方法,其特征在于,所述APCG是一个DCG。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310697997.6A CN103645930B (zh) | 2013-12-18 | 2013-12-18 | 汇编级跨文件调度框架的构建方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310697997.6A CN103645930B (zh) | 2013-12-18 | 2013-12-18 | 汇编级跨文件调度框架的构建方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN103645930A CN103645930A (zh) | 2014-03-19 |
CN103645930B true CN103645930B (zh) | 2017-03-08 |
Family
ID=50251153
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201310697997.6A Expired - Fee Related CN103645930B (zh) | 2013-12-18 | 2013-12-18 | 汇编级跨文件调度框架的构建方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN103645930B (zh) |
Families Citing this family (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2016141991A1 (en) * | 2015-03-12 | 2016-09-15 | Huawei Technologies Co., Ltd. | Systems and methods for dynamic scheduling of programs on processing systems |
CN108108300B (zh) * | 2017-12-18 | 2020-06-16 | 北京东土科技股份有限公司 | 一种操作系统的资源配置检测方法和装置 |
CN109491918B (zh) * | 2018-11-22 | 2020-05-01 | 中国人民解放军战略支援部队信息工程大学 | 一种汇编冗余指令的检测方法及装置 |
CN112540750B (zh) * | 2019-09-23 | 2022-11-15 | 无锡江南计算技术研究所 | 自适应内建函数与指令操作选择翻译方法 |
CN110837475B (zh) * | 2019-11-14 | 2024-03-01 | 北京有竹居网络技术有限公司 | 冗余检测的方法及装置、终端和存储介质 |
CN113302587A (zh) * | 2020-10-09 | 2021-08-24 | 深圳市大疆创新科技有限公司 | 汇编指令的资源分析方法、装置和存储介质 |
CN115292203B (zh) * | 2022-09-30 | 2022-12-16 | 平安银行股份有限公司 | 一种源代码分析方法及装置 |
CN116663491B (zh) * | 2023-07-26 | 2023-10-13 | 北京云枢创新软件技术有限公司 | 基于bdd求解功能覆盖组条件约束语句的方法、设备和介质 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7207032B1 (en) * | 2003-03-28 | 2007-04-17 | Applied Micro Circuits Corporation | Expanding a software program by insertion of statements |
CN102200924A (zh) * | 2011-05-17 | 2011-09-28 | 北京北大众志微系统科技有限责任公司 | 基于模调度实现循环指令调度的编译方法及装置 |
CN103399741A (zh) * | 2013-07-24 | 2013-11-20 | 中国科学院声学研究所 | 一种汇编级静态路径剖析方法及装置 |
-
2013
- 2013-12-18 CN CN201310697997.6A patent/CN103645930B/zh not_active Expired - Fee Related
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7207032B1 (en) * | 2003-03-28 | 2007-04-17 | Applied Micro Circuits Corporation | Expanding a software program by insertion of statements |
CN102200924A (zh) * | 2011-05-17 | 2011-09-28 | 北京北大众志微系统科技有限责任公司 | 基于模调度实现循环指令调度的编译方法及装置 |
CN103399741A (zh) * | 2013-07-24 | 2013-11-20 | 中国科学院声学研究所 | 一种汇编级静态路径剖析方法及装置 |
Non-Patent Citations (2)
Title |
---|
A Function-Oriented Local Scheduling Framework for VLIW Architectures in Assembly-Level;Hao Zhu et al;《 International Journal of Advancements in Computing Technology2012》;20121130;参见摘要,第167页第2-6段,第169页1-3段,第170页第1-4段、第171页第1段、第173页倒数第1段以及附图2 * |
缪力;依赖性分析及其在软件测试中的应用;《中国优秀博硕士学位论文全文数据库(博士) 信息科技辑》;20061215;第I138-11-72页 * |
Also Published As
Publication number | Publication date |
---|---|
CN103645930A (zh) | 2014-03-19 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN103645930B (zh) | 汇编级跨文件调度框架的构建方法 | |
US9864590B2 (en) | Method and system for automated improvement of parallelism in program compilation | |
CN100465895C (zh) | 编译器、编译方法 | |
JP4183399B2 (ja) | 複数言語のコンパイル方法及びシステム | |
CA2288614C (en) | Loop allocation for optimizing compilers | |
US7856627B2 (en) | Method of SIMD-ization through data reshaping, padding, and alignment | |
Hoogerbrugge et al. | Transport-triggering vs. operation-triggering | |
Benelallam et al. | Distributed model-to-model transformation with ATL on MapReduce | |
Saillard et al. | PARCOACH: Combining static and dynamic validation of MPI collective communications | |
Vasilakis et al. | Pash: Light-touch data-parallel shell processing | |
JP2018510445A (ja) | プログラム性能を向上させる領域特化システムおよび方法 | |
Prokesch et al. | A generator for time-predictable code | |
JP2007193423A (ja) | プログラム処理装置、並列処理プログラム、プログラム処理方法、並列処理コンパイラおよび並列処理コンパイラを格納した記録媒体 | |
Popov et al. | Piecewise holistic autotuning of compiler and runtime parameters | |
CN103530471A (zh) | 一种基于模拟器的关键路径分析方法 | |
Atre et al. | Dissecting sequential programs for parallelization—An approach based on computational units | |
JP2014228891A (ja) | コンパイラおよびコンパイル方法 | |
Aguilar et al. | Towards parallelism extraction for heterogeneous multicore android devices | |
O'Hern | A conceptual level design for a static scheduler for hard real-time systems | |
Weaver et al. | Score: A compiler representation for heterogeneous systems | |
Xu et al. | Efficient Exploitation of Hyper Loop Parallelism in Vectorization | |
Programmierung | Identification of Suitable Parallelization Patterns for Sequential Programs | |
Huda | Identification of Suitable Parallelization Patterns for Sequential Programs | |
Aiken et al. | Trace Scheduling | |
Castrillón Mazo et al. | Sequential Code Flow |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20170308 Termination date: 20191218 |