首页> 中国专利> 用跳转目标基本块的执行包填充空闲节拍的指令调度方法

用跳转目标基本块的执行包填充空闲节拍的指令调度方法

摘要

用跳转目标基本块的执行包填充空闲节拍的指令调度方法,包括如下步骤:步骤一,在代码流图中找出与进行跨基本块选择执行包填充空闲节拍操作有关的目标基本块对;步骤二,对跳转目标基本块内的指令执行包进行前驱执行包判定,即判定该执行包内各指令所依赖的其他指令,即被依赖指令所在的执行包及其位置,并根据指令之间的依赖关系确定该执行包的可执行最早时间对应的节拍;步骤三,根据各个指令执行包可执行最早时间对应的节拍与基本块内空闲节拍的位置关系,计算出各指令执行包各自对应的可填充最早时间,移动这些执行包到对应的空闲节拍处,完成填充。

著录项

  • 公开/公告号CN106020922A

    专利类型发明专利

  • 公开/公告日2016-10-12

    原文格式PDF

  • 申请/专利权人 湖南科技大学;

    申请/专利号CN201610370406.8

  • 发明设计人 胡勇华;黄文体;李国辉;邱亚琼;

    申请日2016-05-30

  • 分类号G06F9/45;

  • 代理机构长沙星耀专利事务所;

  • 代理人许伯严

  • 地址 411201 湖南省湘潭市雨湖区石马头湖南科技大学

  • 入库时间 2023-06-19 00:39:52

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2019-01-08

    授权

    授权

  • 2016-11-09

    实质审查的生效 IPC(主分类):G06F9/45 申请日:20160530

    实质审查的生效

  • 2016-10-12

    公开

    公开

说明书

技术领域

本发明涉及代码的编译优化方法,面向VLIW处理器硬件底层的无条件跳转指令延迟槽以及基本块内空闲节拍的填充技术领域,特别涉及一种用跳转目标基本块的执行包填充空闲节拍的指令调度方法。

背景技术

在编译过程中,在完成了基本块调度之后,基本块内仍然可能存在一些空闲节拍,这些空闲节拍包括两部分:1)指令与指令之间的数据依赖关系和指令执行延时所造成的空闲节拍;2)分支指令后未被有效指令填充的延迟槽。

分支调度指的是两件事:1)用有用的指令填充分支指令之后的延迟槽;2)隐藏处于比较指令和根据比较结果进行分支的指令之间的延迟。由于本发明针对的是无条件跳转指令延迟槽以及在基本块调度之后的空闲节拍的填充问题,所以不涉及比较指令和依赖比较结果的条件分支指令之间的延迟以及条件分支指令本身的调度优化问题。

对于不同的体系结构,分支的实现有很大的区别,但大多带有多个延迟槽。如何有效地填充这些延迟槽是提高代码的并行度要考虑的重要问题之一。延迟槽可用有用的指令或nop指令来填充,但后者实际是空转。填充分支延迟槽时可以使用以该分支指令结束的基本块内部的指令。首先检查该基本块的依赖DAG中是否有任何叶子结点能 够放到它最后一条分支指令的延迟槽中。这种指令必须满足如下条件:1)它必须是与分支指令可置换的,即它不能是决定分支条件的指令,也不能是改变分支地址计算使用的寄存器之值或分支所使用的任何其他资源(如条件代码域)的指令;2)它本身不是分支指令。如果在以该分支指令结束的基本块内部存在若干指令能够填充该分支指令的延迟槽,选择那种延迟时间为一拍的指令;但是如果没有只需一拍的指令,选择延迟最小的指令。

在处理一条分支指令时,可以同时关注该分支的目标基本块和紧接着它的后继基本块。如果当前基本块没有可以放置在分支延迟槽中的指令,下一步是构造分支目标基本块和它下面这个基本块的DAG,并尝试找出那种同时作为DAG的根而出现的指令;如果找不到这种指令,接下来就在目标基本块中寻找满足条件的指令。

上述的延迟槽填充方法只适用于具有单个分支延迟槽的超标量体系结构。对于具有多个分支延迟槽的VLIW处理器来说,不能较好地填充分支指令的每一个延迟槽以及其他的空闲节拍。因此,这种方法不能较好地对这类处理器提高以无条件分支指令结束的基本块内指令的执行效率,难以充分发挥硬件的性能。

发明内容

为解决上述现有技术存在的问题,本发明的目的在于提供用跳转目标基本块的执行包填充空闲节拍的指令调度方法,针对基本块调度得到的执行包序列,进一步使用无条件跳转目标基本块内的执行包来填充该序列内的空闲节拍。本发明的方法通过合理地从目标基本块内 选择具有有效指令的执行包来填充当前基本块的无条件跳转指令延迟槽以及基本块内的空闲节拍,使得执行基本块指令过程中的空转时间减少,同时减少分支目标基本块的执行时间,达到提高代码执行效率的目的。

为达到上述目的,本发明的技术方案为:

用跳转目标基本块的执行包填充空闲节拍的指令调度方法,包括如下步骤:

步骤一,在代码流图中找出与进行跨基本块选择执行包填充空闲节拍操作有关的目标基本块对;

步骤二,对跳转目标基本块内的指令执行包进行前驱执行包判定,即判定该执行包内各指令所依赖的其他指令,即被依赖指令所在的执行包及其位置,并根据指令之间的依赖关系确定该执行包的可执行最早时间对应的节拍;

步骤三,根据各个指令执行包可执行最早时间对应的节拍与基本块内空闲节拍的位置关系,计算出各指令执行包各自对应的可填充最早时间,移动这些执行包到对应的空闲节拍处,完成填充。

进一步的,所述步骤一中,本方法对应的处理是在已经完成了基本块调度并形成了各基本块的执行包序列的基础上进行的;因此,在初始时刻,基本块内的指令已经被分派到执行包序列中的各个执行包内;

进一步的,确定步骤一中基本块对的处理包括以下基本流程:

1)找到含有无条件跳转指令的基本块B1,且B1中有空闲节拍;

2)找到B1中的跳转指令的跳转目标基本块B2,并要求B2内第一个执行包中不包含跳转指令;

3)判断B1是否是B2的唯一前驱基本块,B2是否是B1的唯一后继基本块;若条件满足,则表示发现了可进行跨基本块填充空闲节拍的一对基本块;

进一步的,步骤二中目标基本块内执行包的前驱执行包判定具体为:

如果指令I2必须在指令I1执行完之后才能执行,则称I1为I2的前驱指令。如果I2在执行包E2内,I1在执行包E1内,则称E1为E2的前驱执行包,即E2必须在E1之后执行。这种判定处理的主要方法是:

1)判断目标基本块内的各指令执行包是否有前驱执行包;

2)若存在前驱执行包,则通过该执行包与前驱执行包中各指令之间的数据依赖关系,计算该执行包的可执行最早时间,然后根据执行包的可执行最早时间对应的节拍与B1内空闲节拍的位置关系确定当前执行包的可填充最早时间;

3)若不存在前驱执行包,则该执行包可插入到B1内的第一个空闲节拍。

进一步的,所述步骤三中,执行包的可填充最早时间确定方法包括以下内容:

1)确定B1中所有空闲节拍在基本块中的位置;

2)对于跳转目标基本块中的某个执行包,在完成其前驱执行包判定、得到其可执行最早时间以后,判断其可填充最早时间对应的节拍时分三种情况处理:若其可执行最早时间在基本块内第一个空闲节拍之前,则可填充最早时间为第一个空闲节拍;若其可执行最早时间在基本块内第一个空闲节拍和最后一个空闲节拍之间,则可填充最早 时间为该执行包可执行最早时间之后的第一个空闲节拍;若其可执行最早时间在基本块内最后一个空闲节拍之后,则当前执行包不可以用来填充。

相对于现有技术,本发明的有益效果为:

本发明的使用无条件跳转目标基本块的执行包填充基本块内空闲节拍的方法考虑了代码在进行了基本块调度之后仍然可能存在部分可填充空闲节拍的问题。通过本方法可以使用无条件跳转目标基本块内的执行包同时对无条件跳转指令延迟槽和基本块内的其它空闲节拍进行填充。跨基本块进行执行包调度实际是增加了指令的调度域,给调度提供了更多改善代码的机会。

附图说明

图1为计算目标基本块内某个执行包的可执行最早时间的过程图。

图中T为指令I与前驱指令inst之间必须的延迟时间;P为包含前驱指令inst的执行包所在的节拍编号,基本块内第一个执行包的P值为1。由于执行包中一条指令可能有多条前驱指令,所以可能有多个T+P的值,可执行最早时间为该指令对应的那些T+P值中最大的那个值。对目标基本块中某个执行包中的每条指令计算可执行最早时间,即找出该执行包中每条指令的最大T+P值;其中最大的那个可执行最早时间T+P的值就是该执行包的可执行最早时间。

图2为选择执行包填充空闲节拍的状态转换图,计算目标基本块内执行包的最早可填充时间的状态转换。

根据该图的各个状态以及相互之间的转换可实现一个确定有限状态自动机来判定目标基本块内各执行包的最早可填充时间。其中B1是B2的唯一前驱,B2是B1的唯一后继。Br指令表示无条件跳转指令。其他说明如下:

1)ETime表示一个执行包的可执行最早时间所在的节拍号;

2)FTime是一个执行包的可填充最早时间所在的节拍号;

3)P[n]为基本块内所有空闲节拍的序列;

4)P[1]为基本块内的第一个空闲节拍的节拍号;

5)P[i]为基本块内第i个空闲节拍;

6)EP为执行包可执行最早时间ETime所在的节拍;

7)FP为执行包可填充最早时间FTime所在的节拍;

具体实施方式

下面结合附图和具体实施方式对本发明技术方案做进一步详细描述:

如图1、2所示,本发明方法的实施具体依次包括与执行包的选择和填充过程相关的数据结构的构造、顶层流程控制、查找可以跨基本块填充空闲节拍的基本块对、执行包的前驱判定、计算执行包的可执行最早时间、计算执行包的可填充最早时间、填充空闲节拍、删除目标基本块内的可填充执行包等部分。本方法可以用任何程序设计语言进行具体实施。下面以面向对象语言为例来说明具体实施方式。

在面向对象语言程序中,数据和相关的功能模块都封装在类中。本发明的方法涉及的实施内容可以用一个执行包调度类封装,将对跨 基本块进行执行包调度所需的全局数据作为此类的数据成员。由于本发明只涉及基本块内空闲节拍的填充问题,所以,对于已完成基本块调度的基本块和这些基本块中的指令的基本信息,假定它们已经保存在基本块类对象和指令类对象之中(其中包含了基本块的前驱和后继信息,基本块内的执行包序列,各指令的依赖指令和被依赖指令信息);对于指令模板信息,假定它们保存在指令模板类的对象中;对于体系结构的基本信息,假定它们已经保存在体系结构类对象中。它们都可以通过指针或者全局变量名来访问。所以,在下面的具体实施中,只涉及与本无条件跳转情况指令延迟槽填充指令选择方法直接相关的内容。

1数据结构构造

为了实现本发明的使用无条件跳转目标基本块内执行包对基本块内的空闲节拍进行填充的方法,需要相关数据结构的支持。除硬件结构信息和指令集信息外,其他主要数据结构及其说明如下:

1)空闲节拍列表。空闲节拍列表用于描述基本块内所有的空闲节拍的一些状态信息。它是一个下标从1开始的一维数组,数组元素的个数为基本块内空闲节拍的个数;其中的元素值是各空闲节拍在基本块的执行包序列中对应的执行包编号。例如:一个基本块中的第3拍、第5拍和第8拍是空闲节拍,则a[1]=3、a[2]=5、a[3]=8;

2)被依赖执行包集合。一个执行包可能包含多条指令,这些指令所依赖的其他指令所在的执行包称作该执行包的被依赖执行包。一个执行包的被依赖执行包可能有多个,其中属于无条件跳转指令所在 基本块的那些执行包构成被依赖执行包集合;

3)被依赖指令集合。目标基本块内执行包中的每条指令对应一个被依赖指令集合。这些集合中的指令是与目标基本块内执行包中的指令存在数据依赖关系的被依赖指令;

4)计算执行包可填充最早时间的确定有限状态自动机的各个状态的枚举;

5)每个执行包都需要的辅助数据:执行包的可执行最早时间;执行包可执行最早时间对应的节拍的编号,执行包的可填充最早时间,执行包可填充最早时间对应的节拍的编号。

2顶层流程控制

顶层控制过程有如下步骤:

(1)查找可进行跨基本块空闲节拍填充的一对基本块。基本块B1和B2是满足调度条件的基本块对,B1是B2的前驱基本块,B2是B1的后继基本块,如果找到这样的一对基本块,用下面的步骤对它们进行处理;

(2)对无条件跳转目标基本块的执行包序列中的各执行包进行前驱执行包判定,找出所有被依赖执行包并放入被依赖执行包集合中。

(3)通过执行包中的所有指令与其被依赖指令之间的数据依赖关系,计算出当前执行包的可执行最早时间。

(4)将执行包的可执行最早时间对应的节拍与基本块内空闲节拍进行区间比较,确定执行包的可填充最早时间。

(5)将可填充的执行包填入到相应的空闲节拍中,同时在目标基本块的执行包序列中删除该可填充执行包。

3查找满足调度条件的一对基本块

这一部分的处理对应5.2节步骤中的第1步。在代码流图中查找这样的一对基本块以对它们进行跨基本块填充空闲节拍,需要满足以下条件:

1)基本块B1以无条件跳转指令结束;

2)基本块B1有唯一后继基本块B2,B2有唯一前驱基本块B1;

3)基本块B1内有空闲节拍;

4)基本块B2的第一个执行包内不包含分支指令。

具体步骤如下:

1)为基本块设置两个标示变量flag和target,它们分别标示当前基本块是否包含无条件跳转指令和是否是满足条件的目标基本块。根据基本块标号遍历基本块集合中的各个基本块,对基本块进行下面的所有步骤的处理;

2)令flag为“假”,target为“假”,遍历基本块内的各个执行包中的各条指令,若当前基本块执行包序列中存在任意一个包含有无条件跳转指令的执行包,并且当前基本块中存在至少一个空执行包,则令flag为“真”值并结束遍历。分以下两种情况处理:

(1)在当前基本块内的所有执行包中的所有指令都遍历完成之后,若flag值仍为“假”,则对紧接着当前基本块的下一个基本块进行上述步骤2)处理;

(2)当flag为“真”时,根据无条件跳转指令操作数中的目标基本块标号找到目标基本块;

3)如果目标基本块有唯一前驱,则遍历第一个执行包中的所有指令,如果该执行包中不包含分支指令,则令target为“真”,否则target仍为“假”,同时令flag也为“假”;此时表示该基本块对不满足条件。然后对紧接着前驱基本块的下一个基本块进行上述步骤2)处理1;

6)flag和target同时为“真”时,表示找到了满足条件的一对基本块。

4执行包的前驱执行包判定

如果指令I2必须在指令I1执行完之后才能执行,则称I1为I2的前驱指令,即I1是I2的被依赖指令,I2是I1的依赖指令。如果I2在执行包E2内,I1在执行包E1内,则称E1为E2的前驱执行包,即E2必须在E1之后执行。

进行执行包前驱执行包判定是计算执行包的可执行最早时间的准备工作。一条指令的被依赖指令可能有多条,意味着一个执行包的前驱执行包可能有多个,并且该指令与对应的各被依赖指令之间的延迟都可能不同。此时根据执行包中的各指令与其对应的被依赖指令之间的延迟时间找到该执行包在基本块内可以开始执行的最早时间对应的节拍。计算执行包的可执行最早时间的处理过程如附图1所示。

执行包的前驱执行包判定的具体步骤如下:

1)如果目标基本块中有分支指令,则遍历分支指令之前的每一 个执行包内的每一条指令,否则遍历目标基本块执行包序列中的每一个执行包内的每一条指令;对各指令进行如下所有步骤处理;

2)找到当前指令的每一条被依赖指令,并放入被依赖指令集合中。如果被依赖指令集合中存在属于目标基本块B2内的指令,则包含当前指令的执行包不能对前驱基本块B1内的空闲节拍进行填充,否则继续下面步骤处理;

3)遍历当前执行包内当前指令的被依赖指令集合中的各指令,通过每条指令对应的指令模板信息类对象确定各被依赖指令的执行周期T;

4)确定当前指令的各被依赖指令所在的被依赖执行包对应的节拍编号P;

5)计算当前指令的所有被依赖指令对应的T+P的值,则当前指令的可执行最早时间为最大的那个T+P的值对应的节拍;

6)对当前执行包中的其他指令进行3)、4)、5)步骤处理,确定当前执行包中每条指令的可执行最早时间,其中最大的那个可执行最早时间就是当前执行包的可执行最早时间。

5获得执行包的可填充最早时间

本发明方法通过确定状态有限自动机来发现可以填充基本块内空闲节拍的执行包,状态转换关系见附图2。获得执行包的可填充最早时间FTime的步骤如下:

1)更新空闲节拍列表。遍历基本块B1指令执行包序列中的所有执行包,如果有空执行包,即该执行包所在的节拍为空闲节拍;将 这些空闲节拍对应的节拍编号依次存入空闲节拍列表中。

2)遍历目标基本块指令执行包序列中的各个指令执行包,对各执行包进行下面步骤3)的处理。

3)对当前执行包进行前驱执行包判定。将执行包的可执行最早时间ETime对应的节拍编号与空闲节拍列表中的空闲节拍对应的节拍编号进行区间关系分析,分析过程分如下几种情况进行处理:

(1)若当前执行包不存在被依赖执行包,则当前执行包的可填充最早时间FTime为基本块内第一个空闲节拍对应的节拍编号a[1]。将当前执行包的所有指令复制到该空节点对应的执行包中,然后删除目标基本块内执行包链表中当前执行包所在的节点。进行步骤1)处理更新空闲节拍列表。

(2)若当前执行包的可执行最早时间ETime小于等于空闲节拍列表中的第一个元素a[1]的值,则当前执行包的可填充最早时间FTime对应的节拍为空闲节拍列表中第一个元素a[1]所对应的节拍。将当前执行包的所有信息复制到该空节点中,然后删除目标基本块内执行包链表中当前执行包所在的节点。进行步骤1)处理更新空闲节拍列表。

(3)若当前执行包的可执行最早时间ETime大于空闲节拍列表中的第一个元素a[1]的值,小于等于空闲节拍列表中的最后一个元素a[n]的值,则当前执行包的可填充最早时间FTime对应的节拍为空闲节拍列表中第一个其元素的值大于等于该执行包可执行最早时间的那个元素a[i]所对应的节拍。将当前执行包的所有信息复制到该空节 点中,然后删除目标基本块内执行包链表中当前执行包所在的节点。进行步骤1)处理更新空闲节拍列表。

(4)若当前执行包的可执行最早时间ETime大于空闲节拍列表中的最后一个元素a[n]的值,则当前执行包不能用来填充空闲节拍。

4)取下一个执行包进行上述2)、3)步骤处理,直到取到含有分支指令的执行包或者目标基本块内的所有执行包都处理完成。

附表1目标基本块中执行包可填充最早时间FTime一览表。其中,(a[i]为空闲节拍集合中第一个其元素的值大于等于该执行包可执行最早时间的那个元素所表示的节拍,a[1]为基本块中的第一个空闲节拍,a[n]为最后一个空闲节拍,n为空闲节拍的个数。)

附表1中的内容是获得执行包可填充最早时间后的结果,执行包的可填充最早时间只有表中所示的这几种可能

以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何不经过创造性劳动想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应该以权利要求书所限定的保护范围为准。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号