优化运行时别名检查
背景技术:
1.别名是指可以通过程序中的不同符号名称来访问存储器中的数据位置的情况。因此,通过一个名称来修改数据隐式修改与所有别名相关联的值。因此,别名对编译器的性能和编译器生成的代码的正确性具有各种影响。如果在编译时不知道指针别名的值,则将运行时别名检查插入到编译代码中。
附图说明
2.图1是根据一些实施方案的用于优化运行时别名检查的示例计算装置的框图。
3.图2是根据一些实施方案的用于优化运行时别名检查的示例方法的流程图。
4.图3是根据一些实施方案的用于优化运行时别名检查的示例方法的流程图。
5.图4是根据一些实施方案的用于优化运行时别名检查的示例方法的流程图。
6.图5是根据一些实施方案的用于优化运行时别名检查的示例方法的流程图。
7.图6是根据一些实施方案的用于优化运行时别名检查的示例方法的流程图。
具体实施方式
8.在一些实施方案中,一种优化运行时别名检查的方法包括:由编译器在代码循环中识别基指针和基于所述基指针的多个不同存储器访问;由所述编译器生成第一运行时代码部分以确定所述多个不同存储器访问的最小访问和最大访问;以及由所述编译器生成包括对所述最小访问的一个或多个运行时别名检查以及对所述最大访问的一个或多个运行时别名检查的第二运行时代码部分。
9.在一些实施方案中,所述一个或多个运行时别名检查基于所述代码循环中的一个或多个其他基指针。在一些实施方案中,所述方法包括:由所述编译器在所述代码循环中识别基于所述基指针的第一存储器访问组和基于另一基指针的第二存储器访问组,其中所述第一存储器访问组和所述第二存储器访问组共享公共存储器访问模式;其中生成所述第一运行时代码部分以确定所述多个不同存储器地址的所述最小访问和所述最大访问包括由所述编译器生成所述第一运行时代码部分以基于所述公共存储器访问模式确定所述最小访问和所述最大访问。在一些实施方案中,生成所述第一运行时代码部分以确定所述多个不同存储器地址的所述最小访问和所述最大访问包括:由所述编译器生成所述第一运行时代码部分以基于所述公共存储器访问模式确定所述另一基指针的另一最小访问以及所述另一基指针的另一最大访问;并且生成所述第二运行时代码部分包括由所述编译器生成包括对所述另一最小访问的一个或多个运行时别名检查以及对所述另一最大访问的一个或多个运行时别名检查的所述第二运行时代码部分。在一些实施方案中,所述方法包括:由所述编译器在所述代码循环中识别基于所述基指针的第一存储器访问组和基于另一基指针的第二存储器访问组,其中所述第一存储器访问组和所述第二存储器访问组共享公共存储器访问模式;由所述编译器生成第三运行时代码部分以基于所述最小访问确定另一最小访问并基于所述最大访问确定另一最大访问;其中生成所述第二运行时代码部分包括由所述
编译器生成包括对所述另一最小访问的一个或多个运行时别名检查以及对所述另一最大访问的一个或多个运行时别名检查的所述第二运行时代码部分。在一些实施方案中,所述方法包括:由所述编译器确定所述一个或多个运行时检查的估计成本;以及由所述编译器确定所述估计成本低于阈值;其中生成所述第一运行时代码部分和生成所述第二运行时代码部分是响应于所述估计成本低于所述阈值而执行的。在一些实施方案中,所述方法包括由所述编译器对所述代码循环应用一个或多个循环优化。
10.在一些实施方案中,一种用于优化运行时别名检查的设备执行包括以下各项的步骤:由编译器在代码循环中识别基指针和基于所述基指针的多个不同存储器访问;由所述编译器生成第一运行时代码部分以确定所述多个不同存储器访问的最小访问和最大访问;以及由所述编译器生成包括对所述最小访问的一个或多个运行时别名检查以及对所述最大访问的一个或多个运行时别名检查的第二运行时代码部分。
11.在一些实施方案中,所述一个或多个运行时别名检查基于所述代码循环中的一个或多个其他基指针。在一些实施方案中,所述步骤包括:由所述编译器在所述代码循环中识别基于所述基指针的第一存储器访问组和基于另一基指针的第二存储器访问组,其中所述第一存储器访问组和所述第二存储器访问组共享公共存储器访问模式;其中生成所述第一运行时代码部分以确定所述多个不同存储器地址的所述最小访问和所述最大访问包括由所述编译器生成所述第一运行时代码部分以基于所述公共存储器访问模式确定所述最小访问和所述最大访问。在一些实施方案中,生成所述第一运行时代码部分以确定所述多个不同存储器地址的所述最小访问和所述最大访问包括:由所述编译器生成所述第一运行时代码部分以基于所述公共存储器访问模式确定所述另一基指针的另一最小访问以及所述另一基指针的另一最大访问;并且生成所述第二运行时代码部分包括由所述编译器生成包括对所述另一最小访问的一个或多个运行时别名检查以及对所述另一最大访问的一个或多个运行时别名检查的所述第二运行时代码部分。在一些实施方案中,所述步骤包括:由所述编译器在所述代码循环中识别基于所述基指针的第一存储器访问组和基于另一基指针的第二存储器访问组,其中所述第一存储器访问组和所述第二存储器访问组共享公共存储器访问模式;由所述编译器生成第三运行时代码部分以基于所述最小访问确定另一最小访问并基于所述最大访问确定另一最大访问;其中生成所述第二运行时代码部分包括由所述编译器生成包括对所述另一最小访问的一个或多个运行时别名检查以及对所述另一最大访问的一个或多个运行时别名检查的所述第二运行时代码部分。在一些实施方案中,所述步骤包括:由所述编译器确定所述一个或多个运行时检查的估计成本;以及由所述编译器确定所述估计成本低于阈值;其中生成所述第一运行时代码部分和生成所述第二运行时代码部分是响应于所述估计成本低于所述阈值而执行的。在一些实施方案中,所述步骤包括由所述编译器对所述代码循环应用一个或多个循环优化。
12.在一些实施方案中,一种用于优化运行时别名检查的计算机程序产品设置在计算机可读介质上并且包括计算机程序指令,所述计算机程序指令在被执行时使计算机执行包括以下各项的步骤:由编译器在代码循环中识别基指针和基于所述基指针的多个不同存储器访问;由所述编译器生成第一运行时代码部分以确定所述多个不同存储器访问的最小访问和最大访问;以及由所述编译器生成包括对所述最小访问的一个或多个运行时别名检查以及对所述最大访问的一个或多个运行时别名检查的第二运行时代码部分。
13.在一些实施方案中,所述一个或多个运行时别名检查基于所述代码循环中的一个或多个其他基指针。在一些实施方案中,所述步骤包括:由所述编译器在所述代码循环中识别基于所述基指针的第一存储器访问组和基于另一基指针的第二存储器访问组,其中所述第一存储器访问组和所述第二存储器访问组共享公共存储器访问模式;其中生成所述第一运行时代码部分以确定所述多个不同存储器地址的所述最小访问和所述最大访问包括由所述编译器生成所述第一运行时代码部分以基于所述公共存储器访问模式确定所述最小访问和所述最大访问。在一些实施方案中,生成所述第一运行时代码部分以确定所述多个不同存储器地址的所述最小访问和所述最大访问包括:由所述编译器生成所述第一运行时代码部分以基于所述公共存储器访问模式确定所述另一基指针的另一最小访问以及所述另一基指针的另一最大访问;并且生成所述第二运行时代码部分包括由所述编译器生成包括对所述另一最小访问的一个或多个运行时别名检查以及对所述另一最大访问的一个或多个运行时别名检查的所述第二运行时代码部分。在一些实施方案中,所述步骤包括:由所述编译器在所述代码循环中识别基于所述基指针的第一存储器访问组和基于另一基指针的第二存储器访问组,其中所述第一存储器访问组和所述第二存储器访问组共享公共存储器访问模式;由所述编译器生成第三运行时代码部分以基于所述最小访问确定另一最小访问并基于所述最大访问确定另一最大访问;其中生成所述第二运行时代码部分包括由所述编译器生成包括对所述另一最小访问的一个或多个运行时别名检查以及对所述另一最大访问的一个或多个运行时别名检查的所述第二运行时代码部分。在一些实施方案中,所述步骤包括:由所述编译器确定所述一个或多个运行时检查的估计成本;以及由所述编译器确定所述估计成本低于阈值;其中生成所述第一运行时代码部分和生成所述第二运行时代码部分是响应于所述估计成本低于所述阈值而执行的。
14.根据本公开的运行时别名检查通常用计算机来实现,即用自动化计算机器来实现。因此,为了进一步解释,图1阐述了根据某些实施方案的包括被配置用于优化运行时别名检查的示例性计算机100的自动化计算机器的框图。图1的计算机100包括至少一个计算机处理器102或
‘
cpu’以及通过高速存储器总线106和总线适配器108连接到处理器102和计算机100的其他部件的随机存取存储器104(
‘
ram’)。
15.存储在ram 104中的是操作系统110。在被配置用于优化运行时别名检查的计算机中有用的操作系统包括unix
tm
、linux
tm
、microsoft windows
tm
以及本领域技术人员将想到的其他操作系统。图1的示例中的操作系统110示出在ram 104中,但是此类软件的许多部件通常也存储在非易失性存储器中,例如存储在诸如磁盘驱动器的数据存储装置112上。还存储在ram中的是用于优化运行时别名检查的编译器114。
16.图1的计算机100包括通过扩展总线118和总线适配器108耦合到处理器102和计算机100的其他部件的磁盘驱动器适配器116。磁盘驱动器适配器116以数据存储装置112的形式将非易失性数据存储装置连接到计算机100。在被配置用于优化运行时别名检查的计算机中有用的磁盘驱动器适配器包括集成驱动电子(
‘
ide’)适配器、小型计算机系统接口(
‘
scsi’)适配器以及本领域技术人员将想到的其他适配器。在一些实施方案中,如本领域技术人员将想到,非易失性计算机存储器被实现为光盘驱动器、电可擦除可编程只读存储器(所谓的
‘
eeprom’或
‘
闪存’存储器)、ram驱动器等。
17.图1的示例计算机100包括一个或多个输入/输出(
‘
i/o’)适配器120。i/o适配器通
过例如软件驱动器和计算机硬件来实现面向用户的输入/输出,以控制到例如计算机显示屏的显示装置的输出,以及来自例如键盘和鼠标的用户输入装置122的用户输入。图1的示例计算机100包括视频适配器124,所述视频适配器是专门设计用于将图形输出到例如显示屏或计算机监控器的显示装置126的i/o适配器的示例。视频适配器124通过高速视频总线128、总线适配器108和也是高速总线的前端总线130连接到处理器102。
18.图1的示例性计算机100包括用于与其他计算机进行数据通信以及用于与数据通信网络进行数据通信的通信适配器132。此类数据通信通过rs-232连接、通过诸如通用串行总线(
‘
usb’)的外部总线、通过诸如ip数据通信网络的数据通信网络以及通过本领域技术人员将想到的其他方式串行执行。通信适配器实现数据通信的硬件级别,一台计算机通过它直接地或通过数据通信网络将数据通信发送到另一台计算机。在被配置用于优化运行时别名检查的计算机中有用的通信适配器的示例包括用于有线拨号通信的调制解调器、用于有线数据通信的以太网(ieee 802.3)适配器和用于无线数据通信的802.11适配器。
19.为了进一步解释,图2阐述了说明用于优化运行时别名检查的示例性方法的流程图,所述方法包括由编译器114在代码循环(例如,要由编译器114编译的代码204中的代码循环)中识别202基指针和基于指针的多个不同存储器访问。代码循环包括代码204的迭代部分(例如,“for”循环、“while”循环等)。基指针是对指向存储器中位置的指针的符号引用。例如,基指针对应于代码循环中声明的变量,或对应于对包括代码循环的函数的属性输入。
20.基于基指针的多个不同存储器访问是使用基指针或者基指针和偏移量对存储器中的位置的访问。在不使用偏移量访问存储器而仅使用基指针的情况下,偏移量被认为是null。因此,在讨论基指针和偏移量的组合的情况下,假设此类组合包括基指针本身(例如,具有null偏移量)。下标包括循环感应变量和/或循环感应变量和偏移量的组合。循环感应变量包括在代码循环的迭代期间修改的变量。偏移量包括值,循环感应变量被加上或减去所述值以确定在循环的每次迭代期间访问的特定存储器位置。特定存储器访问由其基指针和其偏移量定义。
21.示例代码204如下所示,以下称为“foo”示例函数:
[0022][0023]
在“foo”示例函数中,“i”用作循环感应变量。代码循环包括基指针“a”、“x1”、“x2”、“x3”和“x4”。在“foo”示例函数中,基指针“a”用作循环的每次迭代期间十二种不同存储器访问的基础:a[p]、a[q]、a[r]、a[2*p]、a[2*q]、a[2*r]、a[3*p]、a[3*q]、a[3*r]、a[4*
p]、a[4*q]、a[4*r]。每个存储器访问对应于相对于循环期间的存储器访问所访问的地址范围。特定存储器访问的范围由其基指针、其偏移量以及由循环感应变量确定的存储器访问范围定义。例如,假定“i”的起始值为“s”并且“i”的结束值为“e”,则存储器访问范围a[i+p]将在a[s+p]处开始并在a[s+e]处结束。
[0024]
多个不同存储器访问是读访问和/或写访问。基指针被识别为无法在编译时确定。因此,无法在编译时确定多个不同存储器访问所针对的具体存储器地址。此外,基指针被识别为无法在编译时确定的多个基指针中的一个。
[0025]
图2的方法还包括生成206第一运行时代码部分207(例如,机器可执行指令)以确定多个不同存储器访问的最小访问和最大访问。假定多个不同存储器访问被表示为基指针或者基指针和偏移量,那么最小访问是存储器访问范围内的最低存储器访问,并且最大访问是存储器访问范围的最高存储器访问。
[0026]
在“foo”示例函数中,基指针“a”用作循环的每次迭代期间十二种不同存储器访问的基础:a[p]、a[q]、a[r]、a[2*p]、a[2*q]、a[2*r]、a[3*p]、a[3*q]、a[3*r]、a[4*p]、a[4*q]、a[4*r]。因此,最小访问“min_a”被确定为min(a[p],a[q],a[r],a[2*p],a[2*q],a[2*r],a[3*p],a[3*q],a[3*r],a[4*p],a[4*q],a[4*r])并且最大访问被确定为max(a[p],a[q],a[r],a[2*p],a[2*q],a[2*r],a[3*p],a[3*q],a[3*r],a[4*p],a[4*q],a[4*r])。换言之,当执行时,第一运行时代码部分207确定“min_a”和“max_a”。
[0027]
图2的方法还包括生成208包括对最小访问的一个或多个运行时别名检查和对最大访问的一个或多个运行时别名检查的第二运行时代码部分210(例如,机器可执行指令)。运行时别名检查是确定给定传感器访问的存储器范围(例如,给定传感器访问所访问的存储器范围)是否与另一存储器访问的存储器范围冲突的函数。当写存储器访问的范围与另一存储器访问(例如,读存储器访问或另一写存储器访问)的范围重叠时,存在冲突。运行时别名检查被包括在可执行代码(例如,编译代码210)中,使得运行时别名检查在执行可执行代码时被执行。
[0028]
在现有解决方案中,针对每种不同的存储器访问(例如,每个基指针和偏移量组合)执行运行时别名检查,使得将每个写存储器访问的存储器范围与每个其他存储器访问的存储器访问范围进行比较。换言之,假设存储器访问分组,将该存储器访问分组中的每个写访问的范围与该分组中每个其他存储器访问的范围进行比较。随着不同存储器访问数量的增加,运行时别名检查的数量也增加。
[0029]
相反,生成运行时代码(例如,第一运行时代码部分207和第二运行时代码部分210),使得对于与多个存储器访问相关联的给定基指针,仅将最小访问和最大访问包括在运行时别名检查的存储器访问分组中。换言之,基指针的运行时别名检查从多个不同存储器访问中排除除最小访问和最大访问之外的存储器访问。在基指针是第一基指针并且第二基指针被包括在代码循环中并与多个不同存储器访问相关联的情况下,生成运行时别名检查的分组将包括对第一基指针的最小访问和最大访问以及对第二基指针的最小访问和最大访问等。
[0030]
返回上面的“foo”函数的示例,如果在现有解决方案中对每个存储器访问生成了运行时别名检查,则运行时别名检查的集合如下:
[0031]
1)范围检查x1&a(所有访问)
[0032]-x1&a[p]
[0033]-x1&a[q]
[0034]-x1&a[r]
[0035]-x1&a[2*p]
[0036]-x1&a[2*q]
[0037]-x1&a[2*r]
[0038]-x1&a[3*p]
[0039]-x1&a[3*q]
[0040]-x1&a[3*r]
[0041]-x1&a[4*p]
[0042]-x1&a[4*q]
[0043]-x1&a[4*r]
[0044]
2)范围检查x2&a
[0045]-与x1&a一样,x2需要针对a的12次访问进行范围检查
[0046]
3)范围检查x3&a
[0047]-与x1&a一样,x3需要针对a的12次访问进行范围检查
[0048]
4)范围检查x4&a
[0049]-与x1&a一样,x4需要针对a的12次访问进行范围检查
[0050]
5)范围检查x1&x2
[0051]
6)范围检查x1&x3
[0052]
7)范围检查x1&x4
[0053]
8)范围检查x2&x3
[0054]
9)范围检查x2&x4
[0055]
10)范围检查x3&x4
[0056]
相反,通过排除基于基指针a的存储器访问而不是最小访问和最大访问,运行时别名检查如下:
[0057]
1)识别最小访问和最大访问:
[0058]
min_a=min(a[p],a[q],a[r],a[2*p],a[2*q],a[2*r],a[3*p],a[3*q],a[3*r],a[4*p],a[4*q],a[4*r])
[0059]
max_a=max(a[p],a[q],a[r],a[2*p],a[2*q],a[2*r],a[3*p],a[3*q],a[3*r],a[4*p],a[4*q],a[4*r])
[0060]
2)范围检查x1&a(最小访问和最大访问):
[0061]
(a)x1&min_a(b)x1&max_a
[0062]
3)范围检查x2&a(最小访问和最大访问):
[0063]
(a)x2&min_a(b)x2&max_a
[0064]
4)范围检查x3&a(最小访问和最大访问):
[0065]
(a)x3&min_a(b)x3&max_a
[0066]
5)范围检查x4&a(最小访问和最大访问):
[0067]
(a)x4&min_a(b)x4&max_a
[0068]
6)范围检查x1&x2
[0069]
7)范围检查x1&x3
[0070]
8)范围检查x1&x4
[0071]
9)范围检查x2&x3
[0072]
10)范围检查x2&x4
[0073]
11)范围检查x3&x4
[0074]
这通过减少所需的运行时别名检查的数量来提高计算性能。在一些实施方案中,编译器114对需要运行时别名检查的代码循环应用循环优化(例如,自动矢量化、循环版本控制、循环分布、循环负载消除、循环平铺等)。在此类实施方案中,如果循环优化提供的性能优势超过运行时别名检查的性能成本,则编译器114确定应用循环优化。通过减少所需的运行时别名检查的数量,应用了循环优化,否则这些循环优化会因所需的运行时别名检查数量增加而被拒绝。
[0075]
在一些实施方案中,第一运行时代码部分207和第二运行时代码部分210被包括在代码204的编译版本中,使得当编译代码被执行时执行所生成的运行时别名检查。
[0076]
为了进一步解释,图3阐述了示出用于优化运行时别名检查的示例性方法的流程图,所述方法包括:由编译器114在代码循环中识别202基指针和基于指针的多个不同存储器访问;生成206第一运行时代码部分207以确定多个不同存储器访问的最小访问和最大访问;以及生成208包括对最小地址的一个或多个运行时别名检查以及对最大地址的一个或多个运行时别名检查的第二运行时代码部分210。
[0077]
图3的方法与图2的不同之处在于图3的方法还包括在代码循环中识别302基于第一指针的第一存储器访问组和基于另一基指针的第二存储器访问组,其中所述第一存储器访问组和所述第二存储器访问组共享公共存储器访问模式。给定基指针的存储器访问组包括相对于该基指针的所有存储器访问。存储器访问组的存储器访问模式包括用于存储器访问中的每一个的下标(例如,偏移量)的集合。考虑以下函数,以下称为“foo2”示例函数:
[0078][0079]
在“foo2”示例函数中,基指针a的存储器访问组是(a[p],a[q],a[r],a[2*p],a[2*q],a[2*r],a[3*p],a[3*q],a[3*r],a[4*p],a[4*q],a[4*r])。基指针a的存储器访问模式是([p],[q],[r],[2*p],[2*q],[2*r],[3*p],[3*q],[3*r],[4*p],[4*q],[4*r])。“foo2”示例函数还包括基指针b,其与a共享同一存储器访问模式。
[0080]
图3的方法与图2的不同之处还在于,生成206第一运行时代码部分207以确定多个不同存储器地址的最小访问和最大访问包括:生成304第一运行时代码部分以基于公共存储器访问模式确定最小访问和最大访问。例如,生成第一运行时代码部分207以包括用于在运行时从公共存储器访问模式中识别最小值和最大值的指令。继续“foo2”示例,此类指令表示为“min_common=min(p,q,r,2*p,2*q,2*r,3*p,3*q,3*r,4*p,4*q,4*r),max_common=max(p,q,r,2*p,2*q,2*r,3*p,3*q,3*r,4*p,4*q,4*r)”,其中min_common是公共存储器访问模式中的最小值,并且max_common是公共存储器访问模式中的最大值。
[0081]
然后通过将基指针递增公共存储器访问模式中的最小值来确定最小访问值,并且通过将基指针递增公共存储器访问模式中的最大值来确定最大访问。因此,生成第一运行时代码部分207以包括用于通过将基指针递增公共存储器访问模式中的最小值来确定运行时的最小访问的指令,以及用于通过将基指针递增公共存储器访问模式中的最大值来确定最大访问的指令。
[0082]
为了进一步解释,图4阐述了示出用于优化运行时别名检查的示例性方法的流程图,所述方法包括:由编译器114在代码循环中识别202基指针和基于指针的多个不同存储器访问;在代码循环中识别302基于第一指针的第一存储器访问组和基于另一基指针的第
二存储器访问组,其中第一存储器访问组和第二存储器访问组共享公共存储器访问模式;通过生成304第一运行时代码部分以基于公共存储器访问模式确定最小访问和第二最小访问来生成206第一运行时代码部分207以确定多个不同存储器访问的最小访问和最大访问;以及生成208包括对最小地址的一个或多个运行时别名检查以及对最大地址的一个或多个运行时别名检查的第二运行时代码部分210。
[0083]
图4的方法与图3的不同之处在于,生成206第一运行时代码部分207以确定多个不同存储器访问的最小访问和最大访问还包括:生成402第一运行时代码部分207以基于公共存储器访问模式确定另一基指针的另一最小访问和另一最大访问。例如,生成第一运行时代码部分207以包括用于找出公共存储器访问模式的最小值和公共存储器访问模式的最大值的指令。然后生成第一运行时代码部分207以使用所确定的公共存储器访问模式的最小值和公共存储器访问模式的最大值来确定对共享公共存储器访问模式的任何基指针的最小访问和最大访问。继续“foo2”示例函数,通过将b基指针递增公共存储器访问模式的最小值(例如,通过执行第一运行时代码部分207)来确定b基指针的最小访问,并且通过将b基指针递增公共存储器访问模式的最大值来确定最大访问。
[0084]
图4的方法与图3的不同之处在于,生成208包括对最小访问的一个或多个运行时别名检查以及对最大访问的一个或多个运行时别名检查的第二运行时代码部分210包括:生成404包括对另一最小访问的一个或多个运行时别名检查以及对另一最大访问的一个或多个运行时别名检查的第二运行时代码部分210。因此,第二运行时代码部分210包括对第一基指针的最小访问和最大访问以及对第二基指针的最小访问和最大访问的运行时别名检查。
[0085]
为了进一步解释,图5阐述了示出用于优化运行时别名检查的示例性方法的流程图,所述方法包括:由编译器114在代码循环中识别202基指针和基于指针的多个不同存储器访问;生成206第一运行时代码部分207以确定多个不同存储器访问的最小访问和最大访问;以及生成208包括对最小地址的一个或多个运行时别名检查以及对最大地址的一个或多个运行时别名检查的第二运行时代码部分210。
[0086]
图5的方法与图2的不同之处在于图5的方法还包括在代码循环中识别502基于第一指针的第一存储器访问组和基于另一基指针的第二存储器访问组,其中所述第一存储器访问组和所述第二存储器访问组共享公共存储器访问模式。图5的方法与图2的不同之处还在于,图5的方法还包括生成504第三运行时代码部分以基于(例如,基指针的)最小访问确定(例如,另一基指针的)另一最小访问并基于(例如,基指针的)最大访问确定(例如,另一基指针的)另一最大访问。
[0087]
当执行第三运行时代码部分506时,已确定基指针的最小访问和最大访问。由于另一基指针与基指针共享最小访问模式,通过将另一基指针递增由基指针递减的最小访问来确定(例如,通过执行第三运行时代码部分506)另一基指针的另一最小访问。通过将另一基指针递增由基指针递减的最大访问来确定(例如,通过执行第三运行时代码部分506)另一基指针的另一最大访问。继续基指针a和b共享公共存储器访问模式的“foo2”示例函数,b的最小访问“min_b”被确定为“min_b=b+min_a
–
a”。b的最大访问“max_b”被确定为“max_b=b+max_a
–
a”。
[0088]
图5的方法与图2的不同之处在于,生成208包括对最小访问的一个或多个运行时
别名检查以及对最大访问的一个或多个运行时别名检查的第二运行时代码部分210包括:生成508包括对另一最小访问的一个或多个运行时别名检查以及对另一最大访问的一个或多个运行时别名检查的第二运行时代码部分210。因此,第二运行时代码部分210包括对第一基指针的最小访问和最大访问以及对第二基指针的最小访问和最大访问的运行时别名检查。
[0089]
为了进一步解释,图6阐述了示出用于优化运行时别名检查的示例性方法的流程图,所述方法包括:由编译器114在代码循环中识别202基指针和基于指针的多个不同存储器访问;生成206第一运行时代码部分207以确定多个不同存储器访问的最小访问和最大访问;以及生成208包括对最小地址的一个或多个运行时别名检查以及对最大地址的一个或多个运行时别名检查的第二运行时代码部分210。
[0090]
图6的方法与图2的不同之处在于,图6的方法还包括确定602一个或多个运行时检查的估计成本。例如,估计成本表示为运行时检查的数量或执行运行时检查所需的指令数量。运行时检查或执行运行时检查所需的指令的数量是基于多个不同存储器访问中的存储器访问的数量而确定的。
[0091]
图6的方法与图2的不同之处还在于,图6的方法还包括确定604估计成本低于阈值。作为示例,阈值对应于应用一个或多个循环操作的预期性能。因此,第一运行时代码部分207和第二运行时代码部分210仅在成本低于阈值时生成。在将响应于应用一个或多个循环优化而生成第一运行时代码部分207和第二运行时代码部分210的情况下,仅在估计成本低于阈值时执行循环优化。
[0092]
鉴于上述说明,读者将认识到,根据本公开的实施方案优化运行时别名检查的益处包括:
[0093]
●
通过减少编译代码中所需的运行时别名检查数量提高了计算系统的性能。
[0094]
●
由于运行时别名检查数量的减少,通过促进循环优化的使用提高了计算系统的性能。
[0095]
主要在用于优化运行时别名检查的全功能计算机系统的上下文中描述了本公开的示例性实施方案。然而,本领域的技术人员将认识到,本公开还可以体现在计算机程序产品中,所述计算机程序产品设置在计算机可读存储介质上,以与任何合适的数据处理系统一起使用。此类计算机可读存储介质可以是用于机器可读信息的任何存储介质,包括磁性介质、光学介质或其他合适的介质。此类介质的示例包括硬盘驱动器或软盘中的磁盘,用于光驱的光盘、磁带以及本领域的技术人员会想到的其他介质。本领域的技术人员将立即认识到,具有合适的编程装置的任何计算机系统将能够执行如在计算机程序产品中体现的本公开的方法的步骤。本领域的技术人员还将认识到,尽管本说明书中描述的一些示例性实施方案针对安装在计算机硬件上并且在计算机硬件上执行的软件,但是实现为固件或硬件的替代性实施方案也完全在本公开的范围内。
[0096]
本公开可以是系统、方法和/或计算机程序产品。计算机程序产品可以包括其上具有用于使处理器执行本公开的各方面的计算机可读程序指令的一个或多个计算机可读存储介质。
[0097]
计算机可读存储介质可以是可以保留和存储供指令执行装置使用的指令的有形装置。计算机可读存储介质可以为例如但不限于电子存储装置、磁性存储装置、光学存储装
置、电磁存储装置、半导体存储装置或前述各项的任何合适的组合。计算机可读存储介质的更具体示例的非详尽列表包括以下项:便携式计算机软盘、硬盘、随机存取存储器(ram)、只读存储器(rom)、可擦除可编程只读存储器(eprom或快闪存储器)、静态随机存取存储器(sram)、便携式光盘只读存储器(cd-rom)、数字多功能磁盘(dvd)、记忆棒、软盘、机械编码装置(例如穿孔卡或槽中的凸起结构,其上记录有指令),以及前述各项的任何合适的组合。如本文所使用的计算机可读存储介质不应被理解为本身是暂时性信号,例如无线电波或其他自由传播的电磁波,通过波导或其他传输介质传播的电磁波(例如,通过光纤电缆的光脉冲),或通过导线传输的电信号。
[0098]
本文所述的计算机可读程序指令可以从计算机可读存储介质下载到相应的计算/处理装置,或者经由网络(例如,互联网、局域网、广域网和/或无线网络)下载到外部计算机或外部存储装置。网络可以包括铜传输电缆、光传输光纤、无线传输、路由器、防火墙、交换机、网关计算机和/或边缘服务器。每个计算/处理装置中的网络适配器卡或网络接口从网络接收计算机可读程序指令,并且转发计算机可读程序指令以存储在相应的计算/处理装置内的计算机可读存储介质中。
[0099]
用于执行本公开的操作的计算机可读程序指令可以是汇编指令、指令集架构(isa)指令、机器指令、机器相关指令、微代码、固件指令、状态设置数据或以一种或多种编程语言的任何组合编写的源代码或目标代码,所述一种或多种编程语言包括面向对象的编程语言,例如smalltalk、c++等,以及常规的过程编程语言,例如“c”编程语言或类似的编程语言。作为独立的软件包,计算机可读程序指令可全部在用户的计算机上执行、部分在用户的计算机上执行;部分在用户的计算机上并且部分在远程计算机上执行或全部在远程计算机或服务器上执行。在后一情形中,远程计算机可通过任何类型的网络连接到用户的计算机,包括局域网(lan)或广域网(wan),或该连接可以(例如,使用互联网服务供应商通过互联网)连接到外部计算机。在一些实施方案中,包括例如可编程逻辑电路、现场可编程门阵列(fpga)或可编程逻辑阵列(pla)的电子电路可通过利用计算机可读程序指令的状态信息来个性化电子电路来执行计算机可读程序指令,以便执行本公开的各个方面。
[0100]
在本文中参照根据本公开的实施方案的方法、设备(系统)和计算机程序产品的流程图图解和/或框图来描述本公开的各方面。应理解,流程图图示和/或框图的每个框以及流程图图示和/或框图中的框的组合可以由计算机可读程序指令来实施。
[0101]
这些计算机可读程序指令可以被提供给通用计算机、专用计算机或其他可编程数据处理设备的处理器以产生机器,使得经由计算机或其他可编程数据处理设备的处理器执行的指令建立用于实现在流程图和/或框图的一个或多个框中指定的功能/动作的装置。这些计算机可读程序指令还可以被存储在计算机可读存储介质中,所述计算机可读存储介质可以指导计算机、可编程数据处理设备和/或其他装置以特定方式起作用,使得在其中存储有指令的计算机可读存储介质包括制品,所述制品包括实现在流程图和/或框图的一个或多个框中指定的功能/动作的各方面的指令。
[0102]
计算机可读程序指令还可以被加载到计算机、其他可编程数据处理设备或其他装置上以使一系列操作步骤在计算机、其他可编程设备或其他装置上执行以产生计算机实现的过程,使得在计算机、其他可编程设备或其他装置上执行的指令实现流程图和/或框图的一个或多个框中指定的功能/动作。
[0103]
附图中的流程图和框图示出了根据本公开的各种实施方案的系统、方法和计算机程序产品的可能实现方式的体系结构、功能性和操作。在这个方面,流程图或框图中的每个框可以表示包括用于实现所指定的一个或多个逻辑功能的一个或多个可执行指令的指令的模块、区段或部分。在一些替代性实现方式中,框中提到的功能可以不按附图中提到的顺序发生。例如,连续示出的两个框实际上可以大体上同时执行,或者这些框有时可以按相反的顺序执行,这取决于所涉及的功能性。还应指出,框图和/或流程图图解的每个框以及框图和/或流程图图解中的框的组合可以由执行指定的功能或操作的基于专用硬件的系统或者执行专用硬件和计算机指令的组合来实施。
[0104]
从前面的描述将理解,可以在本公开的各种实施方案中进行修改和改变。本说明书中的描述仅用于说明的目的,而不应被理解为是限制性的。本公开的范围仅由所附权利要求的语言限制。