执行具有回滚由积极优化导致的变化的能力的积极代码优化的制作方法

文档序号:6359758阅读:120来源:国知局
专利名称:执行具有回滚由积极优化导致的变化的能力的积极代码优化的制作方法
技术领域
本申请一般地涉及一种改进的数据处理 设备和方法,更具体地讲,涉及用于执行具有回滚由积极优化导致的变化的能力的积极代码优化的机制。
背景技术
通常,对于要在计算系统上执行的程序,程序的源代码被编译并链接以产生可执行代码。作为编译过程的一部分,编译器通常对源代码执行一项或多项优化以便能够实现程序的更高效的执行。尽管编译器可识别变换源代码以优化其执行的许多机会,但编译器通常受限于它能够执行的优化,或者根据正在编译的源代码的语义可在哪里应用这种优化。例如,因为边界条件存在的可能性,很少或从不实际发生的边界情形行为限制代码的优化。也就是说,因为当通过特定编译器优化变换了特定源代码语句时该特定源代码语句可能导致边界条件发生,所以即使它可能很少在执行期间实际发生,编译器也不能应用原本在不存在这种可能的边界条件的情况下可能应用的优化。这种边界条件包括例如把源代码变换为跨越存储页边界的优化代码并且该页不可访问,即,该存储页被设置为不可用于读、写或者读和写,或者该页已被“换出(paged out)”,意味着存储在外部存储介质上并且从主内存和页表中去除。例如,可能受这种边界情形行为影响的一种编译器优化是标量源代码变换为编译的向量代码。编译器试图在这种变换之后保留原始源代码的行为。然而,在把标量代码变换为向量代码时,可能出现这种情况原始标量代码在使用顺序标量代码执行进行执行时将不具有任何边界条件违反,但在变换为以并行方式执行的向量代码时在变换的代码保留源代码的原始行为的情况下可能导致边界条件违反,该边界条件违反可能导致变换的代码的错误执行。此外,当变换要在多线程环境中执行的代码时,变换的代码可能引入线程级竞态条件,在这种状态下,两个或更多的线程以并行方式访问数据的同一部分,因此,由一个线程写数据可能把错误引入到另一线程或另一些线程的操作中。结果,当编译器确定可能在变换的代码中发生边界条件违反时,编译器通常不对代码的该部分执行优化以便避免变换的代码可能以不同于原始源代码的方式工作的任何可能性,而不管这种可能性多小。因此,编译的代码未被尽可能多地优化,因为在存在边界条件违反或与原始源代码不一致的其它行为的可能性的区域中不应用优化。或者,用户可手动地推翻这种编译器行为并指示编译器忽略这些语义。结果,编译器可仍然进行变换,但这可能导致变换的代码的错误操作。此外,用户经常不知道源代码或变换的代码中的特定语义是否必要并且对于推翻编译器的正常行为犹豫不决。

发明内容
在一个说明性实施例中,提供了一种数据处理系统中的用于积极优化计算机代码的方法。该方法包括由在数据处理系统中的处理器上执行的编译器确定应用于源代码的一部分的优化。该方法还包括由编译器确定应用于源代码的该部分的优化是否将会导致不安全的优化代码,因此是否是不安全的优化。不安全的优化代码是这样的代码它引入由优化代码产生的新的异常的源,或者产生与由原始代码本应获得的结果不同的结果。此外,该方法包括响应于确定优化是不 安全的优化,由编译器产生应用了该不安全的优化的源代码的该部分的积极编译代码版本和不应用该不安全的优化的保守编译代码版本。另外,该方法包括由编译器把积极编译代码版本和保守编译代码版本都存储在与数据处理系统关联的存储装置中。在另一说明性实施例中,提供了一种数据处理系统中的用于执行代码的一部分的方法。该方法包括接收具有代码的一部分的可执行代码,在该可执行代码中提供了代码的该部分的积极编译代码版本和保守编译代码版本。数据处理系统的处理器执行积极编译代码版本,并确定在积极编译代码版本的执行期间是否发生异常条件。该方法还包括响应于确定发生异常条件,回滚代码的该部分的状态的变化。此外,该方法包括响应于回滚代码的该部分的状态的变化,在数据处理系统的处理器中执行保守编译代码版本。在其它说明性实施例中,提供了一种包括具有计算机可读程序的计算机可用或可读介质的计算机程序产品。当在计算装置上执行该计算机可读程序时,该计算机可读程序使计算装置执行以上关于方法说明性实施例概述的各种操作和操作的组合。在另一说明性实施例中,提供了一种系统/设备。该系统/设备可包括一个或多个处理器和耦合到所述一个或多个处理器的内存。内存可包括指令,当该指令由所述一个或多个处理器执行时,该指令使所述一个或多个处理器执行以上关于方法说明性实施例概述的各种操作和操作的组合。将在下面对本发明的示例性实施例的详细说明中描述本发明的这些和其它特征和优点,或者考虑到下面对本发明的示例性实施例的详细说明,对于本领域普通技术人员而言,本发明的这些和其它特征和优点将会变得清楚。


通过参照结合附图阅读的下面对说明性实施例的详细描述,将会最好地理解本发明以及它的优选使用模式和另外的目的和优点,在附图中图I是可实现说明性实施例的示例性机制的数据处理系统的示例性方框图;图2是可实现说明性实施例的各方面的数据处理系统的处理器的示例性方框图;图3A示出代码的一部分的原始源代码序列;图3B示出在使代码的一部分向量化从而可由向量处理器更高效地执行的编译器优化之后的同一代码序列;图3C是示出通过图3A和3B中示出的代码的向量化产生的边界条件违反的示例性方框图;图4是根据一个说明性实施例的基本操作元件的示例性方框图;图5是概述根据说明性实施例的当使用积极优化技术编译源代码的一部分时的编译器的操作的流程图;图6是概述根据一个说明性实施例的计算机程序的执行的示例性操作的流程图;图7是概述使用预测机制确定是否执行代码的一部分的积极编译版本的根据说明性实施例的计算机程序的执行的示例性操作的流程图;图8A是可由编译器向量化以产生优化程序版本的执行标量运算的示例性源程序;图SB是显示编译器可执行以通过使图8A的运算向量化来优化程序的变换的变换的源程序,但潜在地修改程序的异常行为;和图SC是显示根据一个说明性实施例的一事务内的根据图SB的变换的积极编译代码块的变换的源程序。
具体实施例方式说明性实施例提供一种能够在支持由积极编译的代码导致的变化的回滚的系统(例如,使用事务内存结构或其它类型的原子操作的系统)中实现积极编译器优化的机制。在一些说明性实施例中,说明性实施例的机制利用系统的原子行为(例如,基于事务的系统的原子行为)确定积极编译器优化是否将会导致变换和优化的代码的错误操作(例如,边界条件违反、线程级竞态条件等),如果确定结果是肯定的,则回滚通过积极优化的代码的执行导致的变化并代之以代码的较少优化或非优化的版本。尽管基于事务的系统将会用作下面的说明性实施例的描述的基础,但应该理解,本发明不限于此,并且在不脱离本发明的精神和范围的情况下,允许由代码的积极编译的版本导致的变化的回滚的任何系统(例如,支持原子操作的系统)可用于实现说明性实施例的机制。许多系统使用原子操作。原子操作是两个或更多的操作的集合,所述两个或更多的操作能够组合从而使它们对于数据处理系统看起来是这样的它们被作为单个操作执行并仅具有两种可能的结果成功或失败。利用原子操作,其它操作集合中的操作不知道正在由包括该原子操作的操作集合内的操作导致的任何变化,直至整个操作集合完成。此外,利用原子操作,如果操作集合内的任何操作失败,则整个操作集合失败并且系统的状态恢复到在该操作集合内的任何操作开始执行之前系统所处于的状态。原子提交操作是这样的操作,其中一组不同的变化被应用作为单个操作。如果应用了所有变化,则原子提交称为成功。如果在原子提交能够完成之前存在失败,则“提交”中止并且已发生的所有变化被反转或回滚。在任一情况下,原子提交使系统处于一致的状态。当在数据库系统中一次提交多组变化时,经常使用原子提交。原子提交由修改控制系统采用,由此原子提交用于控制把多个文件的变化上传到这些文件的源,同时保证所有文件完全上传并合并。原子提交也由许多事务处理系统(ATM、在线购物等)采用,其中在作为一个团体成功或失败的单个集合中组合对不同系统上的操作(例如,下订单、信用卡交易、存货更新)。原子提交也用在事务内存和推测多线程(也称为线程级推测)的领域中。事务内存通过允许一组加载和存储指令以原子方式执行,尝试简化并发或并行编程,即,保证(I)事务的所有指令成功地完成或者(2)事务的指令不发生影响。利用原子事务,事务的指令看起来一次全部地发生在调用和产生结果之间。
硬件事务内存系统可具有对处理器、高速缓存和总线协议的修改以支持事务或事务块,即,作为一个单元以原子方式执行的指令组。软件事务内存在软件运行时库中提供事务内存语义。软件事务内存能够与硬件支持组合以设计混合事务内存系统。事务内存的概念由Herlihy 和 Moss 的"Transactional Memory:ArchitecturalSupport for Lock-Free Data Structures" (Proceedings of the 20th AnnualInternational Symposium on Computer Architecture, pp. 289-300, May 1993)弓I入。然而,如 Bobba 等人的〃Performance Pathologies in Hardware Transactional Memory"(ISCAO7, June 9-13, 2007)中所述,程序员能够在多线程应用中调用事务,并依赖于事务内存系统使它的执行在全局串行次序中看起来是原子的。Bobba等人讨论了事务内存系统中的冲突解决策略。事务内存系统通过推测性地并发地执行事务并仅提交非冲突的事务而寻求高性能。当两个或更多的并发事务访问同一数据元素(例如,字、块、对象等)并且至少一个访问是写时,发生冲突。事务内存系统可通过停止一个或多个事务解决一些冲突。
推测多线程是发生在与指令级相对的线程级的一种类型的推测执行。推测多线程是动态并行化技术,该技术使用多线程的指令的乱序(out-of-order)执行实现处理器的运算速度的提高。利用推测多线程,如果不存在线程之间的依赖性违反,则可以以原子方式提交由线程执行的变化。专用硬件跟踪推测线程读(加载)和写(存储)数据位置,并中止(即,回滚或消灭)显示为违反实际数据依赖性的线程,例如,竞态条件中涉及的线程。利用说明性实施例的机制,编译器产生源代码的同一部分的两个编译版本。源代码的该部分的第一编译版本称为积极编译代码,因为编译器执行原始源代码的所有合适的变换和优化,而不管对于变换的代码,边界情形行为违反、下溢条件(例如,除以O)、上溢条件(例如,除以无穷大)、线程级竞态条件等是否可能发生。在最广泛的意义上,积极编译代码是这样的代码,其中执行并不总是有效的所有合适的变换和优化,然后回滚可用于恢复。这甚至可应用于迄今为止未知的优化技术。基本上,关于当编译器检测到可能发生违反时中止或不应用变换的编译器的正常操作被推翻,以产生源代码的该部分的该第一编译版本。源代码的该部分的第二编译版本称为保守编译代码,因为编译器不执行可能导致违反或偏离源代码的预期操作的优化,例如,不执行可能导致可产生边界条件违反、线程级竞态条件等的变换的代码的优化。与积极编译代码相比,保守编译代码被较少优化,因为当与积极编译代码相比时,保守编译代码通常将不应用所有合适的可用优化。在以下描述的图8A和SB中提供积极编译代码和保守编译代码的例子。在编译的代码的执行期间,执行将尝试在事务的范围内执行积极编译代码,并监视异常条件(例如,边界条件违反、线程级竞态条件等)。在这种异常条件的情况下,控制被转移给事务管理器。事务管理器包括可实现为硬件、软件或者硬件和软件的任何组合的逻辑,该逻辑用于把代码的执行状态回滚到在产生该异常条件的积极编译代码部分的执行之前的状态。事务管理器随后尝试使用保守编译代码重新执行代码的该部分。以这种方式,提供了一种自动化机制,用于在多数情况下允许积极优化代码执行,而仅在积极优化代码失败(即,产生异常条件)的情况下执行保守优化代码。在另一说明性实施例中,由于就用于执行回滚和重新执行操作的处理器周期的开销而言回滚和重新执行操作很昂贵,所以提供用于确定是否可能发生回滚的预测机制。可基于基于历史的预测方案、代码的分析结果等进行这种确定。响应于可能发生回滚的预测,说明性实施例的机制可改为执行保守编译代码而非尝试执行积极编译代码以避免可能的回滚和重新执行操作。本领域技术人员将会理解,本发明可实现为系统、方法或计算机程序产品。因此,本发明的各方面可以采用通常全部可在本文称为“电路”、“模块”或“系统”的完全硬件实施例、完全软件实施例(包括固件、常驻软件、微码等)或组合软件和硬件方面的实施例的形式。另外,本发明的各方面可以采用实现于具有计算机可用程序代码的任何一个或多个计算机可读介质中的计算机程序产品的形式。可以使用一个或多个计算机可读介质的任何组合。计算机可读介质可以是计算机 可读信号介质或计算机可读存储介质。计算机可读存储介质可以是例如但不限于电子、磁、光学、电磁、红外或半导体系统、设备、装置或者前述各项的任何合适的组合。计算机可读介质的更具体的例子(非穷举列表)将包括下述各项具有一条或多条线的电连接、便携式计算机盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦除可编程只读存储器(EPR0M或闪存)、光纤、便携式压缩盘只读存储器(CDROM)、光学存储装置、磁存储装置或前述各项的任何合适的组合。在这个文件的上下文中,计算机可读存储介质可以是能够包含或存储由指令执行系统、设备或装置使用或结合指令执行系统、设备或装置使用的程序的任何有形介质。计算机可读信号介质可包括例如基带中或作为载波的一部分的嵌入了计算机可读程序代码的传播数据信号。这种传播信号可采用多种形式中的任何形式,包括但不限于电磁信号、光学信号或者它们的任何合适的组合。计算机可读信号介质可以是并非计算机可读存储介质并且能够传送、传播或传输由指令执行系统、设备或装置使用或结合指令执行系统、设备或装置使用的程序的任何计算机可读介质。可以使用合适的介质(包括但不限于无线、有线、光纤光缆、射频(RF)等或前述各项的任何合适的组合)传输计算机可读介质上包含的计算机代码。可以按照一种或多种编程语言的任何组合编写用于执行本发明的各方面的操作的计算机程序代码,所述编程语言包括面向对象的编程语言,诸如Java 、Smalltalk 、C++等;和传统的过程编程语言,诸如“C”编程语言或类似编程语言。程序代码可以完全在用户计算机上执行、部分在用户的计算机上执行、作为独立软件包执行、部分在用户的计算机上并且部分在远程计算机上执行或者完全在远程计算机或服务器上执行。在后一情形中,远程计算机可以通过任何类型的网络(包括局域网(LAN)或广域网(WAN))连接到用户的计算机,或者可以(例如,使用互联网服务提供商通过互联网)连接到外部计算机。以下参考根据本发明的说明性实施例的方法、设备(系统)和计算机程序产品的流程图和/或方框图描述本发明的各方面。将会理解,流程图和/或方框图中的每个方框以及流程图和/或方框图中的方框的组合能够由计算机程序指令实现。这些计算机程序指令可被提供给通用计算机、专用计算机或者其它可编程数据处理设备的处理器,以产生一机器,从而指令(所述指令经由计算机或者其它可编程数据处理设备的处理器执行)产生用于实现流程图和/或方框图的一个或多个方框中指定的功能/动作的装置。这些计算机程序指令也可存储在计算机可读介质中,该计算机可读介质能够指示计算机、其它可编程数据处理设备或其它装置按照特定的方式发挥作用,从而存储在计算机可读介质中的指令产生一种制造产品,所述制造产品包括实现流程图和/或方框图的一个或多个方框中指定的功能/动作的指令。计算机程序指令也可被加载到计算机、其它可编程数据处理设备或其它装置上,以使得在计算机、其它可编程设备或其它装置上执行一系列的操作步骤以产生计算机实现的过程,从而在计算机或其它可编程设备上执行的指令提供用于实现流程图和/或方框图的一个或多个方框中指定的功能/动作的过程。附图中的流程图和方框图示出根据本发明各种实施例的系统、方法和计算机程序产品的可能实现方式的架构、功能和操作。在这个方面,流程图或方框图中的每个方框可代表包括用于实现指定的逻辑功能的一个或多个可执行指令的代码的模块、段或一部分。还应该注意的是,在一些替换的实现方式中,方框中标注的功能可以不按附图中标注的次序执行。例如,事实上,根据涉及的功能,连续示出的两个方框可以基本上同时执行,或者这些 方框有时候可以以相反的次序执行。还应该注意的是,方框图和/或流程图中的每个方框以及方框图和/或流程图中的方框的组合能够由执行指定的功能或动作的基于专用硬件的系统或专用硬件和计算机指令的组合实现。现在参照附图并且特别地参照图1-2,提供了可实现本发明的说明性实施例的数据处理环境的示例图。应该理解,图1-2仅是例子,而并非意图断言或暗示关于可实现本发明的各方面或实施例的环境的任何限制。在不脱离本发明的精神和范围的情况下,可对描述的环境做出许多修改。现在参照附图,图I描述可实现说明性实施例的各方面的示例性分布式数据处理系统的图形表示。分布式数据处理系统100可包括可实现说明性实施例的各方面的计算机的网络。分布式数据处理系统100包含至少一个网络102,网络102是用于提供分布式数据处理系统100内连接在一起的各种装置和计算机之间的通信链路的介质。网络102可包括诸如有线、无线通信链路或光纤光缆的连接。在描述的例子中,服务器104和服务器106以及存储单元108连接到网络102。另夕卜,客户机110、112和114也连接到网络102。这些客户机110、112和114可以是例如个人计算机、网络计算机等。在描述的例子中,服务器104把数据(诸如,引导文件、操作系统映像和应用)提供给客户机110、112和114。在描述的例子中,客户机110、112和114是服务器104的客户机。分布式数据处理系统100可包括未示出的另外的服务器、客户机和其它
>j-U ρ α装直。在描述的例子中,分布式数据处理系统100是具有网络102的互联网,代表使用传输控制协议/互联网协议(TCP/IP)协议组彼此通信的全球的网络和网关的集合。在互联网的中心处是主节点或主机计算机之间的高速数据通信线路的主干,由对数据和消息进行路由的成千的商业、政府、教育和其它计算机系统构成。当然,分布式数据处理系统100也可以实现为包括许多不同类型的网络,诸如例如内联网、局域网(LAN)、广域网(WAN)等。如上所述,图I意图用作例子,而非用作对本发明的不同实施例的架构限制,因此,图I中显示的特定元件不应视为关于可实现本发明的说明性实施例的环境的限制。现在参照图2,显示可实现说明性实施例的各方面的示例性数据处理系统的方框图。数据处理系统200是计算机的例子(诸如,图I中的客户机110),实现本发明的说明性实施例的处理的计算机可用代码或指令可位于该计算机中。在描述的例子中,数据处理系统200采用集线器架构,该集线器架构包括北桥和内存控制器中心(NB/MCH)202以及南桥和输入/输出(I/O)控制器中心(SB/ICH)204。处理单元206、主内存208和图形处理器210连接到NB/MCH 202。图形处理器210可通过加速图形端口(AGP)连接到NB/MCH 202。在描述的例子中,局域网(LAN)适配器212连接到SB/ICH204。音频适配器216、键盘和鼠标适配器220、调制解调器222、只读存储器(ROM) 224、硬盘驱动器(HDD) 226、⑶-ROM驱动器230、通用串行总线(USB)端口和其它通信端口 232以及PCI/PCIe装置234通过总线238和总线240连接到SB/ICH 204。PCI/PCIe装置可 括例如以太网适配器、附加卡和用于笔记本计算机的PC卡。PCI使用卡总线控制器,而PCIe不使用卡总线控制器。ROM224可以是例如闪速基本输入/输出系统(BIOS)。HDD 226 和 CD-ROM驱动器 230 通过总线 240 连接到 SB/ICH204。HDD 226 和 CD-ROM驱动器230可使用例如集成驱动电子设备(IDE)或串行高级技术附接(SATA)接口。超级1/0 (SIO)装置 236 可连接到 SB/1CH 204。操作系统在处理单元206上运行。操作系统协调并提供图2中的数据处理系统200内的各种部件的控制。作为客户机,操作系统可以是可商购获得的操作系统,诸如Microsoft'"'Windows (Microsoft 和 Windows 是 Microsoft Corporation 在美国、其它国家或者这两者的商标)。面向对象的编程系统(诸如,Java 编程系统)可结合操作系统运行并提供从在数据处理系统200上执行的Java 程序或应用对操作系统的调用(Java是Sun Microsystems, Inc.在美国、其它国家或者这两者的商标)。作为服务器,数据处理系统200可以是例如运行高级交互执行(AIX )操作系统或LINUX 1,操作系统的IBM eServer System p 计算机系统(eServer、System p和 AIX 是 International Business Machines Corporation 在美国、其它国家或者这两者的商标,而LINUX是Linus Torvalds在美国、其它国家或者这两者的商标)。数据处理系统200可以是在处理单元206中包括多个处理器的对称多处理器(SMP)系统。或者,可采用单处理器系统。用于操作系统、面向对象的编程系统和应用或程序的指令位于存储装置(诸如,HDD 226)上,并且可位于主内存208中以由处理单元206执行。本发明的说明性实施例的处理可由处理单元206使用计算机可用程序代码执行,该计算机可用程序代码可位于内存(诸如例如,主内存208、ROM 224)中或者位于例如一个或多个外围装置226和230中。总线系统(诸如,如图2中所示的总线238或总线240)可包括一个或多个总线。当然,可使用任何类型的通信结构或架构实现该总线系统,所述通信结构或架构提供附接到该结构或架构的不同部件或装置之间的数据的传输。通信单元(诸如,图2的调制解调器222或网络适配器212)可包括用于发送和接收数据的一个或多个装置。内存可以是例如主内存208、ROM 224或诸如在图2中的NB/MCH 202中找到的高速缓存。本领域普通技术人员将会理解,图1-2中的硬件可根据实现方式而不同。除图1-2中描述的硬件之外或者替代于图1-2中描述的硬件,可使用其它内部硬件或外围装置,诸如闪存、等同的非易失性存储器或光盘驱动器等。此外,在不脱离本发明的精神和范围的情况下,说明性实施例的处理可应用于除前述SMP系统之外的多处理器数据处理系统。
此外,数据处理系统200可采用许多不同数据处理系统中的任何形式,包括客户机计算装置、服务器计算装置、平板计算机、膝上型计算机、电话或其它通信装置、个人数字助理(PDA)等。在一些说明性例子中,数据处理系统200可以是例如便携式计算装置,该便携式计算装置构造为具有提供用于存储操作系统文件和/或用户产生的数据的非易失性存储器的闪存。基本上,数据处理系统200可以是任何已知或者以后开发的数据处理系统而没有架构限制。在一个说明性实施例中,数据处理系统200实现事务内存系统。在一个说明性实施例中,该事务内存系统可以是如以上所讨论的HASTM系统。如本领域通常所知,事务内存系统是这样的系统允许不重叠的事务不中断地并行运行,但为了数据一致性的目的,程序的各部分必须以原子方式执行(即,原子事务),由此事务内存系统允许程序读和修改内存位置作为单个原子操作。利用事务内存系统,事务是由单个线程执行的步骤或程序指令的有限序列。事务可串行地执行,从而一个事务的步骤或指令不与另一事务的步骤或指令交织。事务内存系统提供如下机制通过保证这些内存访问对于外部观测者而言看起来一次全部地发生(即,原子部分或事务提交或中止),保证原子部分或原子事务的原子性。对于关于事务内存系统的更多信息,参考共同转让并且共同待决的No. 12/046,764(现在公开 2009/0235254)的美国专利申请,通过引用将其内容包含于此。说明性实施例利用该事务内存系统执行积极编译代码作为事务,该事务能够利用作为单独的事务的保守编译代码的随后重新执行而被容易地回滚。产生源代码的一部分的这两种编译版本的编译器可在与执行编译并链接的代码的数据处理装置/系统相同的数据处理装置/系统上执行,或者可在一单独的数据处理装置/系统上执行。事务监视器也在相同或不同的数据处理装置/系统上运行,并监视编译并链接的代码的执行以确定积极编译代码是否由于用于产生积极编译代码的积极优化而失败或者产生异常条件。如果积极编译代码失败或产生异常条件,则事务监视器可随后回滚事务并使用代码的该部分的保守编译版本开始代码的该部分的重新执行。为了更好地理解由说明性实施例解决的问题,代码优化的例子显示在图3A和3B中。图3A示出代码的一部分的原始源代码序列。图3A中的代码是通常以顺序的、非并行化方式执行的单指令多数据(SIMD)代码的例子。图3B示出在使代码的一部分向量化从而可由向量处理器更高效地执行的积极编译器优化之后的同一代码序列。具体地讲,向量化的代码可使用向量元素并行地执行。用于把SIMD代码变换为向量化的代码的一种可能的机制的解释描述于共同转让并且共同待决的序列号为12/250,575的美国专利申请,通过引用将其内容包含于此。如图3A中所示,原始代码序列评估数组A的前3个值并把它们存储在前三个数组寄存器X中。这是顺序地完成的,因此,不存在关于违反任何边界条件的担心。图3B示出可通过编译器优化产生的该代码的向量化形式。如果该代码以这种方式被向量化(向量代码使用具有四个元素的向量),则按照四个元素的块读取数组。结果,如图3C中所示,尽管仅3个数组值被该代码使用,但由于向量化而加载了 4个值,也就是说,尽管仅a0、al和a2为了代码的该部分的目的而存储正确的数据,但向量化导致也加载a3。如果a3跨越存储页边界310而进入程序不可访问的存储页320,或者如果a3在不存在的页上并且向量加载触及这个未分配给该进程的存储页,则这指示编程错误并且导致操作系统指示访问违反条件,所述访问违反条件通常终止该应用。在多线程代码中,当a3是由另一进程使用的存储位置时,也会发生程序错误,在这种情况下,如果a3值被写回(可能以错误的方式重写原始代码中不存在的对a3的写更新),则a3的加载可能引起数据的讹误。使用以上例子,图3A中显示的原始代码不会导致边界条件违反,因此将不产生异常。然而,代码的该部分的向量化版本能够导致边界条件违反,并且如果代码尝试跨越存储页边界访问向量元素,则可能因此产生异常条件。该异常条件不存在于原始代码中,而是通过由编译器执行的优化而引入。因此,在已知机制中,编译器将会通常确定不应该对代码的这个部分执行该优化。然而,利用说明性实施例,编译器既产生优化(其中例如由于该优化可能导致产生异常条件,诸如可能产生于边界条件违反等)的积极编译代码,又产生源代码的同一部分的保守编译代码。换句话说,编译器可能原本不会应用于代码的一部分的优化被实际应用于代码的该部分以产生积极编译代码,而不管编译器是否确定这些优化可能导致在执行优化并积极编译的代码时在某些条件下产生异常条件。当产生保守编译代码时,不执行这 些优化。因此,对于编译器确定优化可能产生具有违反原始源代码的预期操作并产生异常条件的可能性的编译代码的源代码的每个部分,编译器既产生代码的积极编译版本又产生代码的保守编译版本。当在使用事务内存系统的数据处理装置/系统上执行时,作为单个事务执行积极编译代码。例如,使用图3B中显示的积极编译代码,语句可以被引入到代码中以指定事务的开始和结束,并且执行出现在事务的开始和结束之间的所有指令作为单个事务。作为例子,图3B中的代码可通过引入下面的语句(以粗体显示)而被变换以作为事务执行
权利要求
1.一种数据处理系统(450)中的用于执行可执行代码(415)的方法,包括 接收具有代码的一部分的可执行代码(415),对于代码的该部分,提供了代码的该部分(415)的积极编译代码版本(420)和保守编译代码版本(430); 在数据处理系统(450)的处理器(206)中执行(610)代码的该部分的积极编译代码版本(420); 确定(620)在积极编译代码版本(420)的执行期间是否发生异常条件; 响应于确定发生异常条件¢20),回滚(630)代码的该部分(415)的状态的变化;以及响应于回滚代码的该部分(415)的状态的变化,在数据处理系统(450)的处理器(206)中执行(660,780)保守编译代码版本(430)。
2.如权利要求I所述的方法,还包括 产生关于代码的可执行部分(415)的积极编译代码版本(420)的执行是否可能导致异常条件发生的预测(720);以及 响应于指示如果执行积极编译代码版本(420)则可能发生异常条件的预测(720),在数据处理系统(450)的处理器(206)中执行保守编译代码版本(430)。
3.如权利要求I所述的方法,其中执行积极编译代码版本(420),作为由数据处理系统(450)的事务监视器(460)监视的单个事务。
4.如权利要求3所述的方法,其中 确定(620)在积极编译代码版本(420)的执行期间是否发生异常条件包括由事务监视器(460)确定包括积极编译代码版本(420)的事务中止还是成功地提交, 响应于确定发生异常条件而回滚(630)代码的该部分(415)的状态的变化包括回滚包括积极编译代码版本(420)的事务,并且所述异常条件引起事务的中止。
5.如权利要求3所述的方法,其中响应于回滚(630)代码的可执行部分(415)的状态的变化在数据处理系统(450)的处理器(206)中执行保守编译代码版本(430)包括 与事务监视器(460)相关联地保持用于把积极编译代码版本(420)映射到保守编译代码版本(430)的数据结构(440);以及 响应于事务中止由事务监视器(460)基于积极编译代码版本(420)在该数据结构(440)中执行查找操作¢50,770)以获得指向对应的保守编译代码版本(430)的指针。
6.如权利要求3所述的方法,还包括 由事务监视器(460)在日志数据结构(470)中记录(640,760)中止的与积极编译代码版本(420)对应的事务; 基于日志数据结构(470)执行积极编译代码版本(420)的执行是否可能导致与积极编译代码版本(420)关联的事务中止的预测操作(720);以及 响应于积极编译代码版本(420)的执行可能导致关联的事务中止的预测,开始(660,780)执行保守编译代码版本(430)而非积极编译代码版本(420)。
7.如权利要求I所述的方法,其中所述积极编译代码版本(420)是以并行方式执行的代码的该部分(415)的向量化版本,并且其中保守编译代码版本(430)是以串行方式执行的标量代码版本。
8.一种包括存储有计算机可读程序的计算机可读存储介质(208,226,230)的计算机程序产品,其中该计算机可读程序当在数据处理系统(450)中执行时使数据处理系统(450) 接收具有代码的一部分的可执行代码(415),对于代码的该部分,提供了代码的该部分(415)的积极编译代码版本(420)和保守编译代码版本(430); 在数据处理系统(450)的处理器(206)中执行(610)代码的该部分的积极编译代码版本(420); 确定(620)在积极编译代码版本(420)的执行期间是否发生异常条件; 响应于确定发生异常条件¢20),回滚(630)代码的该部分(415)的状态的变化;以及响应于回滚代码的该部分(415)的状态的变化,在数据处理系统(450)的处理器(206) 中执行(660,780)保守编译代码版本(430)。
9.如权利要求8所述的计算机程序产品,其中所述计算机可读程序还使数据处理系统 产生关于代码的可执行部分(415)的积极编译代码版本(420)的执行是否可能导致异常条件发生的预测(720);以及 响应于指示如果执行积极编译代码版本(420)则可能发生异常条件的预测(720),在数据处理系统(450)的处理器(206)中执行保守编译代码版本(430)。
10.如权利要求8所述的计算机程序产品,其中执行积极编译代码版本(420),作为由数据处理系统(450)的事务监视器(460)监视的单个事务。
11.如权利要求10所述的计算机程序产品,其中 确定(620)在积极编译代码版本(420)的执行期间是否发生异常条件包括由事务监视器(460)确定包括积极编译代码版本(420)的事务中止还是成功地提交, 响应于确定发生异常条件而回滚(630)代码的该部分(415)的状态的变化包括回滚包括积极编译代码版本(420)的事务,并且所述异常条件引起事务的中止。
12.如权利要求10所述的计算机程序产品,其中所述计算机可读程序使数据处理系统(450)通过以下方式响应于回滚(630)代码的可执行部分(415)的状态的变化在数据处理系统(450)的处理器(206)中执行保守编译代码版本(430) 与事务监视器(460)相关联地保持用于把积极编译代码版本(420)映射到保守编译代码版本(430)的数据结构(440);以及 响应于事务中止由事务监视器(460)基于积极编译代码版本(420)在数据结构(440)中执行查找操作¢50,770)以获得指向对应的保守编译代码版本(430)的指针。
13.如权利要求10所述的计算机程序产品,其中所述计算机可读程序还使数据处理系统 由事务监视器(460)在日志数据结构(470)中记录(640,760)中止的与积极编译代码版本(420)对应的事务; 基于日志数据结构(470)执行积极编译代码版本(420)的执行是否可能导致与积极编译代码版本(420)关联的事务中止的预测操作(720);以及 响应于积极编译代码版本(420)的执行可能导致关联的事务中止的预测,开始(660,780)执行保守编译代码版本(430)而非积极编译代码版本(420)。
14.一种用于执行内存的存储的预测原子提交的设备,包括 处理器(206);和 内存(208),耦合到处理器(206),其中处理器(206)构造为 在内存(208)中接收具有代码的一部分的可执行代码(415),对于代码的该部分,提供代码的该部分(415)的积极编译代码版本(420)和保守编译代码版本(430); 执行(610)代码的该部分(415)的积极编译代码版本(420); 确定(620)在积极编译代码版本(420)的执行期间是否发生异常条件; 响应于确定发生异常条件¢20),回滚(630)代码的该部分(415)的状态的变化;以及响应于回滚代码的该部分(415)的状态的变化,执行(660,780)保守编译代码版本(430)。
15.如权利要求14所述的设备,其中所述处理器(206)还构造为 产生关于代码的可执行部分(415)的积极编译代码版本(420)的执行是否可能导致异常条件发生的预测(720);以及 响应于指示如果执行积极编译代码版本(420)则可能发生异常条件的预测(720),在数据处理系统(450)的处理器(206)中执行保守编译代码版本(430)。
16.如权利要求14所述的设备,其中执行积极编译代码版本(420),作为由事务监视器(460)监视的单个事务。
17.如权利要求16所述的设备,其中 处理器(206)通过由事务监视器(460)确定包括积极编译代码版本(420)的事务中止还是成功地提交而确定(620)在积极编译代码版本(420)的执行期间是否发生异常条件,处理器(206)通过回滚包括积极编译代码版本(420)的事务而响应于确定发生异常条件回滚(630)代码的该部分(415)的状态的变化,并且所述异常条件引起事务的中止。
18.如权利要求16所述的设备,其中所述处理器(206)通过以下方式响应于回滚(630)代码的可执行部分(415)的状态的变化在处理器(206)中执行保守编译代码版本(430) 与事务监视器(460)相关联地保持用于把积极编译代码版本(420)映射到保守编译代码版本(430)的数据结构(440);以及 响应于事务中止由事务监视器(460)基于积极编译代码版本(420)在数据结构(440)中执行查找操作¢50,770)以获得指向对应的保守编译代码版本(430)的指针。
19.如权利要求16所述的设备,其中所述处理器(206)还构造为 由事务监视器(460)在日志数据结构(470)中记录(640,760)中止的与积极编译代码版本(420)对应的事务; 基于日志数据结构(470)执行积极编译代码版本(420)的执行是否可能导致与积极编译代码版本(420)关联的事务中止的预测操作(720);以及 响应于积极编译代码版本(420)的执行可能导致关联的事务中止的预测,开始(660,780)执行保守编译代码版本(430)而非积极编译代码版本(420)。
20.如权利要求14所述的设备,其中所述积极编译代码版本(420)是以并行方式执行的代码的该部分(415)的向量化版本,并且其中保守编译代码版本(430)是以串行方式执行的标量代 码版本。
全文摘要
提供了用于积极优化计算机代码(415)的机制。利用这些机制,接收具有代码的一部分的可执行代码(415),对于代码的该部分,提供了代码的该部分的积极编译代码版本(420)和保守编译代码版本(430)。在数据处理系统(450)的处理器(206)中执行(610)代码的该部分的积极编译代码版本(420)。确定(620)在积极编译代码版本(420)的执行期间是否发生异常条件。响应于确定(620)发生异常条件,回滚(630)代码的该部分的状态的变化。响应于回滚(630)代码的该部分的状态的变化,在数据处理系统(450)的处理器(206)中执行保守编译代码版本(430)。
文档编号G06F9/30GK102782644SQ201180011671
公开日2012年11月14日 申请日期2011年2月25日 优先权日2010年3月1日
发明者M·K·格什温 申请人:国际商业机器公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1