一种使用空闲寄存器类作为快速溢出空间的优化方法

文档序号:6460058阅读:222来源:国知局
专利名称:一种使用空闲寄存器类作为快速溢出空间的优化方法
技术领域
本发明涉及编译器的研发和优化技术,特别是涉及一种使用空闲寄存器类作为快速溢出空间的优化方法。

背景技术
在现代处理器技术中,可用寄存器的数量是非常有限的,由寄存器短缺所导致的溢出问题一直都是影响性能的瓶颈之一。因此,编译器技术中很多寄存器分配相关优化技术都将溢出代码作为衡量算法好坏的标准之一。Chaitin是第一个将染色法应用在寄存器分配方面的人,他的算法将所有度数高于可用寄存器的活跃区间进行溢出。在溢出一个活跃区间时,算法会将整个区间全部溢出,这种做法会产生大量的溢出代码。因此,即使在他的算法中加入了一些优化指导策略,溢出代码多仍然是Chaitin分配算法的缺点之一。Chow发明了基于优先级的寄存器分配算法,他在分配之前对所有待分配的候选进行溢出代价计算,并按此进行排序,使得溢出代码尽可能的对性能影响小。所有上述优化都是选择软件算法作为解决方案。
另外,由于寄存器数量短缺,一部分变量需要进行溢出操作。它们在寄存器和内存之间进行转换,以便其他变量可以占用这些寄存器做操作。这些内存到寄存器之间的通讯操作往往会引起下列几个问题 1.新增加的通讯操作,即访存操作,会增加应用程序的执行时间。当访存操作遇到cache缺失时,会严重影响程序的性能。
2.当新增加的访存操作发生cache缺失时,引用这些数据的任务队列,如定点操作队列和乱序队列,都会发生新的堵塞。


发明内容
本发明的目的在于提供一种使用空闲寄存器类作为快速溢出空间的优化方法,其能够有效缓解溢出带来的负面效应,并且弥补了软件溢出优化方法中访存压力无法改善的不足。
为实现本发明的目的而提供的一种使用空闲寄存器类作为快速溢出空间的优化方法,包括下列步骤 A.计算活跃区间的溢出代价并采用插桩工具以及静态分析汇编代码相结合的方式对应用程序中的溢出代价进行评估; B.在原有寄存器分配中,为每个应用程序确定合适的访存延迟值; C.使用静态分析的结果以及新的访存延迟建立代价模型,计算使用空闲寄存器类作为快速溢出空间可能带来的收益和代价,并根据计算结果选择是否使用所述使用空闲寄存器类作为快速溢出空间的优化方法。
所述步骤A还进一步包括步骤 A1.计算活跃区间的溢出代价; A2.采用插桩工具以及静态分析汇编代码相结合的方式对应用程序中的溢出代价进行评估。
所述活跃区间,是指在程序中,每个变量拥有的自己的活跃范围。由活跃单元组成,活跃单元与候选变量活跃的基本块一一对应。
所述基本块,是由一定数量的指令组成。
所述计算活跃区间的溢出代价,包括下列步骤 A11.计算每个活跃单元的溢出代价 costi=(ld_cycle×ld_numexp_use+st_cycle×st_numlive_out)×freq A12.计算每个活跃区间的溢出代价 其中n是活跃单元的数量。
所述步骤A2还进一步包括步骤 A21.采用gcc提供的插桩工具统计出每个应用程序的热函数; A22.分析步骤A21统计出的热函数,计算热函数中的溢出代码代价,并将其作为整个应用程序的溢出代价进行分析。
所述热函数的溢出代价,是由热函数中所有基本块的溢出代价组成。基本块的溢出代价,是由所述活跃区间溢出时在此活跃区间的活跃单元需要插入的保存和恢复访存指令组成。
指根据溢出插入的访存与程序中所有访存操作的比值,判断溢出对程序造成的影响, 其中,mi是基本块在第i个程序单元的数量,n是程序单元的数量。
比值越大,说明溢出所占访存比重较高,所述使用空闲寄存器类作为快速溢出空间的优化方法越有可能发挥较好效果。
所述步骤B还进一步包括 B1.采用一级缓存命中时间来设置保存的延迟时间; B2.采用ld_cycle_cache来设置恢复的延迟时间,其中 ld_cycle_cache=ld_hit_cycle+ld_miss_cycle*Dcache_miss_rate ld_hit_cycle和ld_miss_cycle分别表示一级cache读命中以及不命中的延迟; B3.比较ld_cycle_cache和未采用所述使用空闲寄存器类作为快速溢出空间的优化方法时的保存操作延迟,选择较小的作为新的保存操作延迟ld_cycle_irem 其中ld_cycle,是未采用所述使用空闲寄存器类作为快速溢出空间的优化方法时的保存操作延迟。
所述步骤C还进一步包括步骤 C1.计算使用空闲寄存器类作为快速溢出空间的优化方法的代价; C2.计算使用空闲寄存器类作为快速溢出空间的优化方法的收益; C3.为溢出候选选择溢出空间。
所述步骤C1还进一步包括步骤 C11.当选择一个callee寄存器时,代价源于在该寄存器的入口和出口需要增加的保存和恢复指令; 其中n是入口的数量, 其中n是出口的数量。
使用callee寄存器的代价 cost_idle_callee=entry_costs+exit_costs。
C12.当选择一个caller寄存器时,代价还源于使用的过程中需要在其跨越的所有调用点前后增加的保存和恢复指令; 其中,n是使用寄存器的在其跨越的调用点前的基本块的数量, 其中,n是使用寄存器的在其跨越的调用点后的基本块的数量。
使用caller寄存器的代价 cost_idle_caller=before_costs+after_costs C13.使用空闲寄存器还会因为在不同寄存器之间进行通讯而引发新的代价。
所述收益为 benefit=cost_lr-IRE_cost 所述步骤C3还进一步包括步骤 C31.当采用空闲寄存器带来的收益大于其代价时,那么使用空闲寄存器类作为快速溢出空间的优化方法,将此空闲寄存器作为该溢出候选的溢出空间; C32.当采用空闲寄存器带来的收益小于其代价时,那么不使用空闲寄存器类作为快速溢出空间的优化方法,仍然选择原有的内存溢出方式进行溢出,即以内存作为该溢出候选的溢出空间。
本发明的有益效果是 (1)本发明可以有效改善寄存器短缺带来的访存问题; (2)本发明采用优化空闲寄存器的方法后,使得对通信指令的优化较对访存指令的优化更为简单; (3)本发明通过实验发现,硬件上不同寄存器之间的通讯代价是决定本发明性能好坏的主要原因之一,为将来处理器的设计提供了参考依据。



图1是一种使用空闲寄存器类作为快速溢出空间的优化方法的结构图; 图2是使用gprof命令运行插桩后的应用程序的各个函数的信息表; 图3是一种使用空闲寄存器类作为快速溢出空间的优化方法的性能对比图。

具体实施例方式 为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明的一种使用空闲寄存器类作为快速溢出空间的优化方法进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
本发明的一种使用空闲寄存器类作为快速溢出空间的优化方法,充分利用了目前很多处理器提供的硬件支持,将空闲的不同类别的寄存器用作当前短缺寄存器的溢出空间,从而避免和降低了原有溢出访存代码带来的诸多缺点。
其中,所述很多处理器提供的硬件支持,是指很多处理器都提供了在不同类寄存器之间进行直接通讯的指令支持。例如AMD opteronTM,Alpha 21264,MIPS R4000,龙芯-2E,Intel PentiumIII及其后代寄存器。
本发明要解决的技术问题包括 1.对一个应用程序的溢出代价进行分析,评估其对该应用程序性能的影响作用; 2.为该应用程序确定合适的访存延迟值; 3.利用硬件支持,在空闲寄存器类中为各个溢出候选选择可用寄存器。
以下结合上述目标详细介绍本发明一种使用空闲寄存器类作为快速溢出空间的优化方法,如图1所示,包括下列步骤 步骤S100计算活跃区间的溢出代价并采用插桩工具以及静态分析汇编代码相结合的方式对应用程序中的溢出代价进行评估; 步骤S110计算活跃区间的溢出代价; 本发明采用了Chow的基于优先级的寄存器分配方法。在程序中,每个变量都拥有自己的活跃范围。这个活跃范围称为活跃区间(Live Range)。每个尚未获得寄存器的活跃区间组成了寄存器分配过程中待分配的目标队列。活跃区间由活跃单元(Live Unit)组成,活跃单元与基本块(Basic Block,简称BB)一一对应。在寄存器分配过程中,首先计算每个活跃区间的优先级,将它们按照优先级进行排序,优先级高的先进行寄存器分配。当一个活跃区间无法分配到任何寄存器,则放入溢出队列,在溢出阶段集中进行溢出处理。活跃区间的优先级是由他们各自的溢出代价决定的,活跃区间的溢出代价越高,它的优先级越高。因此,为优先级高(即溢出代价高)的活跃区间先进行分配,从而使整个程序的溢出代价尽可能的少,所以,具有较低优先级的活跃区间更有可能被溢出。以下具体介绍每个活跃区间的优先级计算方法,即每个活跃区间的溢出代价的计算方法。
为了能方便的解释活跃区间溢出代价的计算方法,首先要明确以下几个基本概念 基本块(Basic Block)由一定数量的指令组成; 程序单元(Program Unit)由基本块组成; 活跃区间(Live range)一个变量活跃的基本块的集合; 活跃单元(Live unit)候选变量活跃的基本块; 执行频率(freq)指定基本块的执行频率(我们使用train输入集来获取动态执行频率); 访存延迟(ld_cycle,st_cycle)访存操作的延迟,如load和store指令; 溢出代价(costi)一个活跃单元的溢出代价; 使用ld_numexp_use来表示一个活跃单元内由于出现没有定义点的引用,从而在溢出时需要插入的load操作的个数; 使用st_numlive_out来表示由于一个定义的活跃区间超出了该定义存在的活跃单元,从而在溢出时需要为其插入的store操作的个数。
因此,每个活跃单元溢出代价如下 costi=(ld_cycle×ld_numexp_use+st_cycle×st_numlive_out)×freq 每个活跃区间的溢出代价计算如下 n is the number of live units 步骤S120采用插桩工具以及静态分析汇编代码相结合的方式对应用程序中的溢出代价进行评估; 对于一个应用程序而言,如果没有硬件资源或者模拟器的支持,程序中溢出代码对性能的影响是很难进行评估的。但是,我们可以通过分析静态中间代码来衡量溢出代码对整个程序的影响。本发明提供了一种静态分析溢出代价的方法,它采用插桩产生的每个基本块的执行频率,统计整个应用程序的溢出代价。
步骤S121采用gcc提供的插桩工具统计出每个应用程序的热函数; 使用gcc-p命令,对各个应用程序进行插桩.使用gprof命令运行插桩后的应用程序后会得到各个函数的信息,如图2所示。输出信息中,函数按照执行时间占应用程序总执行时间的比率进行排列。列于最前面的函数为热函数。它们的执行时间较长,对性能的影响也较明显。
步骤S122将步骤S121统计出的热函数作为我们分析的对象。采用我们的编译器提供的插桩方法对应用程序进行插桩,插桩后的应用程序采用train作为输入集进行运行,运行时每个热函数中基本块的动态执行频率经过统计后输出到反馈信息文件中。根据这些反馈信息,我们来计算热函数中的溢出代码代价,并将其作为整个应用程序的代价进行分析。
一个应用程序的溢出代价由每个热函数(Program Unit,or PU)的溢出代价组成。每个热函数的溢出代价由热函数中所有基本块(Basic Block,or BB)的溢出代价组成。每个基本块的溢出代价是由各个活跃区间溢出时在此活跃区间的活跃单元需要插入的保存和恢复访存指令组成的。在现有大多数处理器技术中,由于采用了store buffer等技术,使得store操作在遇到cache缺失时代价很小,基本与一级cache命中的时间相同。而当load操作发生cache缺失时,系统需要花费几十甚至上百拍的延迟来处理缺失。因此,本发明主要考虑load操作对性能的影响。我们将应用程序中的访存load操作分为2类一种是正常的访存,即程序自身带有的访存操作,记做normal_ld;另一种是溢出插入的访存,记做spill_ld。溢出造成的影响用spill_ld_to_ld_ratio来表示,它由spill_ld以及所有load操作之间的比值得出 (mi is the number of BBs in the ith PU,n is the number of PUs) BBs多个基本块 Pus多个程序单元 对一个应用程序来说,当spill_ld_to_ld_ratio较高时,说明溢出所占访存比重较高,IRE越有可能发挥较好效果,而当spill_ld_to_ld_ratio增加,说明溢出代价增加了,性能可能会因此有所下降。
步骤S200在原有寄存器分配中,为每个应用程序确定合适的访存延迟值; 在寄存器分配的过程中,待分配的活跃区间按照优先级的大小顺序排列在候选队列中。一个活跃区间的优先级取决于其可能引入的溢出代价,这个代价是把一个活跃区间进行溢出时需要引入的访存代价,它由两部分构成把数据从内存恢复到寄存器(load)和把数据从寄存器放入内存(store)。当访存延迟值受到cache缺失的影响而产生变化时,活跃区间的优先级会发生一定变化,进而影响寄存器分配的过程.在本发明中,IRE不再考虑store的cache缺失问题,因为很多体系结构都采用了store buffer等技术来缓解store操作的cache缺失问题.对于没采用这些优化技术的系统,store延迟的确定过程与load相同。IRE中,结合load的cache缺失问题,将对其延迟ld_cycle进行重新设置. 在原有寄存器分配过程中,优先级的计算采用一级cache命中时间作为load和store指令的延迟。其实对于不同应用程序,它们的访存行为表现各异,cache缺失对其性能影响也大不相同.因此,在不考虑store延迟的问题的基础上,在设置load延迟时,应该充分考虑cache可能的行为.对于受cache缺失影响大的例子,采用较高的访存延迟。
较佳地,本实施例仍然采用一级cache命中时间来设置st_cycle。
而对于load的延迟问题,由于受到load的cache缺失问题的影响,将对系统的性能产生较大影响,所以我们使用硬件性能统计工具,对每个应用程序的cache缺失率进行统计,然后基于此缺失率,计算出一个新的load延迟,对ld_cycle进行重新设置,记做ld_cycle_cache。
ld_cycle_cache=ld_hit_cycle+ld_miss_cycle*Dcache_miss_rate 其中,ld_hit_cycle和ld_miss_cycle分别表示一级cache读命中以及不命中的延迟。因为load延迟是评估溢出代价的关键参数,因此,当采用固定的st_cycle时,变化load延迟的数值,会影响spill_ld_to_ld_ratio,也会改变溢出对性能的影响。当采用ld_cycle_cache来进行优先级计算和寄存器分配时,其可能比ld_cycle产生更多的溢出代码。因此,我们通过比较ld_cycle_cache和ld_cycle所产生的不同spill_ld_to_ld_ratio,选择较小的一个作为新的load延迟,记做ld_cycle_irem 步骤S300使用静态分析的结果以及新的访存延迟建立代价模型,计算使用空闲寄存器类作为快速溢出空间可能带来的收益和代价,并根据计算结果选择是否使用IRE优化; 因为使用空闲的寄存器会引入两方面的代价 1按照调用规范,使用任何寄存器都需要进行相应的保存和恢复。
2使用空闲寄存器作为溢出空间需要借助寄存器直接的直接通讯指令,这些指令的执行增加了执行代价 因此,我们需要对使用空间寄存器引入的代价以及其带来的收益进行权衡,当收益大于代价时,本发明才可能带来性能上的好处。
步骤S310计算IRE的代价; 步骤S311当选择一个callee-saved寄存器时,代价源于在寄存器的入口和出口需要增加的保存和恢复指令; (n is the number of entries) (n is the number of exits) 使用callee寄存器的代价cost_idle_callee如下 cost_idle_callee=entry_costs+exit_costs 步骤S312当选择一个caller-saved寄存器时,代价还源于使用的过程中需要在其跨越的所有调用点前后增加的保存和恢复指令; (n is the number of bb which uses caller register before call) (n is the number of bbs which uses caller register after call) 使用caller寄存器的代价cost_idle_caller如下 cost_idle_caller=before_costs+after_costs 步骤S313使用空闲寄存器还会因为在不同寄存器之间进行通讯而引发新的代价。当一个溢出活跃区间被溢出,需要在程序中其活跃区间内插入保存和恢复指令。使用空闲寄存器代替原有访存指令时,需要在原有保存和恢复指令的相同位置插入这些通讯指令。因此,由于通讯指令引入的代价与cost_lr的计算相同,记做cost_lr_idle_reg,它与cost_lr的计算方式大体相同,只是需要在计算过程中用transfer_from_cycle和transfer_to_cycle代替ld_cycle和st_cycle. 所以,使用空闲寄存器的代价计算如下 步骤S320计算IRE的收益; 是否使用IRE优化取决于其是否带来收益,用公式表示如下(其中ld_cycle使用ld_cycle_irem代替) benefit=cost_lr-IRE_cost 步骤S330为溢出候选选择溢出空间; 步骤S331当采用空闲寄存器带来的收益大于其代价时,那么使用IRE优化,将此空闲寄存器作为该溢出候选的溢出空间; 步骤S332当采用空闲寄存器带来的收益小于其代价时,那么不使用IRE优化,仍然选择原有的内存溢出方式进行溢出,即以内存作为该溢出候选的溢出空间。
较佳地,本发明在多种处理器上对IRE进行了实验,实验分成两组,分别在具有快速直接通路和无快速直接通路的处理器上进行。
1.在具有快速直接通路的龙芯2E以及PentiumIII上进行IRE实验。在龙芯2e使用空闲浮点寄存器,SPEC2000INT获得了平均2.1%的加速比。其中,gzip(speedup of 8%),crafty(5.7%),and twolf(10%)。图3中介绍了使用不同load延迟后进行IRE优化后的加速比。图中每个测试用例的第一个数据栏表示没有进行IRE优化的基准数据,它采用一级cache命中的延迟作为load延迟;其他三条数据栏均表示采用IRE优化的加速比,它们分别使用一级cache命中、最大的cache缺失延迟以及ld_cycle_irem作为load延迟进行各种代价和收益计算。从图中可以看出bzip2,gzip,crafty和twolf有较明显的性能提升,并且图中并没有例子由于IRE优化出现明显性能下降。从图2中还可以看到vpr、parser、mcf以及gcc这些例子并没有收益于IRE,通过静态溢出代价分析我们可以得知这几个例子都具有较低的spill_ld_to_ld_ratio,即应用程序本身的溢出代价比较低,IRE很难发挥作用。此外,vpr和eon本身就具有一定的浮点操作,使得IRE很难获得可用的浮点寄存器。对于vortex,即使它具有很高的spill_ld_to_ld_ratio(16%),但是它的绝大多数溢出候选都无法获益于空闲浮点寄存器,因此IRE对其不起作用。
PentiumIII同样提供了在mmx和定点寄存器之间的直接快速通路,但是由于mmx与浮点寄存器栈在物理位置上是重叠的,并且使用mmx时需要在原有引用浮点寄存器栈的前后进行现场保存和恢复,这就产生了很大的负面代价。即使有这些负面代价,gzip和bzip2仍然可以获得2.7%和2.1%的加速比。
2.在不具有快速直接通路的PentiumIV and AMD opteronTm上进行IRE实验。这两款处理器都具有定点寄存器和多媒体寄存器之间的通讯指令,但是,这些通讯指令并没有快速直接通路的支持,这使得通讯指令的延迟效率较低,通常是访存指令的2-3倍。因此,在这两种处理器上进行IRE优化实验,SPEC2000INT都会发生或多或少的性能下降。此外,通过对AMD上数据进行性能分析,我们发现使用通讯指令的同时会增加数据cache访问的次数,这也说明AMD上通讯指令的效率较低。
从上述两组实验结果,我们看到不同寄存器之间的直接快速通路是IRE优化获益的条件之一。处理器在提供不同类寄存器之间通讯指令的同时,还应该将直接通路考虑在内,才可以大大提高空闲寄存器的使用率,降低寄存器短缺带来的性能影响。
本发明的有益效果在于 (1)本发明可以有效改善由于寄存器短缺带来的访存问题; (2)本发明采用优化空闲寄存器的方法后,使得对通信指令的优化较对访存指令的优化更为简单; (3)本发明通过实验发现,硬件上不同寄存器之间的通讯代价是决定本发明性能好坏的主要原因之一,为将来处理器的设计提供了参考依据。
通过结合附图对本发明具体实施例的描述,本发明的其它方面及特征对本领域的技术人员而言是显而易见的。
以上对本发明的具体实施例进行了描述和说明,这些实施例应被认为其只是示例性的,并不用于对本发明进行限制,本发明应根据所附的权利要求进行解释。
权利要求
1.一种使用空闲寄存器类作为快速溢出空间的优化方法,其特征在于,包括下列步骤
A.计算活跃区间的溢出代价并采用插桩工具以及静态分析汇编代码相结合的方式对应用程序中的溢出代价进行评估;
B.在原有寄存器分配中,为每个应用程序确定合适的访存延迟值;
C.使用静态分析的结果以及新的访存延迟建立代价模型,计算使用空闲寄存器类作为快速溢出空间可能带来的收益和代价,并根据计算结果选择是否使用所述使用空闲寄存器类作为快速溢出空间的优化方法。
2.根据权利要求1所述的方法,其特征在于,所述步骤A还进一步包括步骤
A1.计算活跃区间的溢出代价;
A2.采用插桩工具以及静态分析汇编代码相结合的方式对应用程序中的溢出代价进行评估。
3.根据权利要求1或2所述的方法,其特征在于,所述活跃区间,是指在程序中,每个变量拥有的自己的活跃范围。
4.根据权利要求1或2所述的方法,其特征在于,所述活跃区间,是由活跃单元组成,活跃单元与候选变量活跃的基本块一一对应。
5.根据权利要求4所述的方法,其特征在于,所述基本块,是由一定数量的指令组成。
6.根据权利要求2所述的方法,其特征在于,所述计算活跃区间的溢出代价,包括下列步骤
A11.计算每个活跃单元的溢出代价
costi=(ld_cycle×ld_numexp_use+st_cycle×st_numlive_out)×freq;
A12.计算每个活跃区间的溢出代价
其中n是活跃单元的数量。
7.根据权利要求2所述的方法,其特征在于,所述步骤A2还进一步包括步骤
A21.采用gcc提供的插桩工具统计出每个应用程序的热函数;
A22.分析步骤A21统计出的热函数,计算热函数中的溢出代码代价,并将其作为整个应用程序的溢出代价进行分析。
8.根据权利要求7所述的方法,其特征在于,所述热函数的溢出代价,是由热函数中所有基本块的溢出代价组成。
9.根就权利要求8所述的方法,其特征在于,所述基本块的溢出代价,是由所述活跃区间溢出时在此活跃区间的活跃单元需要插入的保存和恢复访存指令组成。
10.根据权利要求7所述的方法,其特征在于,其中步骤A22中,所述的分析,是指根据溢出插入的访存与程序中所有访存操作的比值,判断溢出对程序造成的影响,
其中,mi是基本块在第i个程序单元的数量,n是程序单元的数量。
11.根据权利要求10所述的方法,其特征在于,所述比值越大,说明溢出所占访存比重较高,所述使用空闲寄存器类作为快速溢出空间的优化方法越有可能发挥较好效果。
12.根据权利要求1所述的方法,其特征在于,所述步骤B还进一步包括
B1.采用一级缓存命中时间来设置保存的延迟时间;
B2.采用ld_cycle_cache来设置恢复的延迟时间,其中
ld_cycle_cache=ld_hit_cycle+ld_miss_cycle*Dcache_miss_rate
ld_hit_cycle和ld_miss_cycle分别表示一级cache读命中以及不命中的延迟;
B3.比较ld_cycle_cache和未采用所述使用空闲寄存器类作为快速溢出空间的优化方法时的保存操作延迟,选择较小的作为新的保存操作延迟ld_cycle_irem
其中ld_cycle,是未采用所述使用空闲寄存器类作为快速溢出空间的优化方法时的保存操作延迟。
13.根据权利要求1所述的方法,其特征在于,所述步骤C还进一步包括步骤
C1.计算使用空闲寄存器类作为快速溢出空间的优化方法的代价;
C2.计算使用空闲寄存器类作为快速溢出空间的优化方法的收益;
C3.为溢出候选选择溢出空间。
14.根据权利要求13所述的方法,其特征在于,所述步骤C1还进一步包括步骤
C11.当选择一个callee寄存器时,代价源于在该寄存器的入口和出口需要增加的保存和恢复指令;
C12.当选择一个caller寄存器时,代价还源于使用的过程中需要在其跨越的所有调用点前后增加的保存和恢复指令;
C13.使用空闲寄存器还会因为在不同寄存器之间进行通讯而引发新的代价。
15.根据权利要求14所述的方法,其特征在于,步骤C11中,
其中n是入口的数量,
其中n是出口的数量。
16.根据权利要求14所述的方法,其特征在于,步骤C11中,所述使用callee寄存器的代价
cost_idle_callee=entry_costs+exit_costs。
17.根据权利要求14所述的方法,其特征在于,在步骤C12中,
其中,n是使用寄存器的在其跨越的调用点前的基本块的数量,
其中,n是使用寄存器的在其跨越的调用点后的基本块的数量。
18.根据权利要求14所述的方法,其特征在于,步骤C12中,所述使用caller寄存器的代价
cost_idle_caller=before_costs+after_costs。
19.根据权利要求14所述的方法,其特征在于,步骤C13中,所述代价为
20.根据权利要求13所述的方法,其特征在于,步骤C2中,所述收益为
benefit=cost_lr-IRE_cost。
21.根据权利要求13所述的方法,其特征在于,所述步骤C3还进一步包括步骤
C31.当采用空闲寄存器带来的收益大于其代价时,那么使用空闲寄存器类作为快速溢出空间的优化方法,将此空闲寄存器作为该溢出候选的溢出空间;
C32.当采用空闲寄存器带来的收益小于其代价时,那么不使用空闲寄存器类作为快速溢出空间的优化方法,仍然选择原有的内存溢出方式进行溢出,即以内存作为该溢出候选的溢出空间。
全文摘要
本发明公开了一种使用空闲寄存器类作为快速溢出空间的优化方法。该方法包括下列步骤计算活跃区间的溢出代价并采用插桩工具以及静态分析汇编代码相结合的方式对应用程序中的溢出代价进行评估;在原有寄存器分配中,为每个应用程序确定合适的访存延迟值;使用静态分析的结果以及新的访存延迟建立代价模型,计算使用空闲寄存器作为快速溢出空间可能带来的收益和代价,并根据计算结果选择是否使用一种使用空闲寄存器类作为快速溢出空间的优化方法。其能够有效缓解溢出带来的负面效应,并且弥补了软件溢出优化方法中访存压力无法有效改善的不足。
文档编号G06F9/45GK101216774SQ20081005560
公开日2008年7月9日 申请日期2008年1月3日 优先权日2008年1月3日
发明者方 吕, 冯晓兵, 扬 杨, 超 张, 蕾 王 申请人:中国科学院计算技术研究所
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1