基于模调度实现循环指令调度的编译方法及装置的制作方法

文档序号:6424338阅读:257来源:国知局
专利名称:基于模调度实现循环指令调度的编译方法及装置的制作方法
技术领域
本发明涉及现代处理器代码编译优化方法,尤其涉及基于模调度实现循环指令调度的编译方法及编译器装置。
背景技术
在现代计算机系统中,通过编译器各种优化方法来挖掘处理器指令级并行性,是提高处理器性能的有效手段。软件流水是编译器中一种常见的优化方法,它通过在循环级别进行指令调度来挖掘指令级并行性,以提高处理器的性能。软件流水的基本思想是通过重叠执行不同循环体指令来挖掘指令级并行性。编译器以C/C++/Java等高级语言源程序作为输入,从高级语言源程序中提取循环相关的代码作为调度对象,首先为这些循环建立控制流图(CFG,Control-Flow Graph)和数据依赖图 (DDG, Data-Dependence Graph),然后将处理器中指令的延时和资源占用情况进行抽象,得到整个循环的控制依赖约束、数据依赖约束和资源约束。基于模调度的这些约束条件,软件流水使用自顶向下、自底向上或者双向调度方法,对循环中的指令进行调度,使其重组成为新的循环。重组之后的循环包括入口代码(prologue)、核心代码(kernel)以及排空代码 (epilogue)三部分;其中入口代码和出口代码都是为了保持程序语义的正确性设置的,而核心代码则是循环的主体部分。在重组之后的循环中,循环核心的指令数目基本上和原来的循环保持一致,但是指令顺序发生了变化,尤其是相邻指令之间的依赖数量大大降低,从而减小指令之间由于依赖关系而导致的指令延时,并进一步减小程序运行时间。目前已有的软件流水技术一般采用“表调度”等启发式策略,在循环重组过程中需要始终遵循所有的控制依赖约束、数据依赖约束和系统资源约束。若调度过程发生违反约束的冲突,则调度过程可能会失败,从而导致重组循环的性能降低。随着现代处理器中指令发射宽度的增加和指令类型的增多,以上这种由于约束条件冲突引起的指令调度过程失败情况也越来越常见。调度过程的失败一方面可能导致完全无法挖掘指令级并行性,另一方面也可能引发循环执行时间较长和寄存器压力较大等问题,从而导致应用程序的性能较低。因此,有效地解决现有技术中由于约束条件冲突引起的软件流水调度失败问题, 从而提高循环重组之后的代码性能,对提高处理器性能乃至整个计算机系统性能都有着重要作用。

发明内容
本发明所要解决的技术问题是提供一种基于模调度实现循环指令调度的编译方法及装置,能够有效地避免由于模调度约束条件冲突弓I起的指令调度失败。为了解决上述技术问题,本发明提供了一种基于模调度实现循环指令调度的编译方法,包括由编译器执行的下列步骤读入并解析源程序,获取控制流图信息;
建立循环体结构的数据依赖约束和资源依赖约束;在对循环体结构执行模调度过程中,针对检测指令调度结果发生的数据依赖冲突和/或资源冲突根据符合相应约束的回溯模型解决。进一步地,读入并解析源程序,获取控制流图信息,具体包括读入高级语言源程序,并通过控制流分析技术对高级语言的前端进行解析,获取基本块,并获取表述基本块的程序结构的控制流图信息。进一步地,针对循环体结构建立数据依赖约束和资源依赖约束,具体包括根据控制流图信息建立所述数据依赖约束,根据目标处理器的资源信息建立资源依赖约束。进一步地,在对循环体结构执行模调度过程中,针对检测指令调度结果发生的数据依赖冲突和/或资源冲突根据符合相应约束的回溯模型解决,具体包括根据预先对处理器执行可执行程序时采用典型输入数据收集的剖视信息指导对循环指令的模调度;针对循环体中每一条需要调度指令当前节点的调度结果进行数据依赖冲突的检测和/或资源冲突的检测;针对检测到调度结果会发生数据依赖冲突和/或资源冲突,则相应地使用符合数据依赖约束的回溯模型和符合资源约束的回溯模型消除。进一步地,其中该方法中各步骤具体为根据剖视信息中的值剖视信息识别循环体结构,并初始化数据依赖冲突和资源冲突;根据剖视信息中的路径剖视信息指导从控制依赖到数据依赖的转换过程;在假定启动间距条件下,采用摆动模调度算法选择对当前指令的调度位置,并设置相应的调度优先级;若检测选择的当前指令的调度位置会产生数据依赖冲突,则依据符合数据依赖约束的回溯模型中的回溯节点选择目标和约束条件选取部分指令节点作为回溯节点,取消对回溯节点选择的调度位置,并更新回溯节点的调度优先级;若检测选择的当前指令的调度位置会产生资源冲突,则依据符合资源约束的回溯模型中的回溯节点选择目标和约束条件选取部分指令节点作为回溯节点,取消所有与该回溯节点发生资源冲突的节点,并更新回溯节点的调度优先级。进一步地,该方法还包括重组循环体结构,编译生成可执行程序,具体包括根据剖释信息分析模调度收益,若判断模调度收益能保证调度结果有效,则根据调度优先级将相应指令调度到选择的调度位置上,并依据产生的循环入口代码和循环出口代码重组所述循环体结构,将源程序编译成可执行程序。为了解决上述技术问题,本发明提供了一种基于模调度实现循环指令调度的编译器装置,其特征在于,包括依次连接的控制流信息获取模块、约束建立模块以及模调度执行模块,其中控制流信息获取模块,用于通过读入并解析源程序获取基本块,并获取表述基本块的程序结构的控制流图信息;约束建立模块,用于根据控制流图信息和目标处理器的资源信息建立循环体结构的数据依赖约束和资源约束;
模调度执行模块,用于在对循环体结构执行模调度过程中,针对检测指令调度结果发生的数据依赖冲突和/或资源冲突,根据符合相应约束的回溯模型解决。进一步地,该编译器装置还包括与模调度执行模块连接的剖视信息收集模块,其中剖视信息收集模块,用于在处理器执行可执行程序时根据典型输入数据收集并向模调度执行模块反馈剖视信息,其中包括值剖视信息和路径剖视信息;模调度执行模块根据剖视信息指导模调度,包括根据值剖视信息识别循环体结构,并初始化模调度对应的约束,根据路径剖视信息指导从控制依赖到数据依赖的转换;在假定启动间距的条件下进行指令调度位置的选择,并设置相应的调度优先级;若检测到所选择的指令调度位置会发生数据依赖冲突,则使用符合数据依赖约束的回溯模型消除该冲突;若检测到所选择的指令调度位置会发生资源冲突,则使用符合所述资源约束的回溯模型消除该冲突。进一步地,模调度执行模块针对调度位置会产生数据依赖冲突,依据符合数据依赖约束的回溯模型中的回溯节点选择目标和约束条件选取部分指令节点作为回溯节点,取消对回溯节点选择的调度位置,并更新回溯节点的调度优先级;针对调度位置会产生资源冲突,依据符合资源约束的回溯模型中的回溯节点选择目标和约束条件选取部分指令节点作为回溯节点,取消所有与回溯节点发生资源冲突的节点,并更新回溯节点的调度优先级。进一步地,该编译器装置还包括与模调度执行模块连接的循环结构重组模块,其中模调度执行模块还根据值剖视信息分析模调度收益,若判断模调度收益保证调度结果有效,则根据调度优先级将相应指令调度到选择的调度位置上;循环结构重组模块,用于依据模调度执行模块执行的模调度结果产生循环入口代码和循环出口代码,重组循环体结构,将源程序编译成可执行程序。本发明所采用的软件流水模调度方法及装置,通过建立的数据依赖约束回溯模型和资源约束回溯模型分别解决指令调度过程中的数据依赖冲突和资源冲突,并通过使用可执行程序执行中的剖视信息指导指令调度,并最终完成循环重组;由此,可避免循环体中相邻指令的数据相关,减小生成代码的执行时间,从而有效地挖掘指令级并行性,提高处理器系统乃至计算机系统性能。


图1是本发明的基于模调度实现循环指令调度的编译方法实施例流程图;图2是图1中对循环指令的模调度过程实施例流程图;图3是本发明用于实现循环指令调度建立回溯模型实施例流程图;图4是本发明的基于模调度实现循环指令调度的编译器装置实施例结构框图。
具体实施例方式下面结合附图和优选实施例对本发明的技术方案进行详细地描述。以下例举的实施例仅用于说明和解释本发明,而不构成对本发明技术方案的限制。
如图1所示,是本发明提供的基于模调度实现循环指令调度的编译方法实施例, 其流程包括如下步骤110 在处理器执行可执行程序时,编译器根据典型输入数据收集剖视信息;剖视信息表示的是目标可执行程序在给定典型输入条件下执行的状态,包括值剖视信息和路径剖视信息,其中,值剖视信息主要包括部分变量的典型值,尤其是循环边界典型值,可用于计算软件流水模调度所能带来的收益,从而决定是否要放弃当前指令节点的调度结果;路径剖视信息主要包括控制依赖发生的频率,用于指导控制依赖到数据依赖的转换过程。120 编译器读入并解析源程序,获取控制流图信息;编译器读入高级语言源程序,并通过控制流分析技术对高级语言的前端进行解析,获取基本块(指没有分支的一串顺序执行的指令),并获取表述基本块程序结构的控制流图信息。130 建立数据依赖约束和资源依赖约束;编译器根据控制流图信息中所表述的指令间数据依赖信息建立循环体结构的数据依赖图,用于描述循环体中的数据依赖关系;根据处理器的资源信息建立对处理器资源约束的描述,具体表示为资源使用表或者有限状态自动机。140:根据剖视信息指导针对循环的模调度过程,在调度过程中检测指令调度结果出现的数据依赖冲突和/或资源冲突,并采用符合相应约束的回溯模型来消解冲突;基于模调度方法,在假定启动间距(II,Initiation Internal)的条件下对循环指令进行调度,根据剖视信息中的循环边界典型值,判断是否需要继续进行当前循环的指令调度,并通过计算软件流水模调度带来的收益,判断是否取消当前节点的调度结果;根据路径剖视信息中的控制依赖发生的频率来指导从控制依赖到数据依赖的转换过程。对于循环体中每一条需要调度的指令,均针对其调度的结果进行数据依赖冲突检测和资源冲突检测,并消除检测出的相应冲突,具体包括若检测到要调度指令的当前节点会发生数据依赖冲突,则使用符合数据依赖约束条件的回溯模型消除冲突,即取消当前节点的部分前驱和/或后继节点指令,削弱当前节点的数据依赖约束以完成对其的指令调度,并重新设置被取消节点的调度优先级。若检测到要调度指令的当前节点会发生了资源冲突,则使用符合资源约束条件的回溯模型消除冲突,即取消与当前节点发生资源冲突的部分节点指令,削弱当前节点的资源约束以完成对其的指令调度,并重新设置被取消节点的调度优先级。150 重组循环体,编译生成可执行程序。在上述方法是实例中,步骤140所表述的编译器对循环指令的模调度过程实施例的流程如图2所示,包括如下步骤141 根据剖视信息识别循环体结构,并初始化对应的模调度约束;编译器根据剖视信息对目标循环结构进行识别和解析,并初始化该循环结构对应的模调度约束,主要包括数据依赖约束和资源约束。142:在假定启动间距条件下,采用摆动模调度算法选择指令的调度位置,并设置相应的调度优先级;对寄存器压力敏感的循环体指令进行调度,其过程采用“先假设启动间距后调度”的模调度思想,即在假定启动间距条件下,采用摆动模调度算法进行指令调度位置的选择。143 检测选择的调度位置是否会产生冲突,是则执行步骤144,否则执行步骤 145 ;将选择的调度位置作为调度结果分别进行数据依赖冲突检测和资源冲突检测。数据依赖冲突是指所选择的调度位置无法满足循环指令内部的数据依赖关系,其检测方法基于表示当前循环数据依赖关系的数据依赖图(DDG)。当前指令的调度位置必须满足两个条件1)对于数据依赖图中该指令所对应节点的所有前驱节点,所选择的调度位置必须使得当前节点开始执行的时刻晚于所有前驱节点完成执行的时刻;2)对于数据依赖图中该指令所对应节点的所有后继节点,所选择的调度位置必须使得当前节点完成执行的时刻早于所有后继节点开始执行的时刻。若当前节点的调度位置无法满足上述两个条件的任意一个条件,则可以判定发生了的数据依赖冲突。资源依赖冲突是指由于处理器中运算单元、访存单元等硬件资源的有限性,造成当前节点在所选择的位置中无法获得有效资源的情况,其检测方法依赖于处理器资源约束的表示形式。对于资源向量表(Resource-Reservation Table,参考Alfred V. Aho的著作 ((Compilers :Principles, Techniques, & Tools. Second Edition)))的资源约束描述形式, 若调度位置所对应资源向量表项中的资源可用数量为0,则可以判定发生了资源冲突。对于有限状态自动机(参考 DM Lavery 的论文《Modulo Scheduling for Control-intensive General-purpose Programs)))的资源约束描述形式,若调度位置使得自动机无法转移到下一个有效状态,则可以判定发生了资源冲突。144:针对检测出的数据依赖冲突采用数据依赖约束回溯模型消除,针对检测出的资源冲突采用资源约束回溯模型消除;上述针对数据依赖冲突和/或资源冲突,根据当前指令节点相应的依赖约束条件从以下三个方面进行处理,其流程可参见图3,包括1441 根据依赖约束的特点判断对当前指令节点是否需要进行回溯;1442:根据回溯节点选择目标和约束条件选取部分指令节点作为回溯节点,取消对回溯节点的调度结果;回溯节点的选择,是提高用回溯模型消除相应冲突有效性的关键。在数据依赖约束回溯模型中,将“回溯节点尽量少”、“调度窗口尽量大”作为回溯节点选择目标,将“回溯节点被取消后仍然可调度”、“回溯过程不引起颠簸”等作为约束条件,来选择回溯节点,取消对这些回溯节点的调度结果,即取消选择的调度位置。在资源约束回溯模型中,将“取消节点尽量少”、“回溯节点所占用的关键资源尽量少”或者“引起的资源冲突最少”作为回溯节点选择目标;将“回溯过程不引起颠簸”、“回溯过程不增加寄存器压力”作为约束条件,来选择回溯节点,并取消所有与回溯节点发生资源冲突的节点。1443 更新回溯节点的调度优先级。选择好回溯节点后,重新设置回溯节点的调度优先级。145 149 根据剖释信息分析模调度收益,若判断该模调度收益能保证调度结果有效,则根据调度优先级将相应指令调度到选择的调度位置上,并产生循环入口代码和循环出口代码;否则报告模调度失败,重新执行步骤142,从选择指令的调度位置开始重新进行模调度。根据剖释信息分析模调度收益,其中包括分析是否减弱了寄存器压力。当顺利地完成了所有指令的调度后,输出重组后的循环,并生成相应循环入口代码和出口代码。本发明针对上述方法实施例,相应地还提供了基于模调度实现循环指令调度的编译器装置实施例,其结构如图4所示,包括依次连接的控制流信息获取模块、约束建立模块以及模调度执行模块,其中控制流信息获取模块,用于读入并解析源程序,获取控制流图信息;约束建立模块,用于根据控制流图信息和目标处理器的资源信息建立数据依赖约束和资源约束;模调度执行模块,用于在执行模调度过程中针对检测指令调度结果发生的数据依赖冲突和/或资源冲突,根据符合相应约束的回溯模型解决。上述编译器装置实施例还包括与模调度执行模块连接的剖视信息收集模块,其中剖视信息收集模块,用于在处理器执行可执行程序时根据典型输入数据收集并反馈剖视信息,其中包括值剖视信息和路径剖视信息;模调度执行模块通过剖视信息收集模块反馈的剖视信息指导对循环指令的模调度,包括在假定启动间距的条件下对循环指令进行调度,根据剖视信息中的循环边界典型值,指导指令调度的各阶段;通过计算软件流水模调度带来的收益,判断是否取消当前节点的调度结果;根据路径剖视信息中的控制依赖发生的频率来指导从控制依赖到数据依赖的转换过程。在上述编译器装置实施例中,控制流信息获取模块读入高级语言源程序,并通过控制流分析技术对高级语言的前端进行解析,获取基本块,并获取表述基本块程序结构的控制流图信息;约束建立模块根据控制流图信息中所表述的指令间数据依赖信息建立数据依赖图,以描述循环体中的数据依赖关系,其中,部分数据依赖关系是通过IF指令-转换技术从部分控制依赖关系转化而来;建立的目标处理器资源约束具体表示为资源使用记录或者有限状态自动机;模调度执行模块根据剖视信息识别循环体结构,并初始化对应的模调度约束;在假定启动间距条件下,采用摆动模调度算法进行指令调度位置的选择,并设置相应的调度优先级;若检测到选择的指令调度位置会发生数据依赖冲突,则使用符合数据依赖约束的回溯模型消除冲突;若检测到选择的指令调度位置会会发生了资源冲突,则使用符合资源约束的回溯模型消除冲突。模调度执行模块在数据依赖约束回溯模型中,以“回溯节点尽量少”、“调度窗口尽量大”作为回溯节点选择目标,以“回溯节点被取消后仍然可调度”、“回溯过程不引起颠簸” 作为约束条件,选取部分指令节点作为回溯节点,取消对这些回溯节点的调度结果(即取消选择的调度位置),并重新设置回溯节点的调度优先级;在资源约束回溯模型中,以“取消节点尽量少”、“回溯节点所占用的关键资源尽量少”或者“引起的资源冲突最少”作为回溯节点选择目标,以“回溯过程不引起颠簸”、“回溯过程不增加寄存器压力”作为约束条件,取消所有与回溯节点发生资源冲突的节点,并重新设置回溯节点的调度优先级。上述编译器装置实施例还包括与模调度执行模块连接的循环结构重组模块,其中模调度执行模块还根据所述剖视信息中的值剖视信息分析模调度收益,若判断所述模调度收益能保证调度结果有效,则根据调度优先级将相应指令调度到选择的调度位置上;循环结构重组模块,用于依据模调度执行模块执行的模调度结果产生循环入口代码和循环出口代码,重组循环体结构,将所述源程序编译成可执行程序。对于本领域的专业人员来说,在了解了本发明内容和原理后,能够在不背离本发明的原理和范围的情况下,根据本发明的方法进行形式和细节上的各种修正和改变,但是这些基于本发明的修正和改变仍在本发明的权利要求保护范围之内。
权利要求
1.一种基于模调度实现循环指令调度的编译方法,包括由编译器执行的下列步骤读入并解析源程序,获取控制流图信息;建立循环体结构的数据依赖约束和资源依赖约束;在对所述循环体结构执行模调度过程中,针对检测指令调度结果发生的数据依赖冲突和/或资源冲突根据符合相应约束的回溯模型解决。
2.按照权利要求1所述的方法,其特征在于,所述读入并解析源程序,获取控制流图信息,具体包括读入高级语言源程序,并通过控制流分析技术对高级语言的前端进行解析,获取基本块,并获取表述所述基本块的程序结构的所述控制流图信息。
3.按照权利要求1所述的方法,其特征在于,所述针对循环体结构建立数据依赖约束和资源依赖约束,具体包括根据所述控制流图信息建立所述数据依赖约束,根据目标处理器的资源信息建立所述资源依赖约束。
4.按照权利要求1至3任一项所述的方法,其特征在于,在对所述循环体结构执行模调度过程中,针对检测指令调度结果发生的数据依赖冲突和/或资源冲突根据符合相应约束的回溯模型解决,具体包括根据预先对处理器执行可执行程序时采用典型输入数据收集的剖视信息指导对循环指令的模调度;针对循环体中每一条需要调度指令当前节点的调度结果进行所述数据依赖冲突的检测和/或所述资源冲突的检测;针对检测到所述调度结果会发生所述数据依赖冲突和/或所述资源冲突,则相应地使用符合所述数据依赖约束的回溯模型和符合所述资源约束的回溯模型消除。
5.按照权利要求4所述的方法,其特征在于,其中各步骤具体为根据所述剖视信息中的值剖视信息识别循环体结构,并初始化所述数据依赖冲突和所述资源冲突;根据所述剖视信息中的路径剖视信息指导从控制依赖到数据依赖的转换过程;在假定启动间距条件下,采用摆动模调度算法选择对当前指令的调度位置,并设置相应的调度优先级;若检测选择的所述当前指令的调度位置会产生所述数据依赖冲突,则依据所述符合数据依赖约束的回溯模型中的回溯节点选择目标和约束条件选取部分指令节点作为回溯节点,取消对所述回溯节点选择的调度位置,并更新所述回溯节点的调度优先级;若检测选择的所述当前指令的调度位置会产生所述资源冲突,则依据所述符合资源约束的回溯模型中的回溯节点选择目标和约束条件选取部分指令节点作为回溯节点,取消所有与所述回溯节点发生资源冲突的节点,并更新所述回溯节点的调度优先级。
6.按照权利要求5所述的方法,其特征在于,还包括重组循环体结构,编译生成可执行程序,具体包括根据所述剖释信息分析模调度收益,若判断所述模调度收益能保证调度结果有效,则根据调度优先级将相应指令调度到选择的调度位置上,并依据产生的循环入口代码和循环出口代码重组所述循环体结构,将所述源程序编译成可执行程序。
7.一种基于模调度实现循环指令调度的编译器装置,其特征在于,包括依次连接的控制流信息获取模块、约束建立模块以及模调度执行模块,其中控制流信息获取模块,用于通过读入并解析源程序获取基本块,并获取表述所述基本块的程序结构的所述控制流图信息;约束建立模块,用于根据所述控制流图信息和目标处理器的资源信息建立循环体结构的数据依赖约束和资源约束;模调度执行模块,用于在对所述循环体结构执行模调度过程中,针对检测指令调度结果发生的数据依赖冲突和/或资源冲突,根据符合相应约束的回溯模型解决。
8.按照权利要求7所述的编译器装置,其特征在于,还包括与所述模调度执行模块连接的剖视信息收集模块,其中剖视信息收集模块,用于在处理器执行可执行程序时根据典型输入数据收集并向所述模调度执行模块反馈剖视信息,其中包括值剖视信息和路径剖视信息;所述模调度执行模块根据所述剖视信息指导所述模调度,包括根据所述值剖视信息识别所述循环体结构,并初始化所述模调度对应的所述约束,根据所述路径剖视信息指导从控制依赖到数据依赖的转换;在假定启动间距的条件下进行指令调度位置的选择,并设置相应的调度优先级;若检测到所选择的指令调度位置会发生数据依赖冲突,则使用符合所述数据依赖约束的回溯模型消除该冲突;若检测到所选择的指令调度位置会发生资源冲突,则使用符合所述资源约束的回溯模型消除该冲突。
9.按照权利要求8所述的编译器装置,其特征在于,所述模调度执行模块针对所述调度位置会产生所述数据依赖冲突,依据所述符合数据依赖约束的回溯模型中的回溯节点选择目标和约束条件选取部分指令节点作为回溯节点, 取消对所述回溯节点选择的调度位置,并更新所述回溯节点的调度优先级;针对所述调度位置会产生所述资源冲突,依据所述符合资源约束的回溯模型中的回溯节点选择目标和约束条件选取部分指令节点作为回溯节点,取消所有与所述回溯节点发生资源冲突的节点, 并更新所述回溯节点的调度优先级。
10.按照权利要求9所述的编译器装置,其特征在于,还包括与所述模调度执行模块连接的循环结构重组模块,其中所述模调度执行模块还根据所述值剖视信息分析模调度收益,若判断所述模调度收益保证调度结果有效,则根据所述调度优先级将相应指令调度到选择的调度位置上;循环结构重组模块,用于依据模调度执行模块执行的模调度结果产生循环入口代码和循环出口代码,重组循环体结构,将所述源程序编译成可执行程序。
全文摘要
本发明披露了基于模调度实现循环指令调度的编译方法及装置,其中方法包括由编译器执行的下列步骤读入并解析源程序,获取控制流图信息;建立循环体结构的数据依赖约束和资源依赖约束;在对循环体结构执行模调度过程中,针对检测指令调度结果发生的数据依赖冲突和/或资源冲突根据符合相应约束的回溯模型解决。本发明可避免循环体中相邻指令的数据相关,减小生成代码的执行时间,从而有效地挖掘指令级并行性,提高处理器系统乃至计算机系统性能。
文档编号G06F9/45GK102200924SQ20111012805
公开日2011年9月28日 申请日期2011年5月17日 优先权日2011年5月17日
发明者刘先华, 张吉豫, 程旭, 谭明星 申请人:北京北大众志微系统科技有限责任公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1