指针别名关系判断方法和代码多版本优化方法

文档序号:6380740阅读:202来源:国知局
专利名称:指针别名关系判断方法和代码多版本优化方法
技术领域
本发明涉及代码多版本优化技术,特别涉及一种指针别名关系判断方法和代码多版本优化方法。
背景技术
随着计算机体系结构和硬件技术的发展,应用程序的代码量逐年增加,其程序行为在整个执行期间变化复杂,对编译优化的要求也越来也高。优化技术可分为两类静态优化和动态优化。其中,代码多版本技术是动态优化技术的一种,在编译时为指定的程序段利用不同算法或不同优化技术生成多个版本,在运行时根据输入数据集或执行环境等选择一个最佳的版本执行。因此,代码多版本技术的优点是能够为热点代码段动态选择最合适的目标码,实现静态分析时难以解决的优化问题。
然而,代码多版本技术需增加额外计算以获得执行在版本间进行选择的条件信息。在C、C++和Fortran的语言编译环境中,由指针而引发的别名信息就是代码多版本技术执行在版本间进行选择的重要条件信息。
在常用的指针别名关系判断方法中是以保守的方法计算近似的别名信息,也就是说所计算的结果中,会把一些本来不是别名的表达式视为别名。这些不精确的别名分析结果会导致冗余数据依赖关系的产生,限制了版本间的切换调度以及后继优化手段的效果, 从而降低了所生成的目标码的性能,使得目标码占用过多内存,以及导致目标码在执行时占用过大带宽,或处理速度慢。
因此需要提出一种新的指针别名关系判断方法和代码多版本优化方法,以获得更为精确的别名信息,从而增强代码动态多版本优化的优化效率。发明内容
本发明解决的问题是提出一种新的指针别名关系判断方法和代码多版本优化方法,以获得更为精确的别名信息,从而增强代码动态多版本优化的优化效率。
为解决上述问题,本发明的实施例提供了一种指针别名关系判断方法,所述方法包括判断第一循环体在执行一次循环操作时所述第一循环体内的第一指针所指向的第一地址段偏移和第二循环体在执行相同次循环操作时第二循环体内的第二指针所指向的第二地址段偏移是否重合,所述第一循环体和第二循环体是根据待优化循环体生成的两个不同版本;判断所述第一循环体在结束上一次循环操作转入下一次循环操作时所述第一指针指向的第一地址段跨步和所述第二循环体在结束上一次循环操作转入下一次循环操作时所述第二指针指向的第二地址段跨步是否相等;以及如果上述两个判断步骤结果均为是, 则确定所述第一指针和所述第二指针互为指针别名关系。
可选地,所述待优化循环体为循环体大小大于预定标准的循环体。
可选地,所述待优化循环体为循环次数大于预定次数的循环体。
可选地,所述待优化循环体为所包含的指针信息比重大于预定比重的循环体,所述指针信息比重为所述待优化循环体中所有指针读和指针写操作所指向的位置数的总和。
可选地,判断所述第一地址段偏移和所述第二地址段偏移是否重合的方法包括 分别计算出在第一循环体执行一次循环操作时所述第一循环体内的第一指针所指向的第一地址段的上界和下界,和在第二循环体执行相同次循环操作时第二循环体内的第二指针所指向的第二地址段的上界和下界;判断所述第一地址段和第二地址段的上界和下界是否重合。
本发明的实施例还提供了一种代码多版本优化方法,所述方法包括选择待优化的循环体;根据所述待优化循环体生成多个不同版本;生成在所述多个版本相互之间进行切换的测试条件;以及根据所述测试条件来在所述多个版本中进行切换。
可选地,生成在所述多个版本相互之间进行切换的测试条件的方法包括判断所述多个版本之间的指针别名关系;以及根据所述指针别名关系进一步确定所述多个版本之间的选择和切换机制。
可选地,选择待优化的循环体的方法包括选择循环体大小大于预定标准的循环体作为所述待优化循环体。
可选地,选择待优化的循环体的方法包括选择循环次数大于预定次数的循环体作为所述待优化循环体。
可选地,选择待优化的循环体的方法包括选择包含指针信息比重大于预定比重的循环体作为所述待优化循环体,且所述指针信息比重为所述待优化循环体中所有指针读和指针写操作所指向的位置数的总和。
与现有技术相比,本发明的实施例具有以下优点不需要像现有技术那样比对所述第一和第二循环体在整个运算周期内每一次循环执行过程中所述第一和第二指针指向的第一和第二地址段偏移的上下界是否重合,只需要在确认所述第一和第二循环体在执行任意两次相邻循环操作之间所述第一和第二指针指向的第一和第二地址段跨步相等的前提下,进一步判断任意一次循环执行过程中所述第一和第二指针指向的第一和第二地址段偏移是否重合即可,不仅确保了指针别名关系判断的准确性,而且减少了判断指针别名关系过程中的运算量和比对操作,从而提高了多版本优化方法的效率。


图I是现有技术中指针别名关系判断方法的过程示意图2为本发明一实施例中指针别名关系判断方法的流程图3为本发明一实施例中多版本优化方法的流程图。
具体实施方式
现有技术中,在判断根据待优化循环体生成的两个不同版本的循环体包含的指针是否互为别名关系时,需要比对所述两个循环体在整个运算周期内每一次循环执行过程中所述指针指向的地址段偏移上下界是否重合,例如,如图I所示,两个互为不同版本的循环体分别包含第一指针Pl和第二指针P2,如果通过现有技术来判断所述第一指针Pl和第二指针P2是否互为别名关系,需要依次比对在第一次循环过程中所述第一指针Pl的地址段偏移al至a2和在第一次循环过程中所述第二指针P2的地址段偏移bl至b2是否重合、第二次循环过程中所述第一指针Pl的地址段偏移a3至a4和在第二次循环过程中所述第二指针P2的地址段偏移b3至b4是否重合、以及后续每一次循环过程中第一指针Pl的地址段偏移和所述第二指针P2的地址段偏移是否重合。
经研究,发明人发现,当所述待优化循环体的循环次数很大时,现有技术中的指针别名关系判断方法将相应地产生大量的获取指针地址段偏移的计算以及比对指针地址段偏移的操作,这不仅使得优化过程占用过多内存,而且优化速度慢,从而降低了优化过程的整体效率。
针对上述问题,本发明的实施例提供了一种指针别名关系判断方法,图2为本发明一实施例中指针别名关系判断方法的流程图。
为使本发明的上述目的、特征和优点能够更加明显易懂,下面结合附图对本发明的具体实施方式
做详细的说明。在下面的描述中阐述了很多具体细节以便于充分理解本发明,但是本发明还可以采用其他不同于在此描述的其它方式来实施,因此本发明不受下面公开的具体实施例的限制。
首先,请参考图2,执行步骤S101,判断第一循环体在执行一次循环操作时所述第一循环体内的第一指针所指向的第一地址段偏移和第二循环体在执行相同次循环操作时第二循环体内的第二指针所指向的第二地址段偏移是否重合。所述第一循环体和第二循环体是根据待优化循环体生成的两个不同版本。
下面将继续以图I为例对上述判断过程进行详细描述。
如图I所述,所述第一循环体包含第一指针Pl,所述第二循环体包含第二指针P2, 当判断所述第一指针Pl和所述第二指针P2是否互为别名关系时,首先可以判断所述第一循环体在执行任意一次循环操作过程中所述第一指针Pl所指向的第一地址段偏移是否和所述第二循环体执行相同次循环操作过程中所述第二指针P2所指向的第二地址段偏移重八口 ο
例如,在本发明的一实施例中,可以选择判断所述第一循环体执行第一次循环操作过程中所述第一指针Pi所指向的第一地址段偏移和所述第二循环体执行第一次循环操作过程中所述第二指针P2所指向的第二地址段偏移是否重合,在本发明的另一实施例中, 可以选择判断所述第一循环体执行第二次循环操作过程中所述第一指针Pl所指向的第一地址段偏移和所述第二循环体执行第二次循环操作过程中所述第二指针P2所指向的第二地址段偏移是否重合。
在本发明的实施例中,判断所述第一地址段和第二地址段偏移方法包括分别计算出在第一循环体执行一次循环操作时所述第一循环体内的第一指针所指向的第一地址段的上界和下界,和在第二循环体执行相同次循环操作时第二循环体内的第二指针所指向的第二地址段的上界和下界;以及判断所述第一地址段和第二地址段的上界和下界是否重口 ο
如图I所示,判断所述第一循环体执行第一次循环操作过程中所述第一指针Pl所指向的第一地址段偏偏移和所述第二循环体执行第一次循环操作过程中所述第二指针P2 所指向的第二地址段偏移是否重合的方法包括分别计算出在第一循环体执行第一次循环操作时所述第一指针Pl所指向的第一地址段的上界al和下界a2,和在第二循环体执行一次循环操作时第二循环体内的第二指针P2所指向的第二地址段的上界bl和下界b2 ;以及判断所述第一地址段的上界al和下界a2和所述第二地址段的上界bl和下界b2是否重合。 如所述第一地址段的上界al和下界a2和所述第二地址段的上界bl和下界b2是否重合, 则所述第一地址段偏移al至a2和所述第二地址段偏移bl至b2重合。
由于过大的循环体是导致代码膨胀的主要原因之一,在进行代码多版本优化的时候,可以选择循环体大小大于预定标准的循环体作为所述待优化循环体。其次,循环体的执行次数过大也将较大地影响代码的执行速度,因此,也可以选择循环次数大于预定次数的循环体作为所述待优化循环体。
另外,需要说明是,由于多版本优化方法主要涉及指针别名关系,因此,循环体所包含的指针信息比重也是选择待优化循环体的关键因素之一,也就是说,当循环体中涉及的指针操作越多,该循环体越需要被优化。因此,可以选择包含的指针信息比重大于预定比重的循环体作为待优化循环体。与现有技术不同的是,在本发明的实施例中,所述指针信息比重可以通过计算所述待优化循环体中所有指针读和指针写操作所指向的位置数的总和来获得,而不仅仅是通过统计指针的读写次数,使得计算出来的指针信息权重更加能够反映出程序是否包含更复杂的别名关系,从而更加能够显示一个程序是否需要被优化。
接着,请参考图2,执行步骤S102,判断所述第一循环体在结束上一次循环操作转入下一次循环操作时所述第一指针指向的第一地址段跨步和所述第二循环体在结束上一次循环操作转入下一次循环操作时所述第二指针指向的第二地址段跨步是否相等。
下面将继续以图I为例对上述判断过程进行详细描述。请参考图1,例如,在本发明的一实施例中,可以判断所述第一循环体在结束第一次循环操作转入第二次循环操作时所述第一指针指向的第一地址段跨步a2至a3和所述第二循环体在结束第一次循环操作转入第二次循环操作时所述第二指针指向的第二地址段跨步b2至b3是否相等。又例如,在本发明的另一实施例中,可以判断所述第一循环体在结束第二次循环操作转入第三次循环操作时所述第一指针指向的第一地址段跨步a4至a5和所述第二循环体在结束第二次循环操作转入第三次循环操作时所述第二指针指向的第二地址段跨步b4至b5是否相等。
接着,请参考图2,执行步骤S103,如果上述两个判断步骤的结果均为是,则确定所述第一指针和所述第二指针互为指针别名关系。
也就是说,如果所述第一循环体在结束上一次循环操作转入下一次循环操作时所述第一指针指向的第一地址段跨步和所述第二循环体在结束上一次循环操作转入下一次循环操作时所述第二指针指向的第二地址段跨步相等,且所述第一循环体执行一次循环操作时所述第一指针指向的第一地址段偏移和所述第二循环体执行相同次循环操作时所述第二指针指向的所述第二地址段偏移重合,那么可以推断出执行每一次循环操作时所述第一指针指向的第一地址段偏移和所述第二指针指向的所述第二地址段偏移都重合。
例如,如图I所示,如果所述第一循环体在结束第一次循环操作转入第二次循环操作时所述第一指针指向的第一地址段跨步a2至a3和所述第二循环体在结束第一次循环操作转入第二次循环操作时所述第二指针指向的第二地址段跨步b2至b3相等,且执行第一次循环操作时所述第一指针指向的第一地址段偏移al至a2和所述第二指针指向的所述第二地址段偏移bl至b2重合,那么可以推断出执行第二次循环操作时所述第一指针指向的第一地址段偏移a3至a4和所述第二指针指向的所述第二地址段偏移b3至b4也重合, 从而也可以推断出后续每一次循环操作过程中所述第一指针指向的第一地址段偏移和所述第二指针指向的第二地址段偏移重合,最终可以确定所述第一指针Pl和所述第二指针 P2互为指针别名关系。
需要说明的是,按照上述判断方法,不需要像现有技术那样比对所述第一和第二循环体在整个运算周期内每一次循环执行过程中所述第一和第二指针指向的第一和第二地址段偏移是否重合,只需要在确认所述第一和第二循环体在执行任意两次相邻循环操作之间所述第一和第二指针指向的第一和第二地址段跨步相等的前提下,进一步判断任意一次循环执行过程中所述第一和第二指针指向的第一和第二地址段偏移是否重合即可,因此减少了判断指针别名关系过程中的运算量和比对操作,从而提高了多版本优化方法的效率。
本发明的实施例还提供了一种多版本优化方法。图3为本发明一实施例中多版本优化方的流程图。
首先,请参考图3,执行步骤S201,选择待优化的循环体。由于过大的循环体是导致代码膨胀的主要原因之一,在进行代码多版本优化的时候,可以选择循环体大小大于预定标准的循环体作为所述待优化循环体。其次,循环体的执行次数过大也将较大地影响代码的执行速度,因此,也可以选择循环次数大于预定次数的循环体作为所述待优化循环体。
另外,需要说明是,由于多版本优化方法主要涉及指针别名关系,因此,循环体所包含的别名信息比重也是选择待优化循环体的关键因素之一,因此,可以选择包含的别名信息的比重大于预定比重的循环体作为待优化循环体。所述别名信息的比重可以通过计算所述待优化循环体中所有指针读和指针写操作所指向的位置数的总和来获得。也就是说, 当循环体中涉及的指针操作越多,该循环体越需要被优化。
接着,请参考图3,执行步骤S202,根据所述待优化循环体生成多个不同版本。在本发明的一实施例中,根据所述待优化循环体生成多个不同版本的方法包括复制所述待优化循环体;以及根据所述复制的循环体生成所述待优化循环体的多个不同版本。
接着,请参考图3,执行步骤S203,利用上述指针别名关系判断方法生成在所述多个版本之间进行切换的测试条件。在本发明一实施例中,在判断是否在两个版本之间进行切换,首先判断所述两个版本之间是否存在指针别名关系,如果所述两个版本之间存在指针别名关系,再确定在所述两个版本中进行选择和切换的机制。例如,在判断如何在两个互为不同版本的函数体之间进行切换之前,需要先判断这两个函数体之间是否相互包含指针别名关系,具体为,可以通过 if ((a+high_a_l)〈(b+low_b_l) | | (b+high_b_l)〈 (a+low_ a_l)),和elseif (stride_a=stride_b)这两个条件选择语句来作为测试条件来判断,其中 if ((a+high_a_l) < (b+low_b_l) I I (b+high_b_l)〈 (a+low_a_l))是判断两个指针指向的地址段偏移是否重合的条件,elseif (stride_a=stride_b)是用来进一步判断两个指针的地址段跨步是否相等的条件,上述两个条件选择语句是否成立将关系到所述两个函数体之间是否相互包含指针别名关系,所述条件选择语句的分支将根据切换机制选择性地指向两个函数体中的一个。
接着,请参考图3,执行步骤S204,根据所述测试条件来在所述多个版本中进行切换。
以上所述,仅是本发明的较佳实施例而已,并非对本发明作任何形式上的限制。任何熟悉本领域的技术人员,在不脱离本发明技术方案范围情况下,都可利用上述揭示的方法和技术内容对本发明技术方案作出许多可能的变动和修饰,或修改为等同变化的等效实施例。因此,凡是未脱离本发明技术方案的内容,依据本发明的技术实质对以上实施例所做的任何简单修改、等同变化及修饰,均仍属于本 发明技术方案保护的范围内。
权利要求
1.一种指针别名关系判断方法,其特征在于,包括 判断第一循环体在执行一次循环操作时所述第一循环体内的第一指针所指向的第一地址段偏移和第二循环体在执行相同次循环操作时第二循环体内的第二指针所指向的第二地址段偏移是否重合,所述第一循环体和第二循环体是根据待优化循环体生成的两个不同版本; 判断所述第一循环体在结束上一次循环操作转入下一次循环操作时所述第一指针指向的第一地址段跨步和所述第二循环体在结束上一次循环操作转入下一次循环操作时所述第二指针指向的第二地址段跨步是否相等;以及 如果上述两个判断步骤结果均为是,则确定所述第一指针和所述第二指针互为指针别名关系。
2.如权利要求I所述的方法,其特征在于,所述待优化循环体为循环体大小大于预定标准的循环体。
3.如权利要求I所述的方法,其特征在于,所述待优化循环体为循环次数大于预定次数的循环体。
4.如权利要求I所述的方法,其特征在于,所述待优化循环体为所包含的指针信息比重大于预定比重的循环体,所述指针信息比重为所述待优化循环体中所有指针读和指针写操作所指向的位置数的总和。
5.如权利要求I所述的方法,其特征在于,判断所述第一地址段偏移和所述第二地址段偏移是否重合的方法包括分别计算出在第一循环体执行一次循环操作时所述第一循环体内的第一指针所指向的第一地址段的上界和下界,和在第二循环体执行相同次循环操作时第二循环体内的第二指针所指向的第二地址段的上界和下界;判断所述第一地址段和第二地址段的上界和下界是否重合。
6.一种代码多版本优化方法,其特征在于,包括 选择待优化的循环体; 根据所述待优化循环体生成多个不同版本; 利用权利要求I所述方法生成在所述多个版本相互之间进行切换的测试条件; 根据所述测试条件在所述多个版本中进行切换。
7.如权利要求6所述的方法,其特征在于,利用权利要求I所述方法生成在所述多个版本相互之间进行切换的测试条件的方法包括利用权利要求I所述方法判断所述多个版本之间的指针别名关系;以及根据所述指针别名关系进一步确定所述多个版本之间的选择和切换机制。
8.如权利要求6所述的方法,其特征在于,选择待优化的循环体的方法包括选择循环体大小大于预定标准的循环体作为所述待优化循环体。
9.如权利要求6所述的方法,其特征在于,选择待优化的循环体的方法包括选择循环次数大于预定次数的循环体作为所述待优化循环体。
10.如权利要求6所述的方法,其特征在于,选择待优化的循环体的方法包括选择包含指针信息比重大于预定比重的循环体作为所述待优化循环体,且所述指针信息比重为所述待优化循环体中所有指针读和指针写操作所指向的位置数的总和。
全文摘要
本发明提供了一种指针别名关系判断方法和代码多版本优化方法。所述指针别名关系判断方法包括判断第一循环体在执行一次循环操作时所述第一循环体内的第一指针所指向的第一地址段偏移和第二循环体在执行相同次循环操作时第二循环体内的第二指针所指向的第二地址段偏移是否重合,所述第一循环体和第二循环体是根据待优化循环体生成的两个不同版本;判断所述第一循环体在结束上一次循环操作转入下一次循环操作时所述第一指针指向的第一地址段跨步和所述第二循环体在结束上一次循环操作转入下一次循环操作时所述第二指针指向的第二地址段跨步是否相等;以及如果上述两个判断步骤结果均为是,则确定所述第一指针和所述第二指针互为指针别名关系。
文档编号G06F9/44GK102981837SQ201210439950
公开日2013年3月20日 申请日期2012年11月6日 优先权日2012年11月6日
发明者李中升, 马晓东, 尉红梅, 吴佩华, 顾龙 申请人:无锡江南计算技术研究所
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1