用于x86中动态二进制优化的两阶段提交区域的制作方法

文档序号:6340753阅读:200来源:国知局
专利名称:用于x86中动态二进制优化的两阶段提交区域的制作方法
技术领域
本公开涉及动态二进制优化,更具体来说,涉及用于χ86中的动态二进制优化的 两阶段提交区域。
背景技术
硬件/软件(SW/HW)协同设计架构是用于现代架构创新的前景光明的技术,并且 动态二进制优化是用于HW/SW协同设计架构的重要组成部分。随着事务存储(TM)或硬件 锁省略(HLE)技术的进步,建议为动态二进制优化利用TM/HLE所支持的原子区域。由于保 证原子区域以原子方式、一致地并且隔离地执行,所以原子区域中的代码可重排序,而不涉 及不同线程之间的交互。但是,由于在锁定段上的严格存储器顺序,以锁省略为目标的TM/ HLE所支持的原子区域不一定施加比Χ86中的动态二进制优化技术所需的更强的存储器顺 序,并且更强的存储器顺序通常导致低效架构实现。在Χ86中,存储器指令按照其程序顺序从CPU退出(S卩,有序退出)。但是,退出的 存储数据(即,已用(senior)存储)可按其程序顺序在内部存储缓冲器中缓冲,并且稍后 写到高速缓存/存储器。因此,X86中的存储器指令的执行可被看作具有两个阶段。在第 一阶段,存储器指令从CPU退出,并且按照其原始程序顺序。在第一阶段之后,存储数据保 持在存储缓冲器中,等待第二阶段。在第二阶段,加载指令没有动作,但是存储指令需要按 照其原始程序顺序将数据从存储缓冲器回写到高速缓存(即,有序回写)。因此,在x86中, 两个阶段都有序地执行。在逻辑上,我们可看出,加载指令在第一阶段结束时立即访问存储 器,而存储指令在第二阶段结束时立即访问存储器。因此,如果它们访问不同的存储器,则 X86允许先前的存储与稍后的加载之间的存储器访问的重排序。但是,由于两个阶段中都有 序退出和有序退出-返回,x86不允许两个加载指令或者两个存储指令之间的存储器访问 的任何重排序。在动态二进制优化中,X86还禁止先前的加载与稍后的存储指令之间的存 储器访问的重排序。两个阶段使X86比实现顺序一致性的架构高效得多。存储指令可退出,而无需等 待其数据回写到高速缓存。这消除了因存储未命中引起的对退出的昂贵延迟。为了在必要 时支持关于存储器指令的存储器访问的严格顺序,X86允许使用昂贵的防护指令(包括锁 定指令,因为在X86中,锁定指令还充当对于跨过锁定指令的存储器指令的防护)来强制实 施存储器指令之间的存储器访问的严格顺序。防护指令的实现通过将两个阶段合并成一个 单阶段来使两个阶段同步。因此,防护指令不能退出,直到所有已用存储被写到高速缓存。 这样,可对跨过防护的存储器指令强制实施存储器访问的严格顺序。当然,在防护指令等待 已用的存储的排出的过程中存在开销。在事务存储(TM)和硬件锁省略(HLE)技术中已经有了许多进展。术语“事务存 储”指的是通过允许一组加载和存储指令以原子方式执行来简化并行编程的尝试。这个上 下文中的事务是对共享存储器执行一系列读和写的一段代码。这些读和写在逻辑上在单一 时刻发生,因而中间状态是其它(成功的)事务不可见的。术语“锁省略”设法从包含锁的
5程序代码中消除锁。锁只能从原子区域内部去除。现有TM/HLE技术实现原子区域(或事务)。除了从CPU的指令退出之外,原子区 域中的各存储器指令还需要从推测高速缓存提交。原子区域中的所有指令具有原子提交的 单一阶段或者完全撤回。虽然原子区域可实现许多二进制优化,但是原子区域的实现具有 某种固有的低效。当采用x86中的原子区域的实现时遇到的一个问题在于,原子提交要求 在该区域中的所有存储器指令可提交之前,该区域中的所有存储从存储缓冲器排出到高速 缓存。等待存储的排出可延迟在原子区域之后发生的任何指令的退出。由于原子区域一定 会以原子方式一致并且隔离地执行,所以原子区域中的代码可重排序,而不涉及不同线程 之间的交互。但是,由于关于跨过锁定段边界的存储器指令的存储器访问的严格顺序,以锁 省略为目标的TM/HLE所支持的原子区域不一定施加比x86中的动态二进制优化所需的更 严格的存储器访问顺序。更严格的顺序通常导致效率较低的架构实现。至今,即使有,也是存在极少涉及以动态二进制优化为目标的区域的两个提交阶 段的开发的研究和工作。以推测锁省略为目标的现有TM/HLE技术实现采用单一阶段原子 提交的原子区域。

发明内容
按照本发明的一个方面,提供一种方法,包括加载源二进制代码供计算机系统执行,所述计算机系统包括存储器和处理单元, 所述处理单元包括多个寄存器和至少一个存储缓冲器;在所述源二进制代码的运行时间期间,识别所述源二进制代码中的多个频繁执行 的存储器指令,所述频繁执行的存储器指令包括多个存储指令和多个加载指令;定义包括所述频繁执行的存储器指令的两阶段提交(TSC)区域,并且对所述TSC 区域中的所述多个存储器指令执行二进制优化操作;定义所述两阶段提交(TSC)区域的第一阶段,其中,当由所述处理单元执行时,所 述多个加载指令在所述第一阶段中以原子方式提交,并且所述多个存储指令在所述第一阶 段中退出;定义用于频繁执行的代码块的所述TSC区域的第二阶段,其中,所述多个存储指 令在所述第二阶段中以原子方式提交;以及允许来自所述TSC区域外部的至少一个附加的加载或存储存储器指令在所述TSC 区域的所述第二阶段中退出。按照本发明的另一方面,提供一种包括上面存储了指令的有形存储介质的产品, 所述指令在由处理器执行时引起下列操作,其中包括加载源二进制代码以供执行;在所述源二进制代码的运行时间期间,识别所述源二进制代码中的多个频繁执行 的存储器指令,所述频繁执行的存储器指令包括多个存储指令和多个加载指令;定义包括所述频繁执行的存储器指令的两阶段提交区域,并且对所述区域中的所 述多个存储器指令执行二进制优化操作;定义用于频繁执行的代码块的两阶段提交(TSC)区域的第一阶段,其中,所述多 个加载指令在所述第一阶段中以原子方式提交,并且所述多个存储指令在所述第一阶段中退出;定义用于所述频繁执行的代码块的所述TSC区域的第二阶段,其中,所述多个存 储指令在所述第二阶段中以原子方式提交;以及允许来自所述TSC区域外部的至少一个附加的存储器指令在所述第二阶段中退
出ο按照本发明的又一方面,提供一种系统,包括处理单元,所述处理单元包括多个寄存器和至少一个存储缓冲器;以及存储器,所述存储器配置成容纳将在所述处理器上执行的两阶段提交(TSC)优化 器代码和源二进制代码,其中,当在所述处理器上执行所述TSC优化器代码时,所述TSC优 化器代码使所述处理器执行下列步骤在所述源二进制代码的运行时间期间,识别所述源二进制代码中的多个频繁执行 的存储器指令,所述频繁执行的存储器指令包括多个存储指令和多个加载指令;定义包括所述频繁执行的存储器指令的两阶段提交区域,并且对所述区域中的所 述多个存储器指令执行二进制优化操作;定义用于频繁执行的代码块的TSC区域的第一阶段,其中,所述多个加载指令在 所述第一阶段中以原子方式提交,并且所述多个存储指令在所述第一阶段中退出;定义用于所述频繁执行的代码块的所述TSC区域的第二阶段,其中,所述多个存 储指令在所述第二阶段中以原子方式提交;以及允许来自所述TSC区域外部的至少一个附加的存储器指令在所述第二阶段中退
出ο


要求保护的主题的特征和优点将通过以下与之相符的实施例的详细描述变得显 而易见,所述描述应当参照附图来考虑,其中图1示出符合本公开的存储器系统;图2示出说明符合本公开的两阶段提交(TSC)区域中的优化代码的示范执行的简 图;图3示出说明在这个代码应用于常规原子区域时的图2的代码序列的执行的一个 示例的简图;图4示出说明符合本公开的两阶段提交区域中的代码的示范多线程执行的简图; 以及图5示出符合本公开的示范操作的流程图。
具体实施例方式原子区域的实现具有固有的低效。与X86中实现的常规原子区域关联的一个重要 开销在于,原子提交要求在该区域可提交之前,该区域中的所有存储从存储缓冲器排出到 高速缓存。这可引起原子区域之后的指令等待该区域中的存储指令的排出的延迟。原子提 交的单一阶段不一定施加比二进制优化需要更严格的存储器访问顺序,并且更严格的顺序 通常导致效率较低的实现。
本公开提供定义具有提交的两个独立阶段以取代提交的单一原子阶段的两阶段 提交(TSC)区域的系统和方法。在第一阶段,区域中的加载操作在区域中的指令退出之后 以原子方式来提交,以及在第二阶段,区域中的存储操作在所有存储从存储缓冲器回写到 高速缓存之后以原子方式提交。因此,无需如同常规原子区域方式中那样,通过等待存储的 排出以提交整个区域而使退出之后的指令延迟。相反,允许原本在整个区域提交之后退出 的指令在TSC区域的第二阶段的执行期间(即,在第一阶段中提交该区域之后)退出,而无 需等待存储的排出。TSC区域还在第一阶段(较早)提交加载指令,这可减少因存储器冲突 引起的区域中止。图1示出符合本公开的存储器系统100。系统100包括CPU 102和系统存储器 104。系统还可包括高速缓存/存储器105 (它可包含在系统存储器104中)。CPU 102可 包括处理器寄存器106、108和至少一个CPU存储缓冲器110。CPU 102可包括多个核心处 理单元(以下称作复数“核心”或者单数“核心”),并且各核心可配置成执行多个线程。系 统存储器104可容纳TSC优化器模块代码112、源二进制代码118和目标二进制代码120。 TSC优化器模块代码112可包括两阶段提交(TSC)区域标记器代码116和二进制优化器代 码122。TSC优化器模块代码112可由一个或多个核心来执行以对源二进制代码118进行操 作,以便将代码118变换成目标二进制代码120,下面更详细地说明。整体或部分地将源二 进制代码118变换成目标二进制代码120可包括定义一个或多个两阶段提交(TSC)区域, 并且在TSC区域中执行二进制优化操作,下面详细描述。在操作中,包括加载(Ld)和存储(St)的存储器指令可由CPU 102执行。当加载 指令由CPU 102执行时,加载指令(Ld)可读取存储器,以及在与加载指令关联的数据离开 高速缓存/存储器105并且加载到CPU寄存器108之后退出,如图1中的箭头107所示并 且表示为Ld(I)。存储指令(St)可当与存储指令关联的数据从CPU寄存器106传递给存储 缓冲器110时退出,如图1中的箭头109所示并且表示为M(I)。退出的存储指令在本文中 将称作“已用存储(senior store)”。本文所使用的术语“退出”表示指令被CPU执行并且 离开CPU队列。术语“访问/读/写”指的是使存储器事务成为永久的。因此,例如,当数 据被加载到CPU寄存器中时,加载指令读,而当数据从CPU存储缓冲器移入存储器时,存储 指令写。存储指令(St)可当与存储指令关联的数据从存储缓冲器110传递并且写到高速 缓存/存储器105时对存储器进行写入,如图1中的箭头111所示并且表示为M0)。因 此,根据惯例,在本公开全文中,加载或存储指令之后的括号中的标号分别表示第一和第二 阶段。在两个阶段中,存储器指令可按照其原始的程序顺序(即,有序退出/有序回写)。TSC优化器模块代码112可配置成在运行时间期间监测源二进制代码118,并且确 定频繁运行的代码行和/或代码段118。频繁运行的代码行和/或代码段可识别为定义动 态二进制优化技术的两阶段提交区域的可能目标。在这里,术语“频繁”定义为每单位时间 预定数量的执行和/或发生,或者在给定代码段中的预定数量的执行和/或发生。当然,本 领域的技术人员会知道,某些应用通过二进制优化技术的更大应用可比其它应用更好地执 行,并且因此,本领域的技术人员可基于逐个情况来定义术语“频繁”,以便使给定应用/源 二进制代码118的效率最大化。为此,TSC优化器模块代码112可包括计数器或其它逻辑机 制,以便保持源二进制代码118中的一个或多个代码序列(和/或执行)的运行计数。TSC 优化器模块代码112可比较该计数与预定和/或可编程的阈值,高于该阈值,TSC优化器模块代码112可识别为可形成TSC区域的代码行和/或代码段。一旦源二进制代码118的段和/或行被识别为TSC区域和二进制优化操作的应用 的可能目标,则TSC优化器模块代码112可将各个代码行和/或代码段连接在一起,以便形 成TSC区域。如果代码序列可修改成TSC区域,则TSC区域标记器116可生成将该区域标 记为TSC区域的指令,这可包括生成指示TSC区域开始的指令,并且将该指令插入区域的开 始处,和/或生成指示TSC区域结束的指令,并且将该指令插入TSC区域的结束处。TSC优化器模块122配置成对TSC区域执行二进制优化操作。本文所使用的“二 进制优化”被定义为一个或多个操作,这些操作被设计成提高源二进制代码的性能。本文档 全文中引用的术语“优化”具体指的是对代码执行修改。通常执行这些优化的目的是改进 代码的性能吞吐量,但是存在具有其它目的或其它结果的某些优化。在某些情况下,优化可 对代码执行,以便修改在执行代码时所收集的所得输出数据,而不是尝试改进代码的任何 性能吞吐量。另外,也可执行优化以修改性能监测代码的数据收集能力以及其它目的。在 其它可能的情况下,代码优化可被引入代码中,目的是实现代码的性能吞吐量的增益,只是 为了取得无论什么增益,并且可能因无法预料的情况而引起不希望的性能降级。因此,术语 “优化”不是特定地指将实现理想性能的代码的最佳配置。不一定是如下情况对代码段执 行的如本文档中所提到的任何“优化”能够有可能产生真正最佳的性能(即,最佳理论性能 吞吐量)。相反,本文档中提到“优化”意味着尝试重构代码,以便可能获得对于原始代码的 某种程度的性能提高,或者为了用户的利益而修改代码的某个其它方面(例如,修改如上 所述的所得输出)。如果“优化”打算实现性能提高,则是否实现实际性能提高完全取决于 所执行的修改的类型、原始代码的具体结构和行为、以及执行代码所处的环境。示范二进制 优化操作包括存储器操作,例如重排序加载和/或存储指令,以及非存储器操作,诸如消除 “死的”或未使用的代码,或者以其它方式使源二进制代码流线化。一旦为所识别代码生成TSC区域,并且使用二进制优化操作来优化该代码,则该 代码可被分成这时为给定操作环境优化的目标二进制代码120。如果TSC区域中止,则TSC 区域可被撤回,并且可无需二进制优化而执行原始的二进制源代码118。图2示出说明符合本公开的两阶段提交(TSC)区域中的优化代码的示范执行的 简图200。如图2所示,包括存储和加载指令的二进制代码序列201可包括M[ml],rl和 Ld2[m2], r2,其中与存储指令(Stl)关联的数据可从处理器寄存器(rl)传递并且写到高 速缓存/存储器位置(ml),以及与加载指令仏业)关联的数据可从高速缓存/存储器位 置[m2]读取并且加载到处理器寄存器(rf)中。二进制代码序列还可包括M3[m3],r3和 Ld4[m4],r4,其中与存储指令(M3)关联的数据可从处理器寄存器(r3)传递并且写到高 速缓存/存储器位置Ο ),以及与加载指令(Ld4)关联的数据可从高速缓存/存储器位置 [m4]读取并且加载到处理器寄存器(r4)中。在这个示例中,假定使用二进制优化操作对二 进制代码序列201进行了优化,如上所述。图2提供经过优化的二进制代码序列(St[ml], rl ;Ld2[m2], r2 ;St3[m3], r3 ; Ld4[m4], r4)的TSC区域执行的一个示例。一般来说,可退出存储指令(Stl*M3),并且 加载指令(Ld2和Ld4)可读取并且在TSC区域205的第一阶段202中退出。存储指令Stl 和St3可在第二阶段204写。标记器220可插入该区域的开始处以表示TSC区域205的开 始,并且标记器222可插入该区域的结束处以表示TSC区域205的结束。标记器220和222可用来指示执行代码201的CPU按在两阶段提交方式中那样来执行。第一阶段202中的指令可按照其程序顺序、即二进制代码序列201的顺序发生。具 体来说,第一阶段(Stl (1))206中的存储指令(Ml)在第一阶段(Ld2 (1))208中的加载指 令(Ld2)之前发生。Ld2 (1)208在第一阶段(St3 (1))210中的存储指令(St3)之前发生。 M3(l)210在第一阶段(Ld4(1))212中的加载指令(Ld4)之前发生。存储指令可在第二阶 段中按照其程序顺序发生。具体来说,第二阶段(Stl O))中的存储指令(Ml)可在第二阶 段(St3Q))208中的存储指令( 之前发生。TSC区域第一阶段提交在第一阶段中退出 指令之后发生。具体来说,第一阶段(T(I))中的TSC区域(T)在第一阶段(Stl(I)) 206、 (Ld2 (1))208, (M3 (1)) 210和(Ld4 (1)) 212中的指令退出之后发生。TSC区域第二阶段提 交可在第二阶段中回写存储之后发生。具体来说,第二阶段(T O) )220中的TSC区域(T)在 第二阶段(StK2))214和(St3Q))216中的存储之后发生。在这个示例中,假定Ml、Ld2、 St3和Ld4是两阶段提交区域205中的优化代码序列(使用二进制优化操作),并且指令 Ld5跟随在区域205之后。本文所述的TSC区域205的一个优点在于,可在第一阶段202之后提交存储操作, 并且因此该区域之后的存储器操作无需等待排出存储。这可使例如优化代码序列之后的附 加存储器指令能够在TSC区域205的第二阶段204中执行。例如,可准许加载指令Ld5在第 二阶段204中退出218,即使指令Ld5不是优化代码序列201的一部分。存储指令Stl (2) 和乂3(3)可在第二阶段204中(分别)回写214、216,而与第二阶段204中插入Ld5(l)无 关。与原子区域中的代码的执行不同,在第一阶段202之后,可退出TSC区域之后的存储器 指令,而没有延迟的风险,因为无需等待排出已用存储指令(例如,Stl(I)和M3(l))。因此,在TSC区域205中的第一提交阶段202中,可以原子方式提交该区域中的加 载指令,以及在第二提交阶段204,可以原子方式提交该区域中的存储指令。当然,推测高速 缓存(未示出)可用于缓冲与TSC区域205中的存储器指令(即,加载/存储指令)关联 的数据。高速缓存一致性协议还可用于在TSC区域205执行期间窥探其它线程中可能冲突 的存储器指令。IA高速缓存一致性协议可确保各核心的高速缓存中的数据与共享存储器是 一致的。TSC区域可利用高速缓存一致性来确保存储器操作以原子方式提交或者撤回而没 有影响。TSC区域205的第一提交阶段202可在加载指令和存储指令从CPU退出之后发生。 在第一提交阶段中,与加载指令关联的数据可从高速缓存/存储器中的适当位置读取,然 后加载到寄存器中,以及退出加载指令。与存储指令关联的数据可从寄存器中移出并且写 到存储缓冲器,以及退出存储指令。但是,在第一提交阶段之后,与退出的存储指令(已用 存储)关联的数据可保持在存储缓冲器中,等待在第二提交阶段中写到高速缓存/存储器。 在第一提交阶段之后,窥探可以不再是TSC区域205中的加载指令所必需的,因为该区域中 的所有加载指令都已经提交。但是,窥探可用于TSC区域205中的存储指令,直到TSC区域 的第二提交阶段发生。窥探可用于例如确定任何其它核心是否正对第二提交阶段中相同的 高速缓存/存储器位置进行写入(执行存储指令)。由于两个独立的提交阶段202、204 (第一和第二提交阶段),整个TSC区域205可 不再是原子的,因为其它线程可对相同存储器位置进行写入,并且在提交的两个阶段之间 与TSC区域中的加载冲突没有使该区域撤回。但是,加载指令在第一区域202中以原子方式提交,并且存储指令在第二区域204中以原子方式提交。图3示出说明以上参照图2所述的优化代码序列在这个代码应用于常规原子区 域时的执行的一个示例的简图300。具体来说,图3提供二进制代码序列(St[ml],rl; Ld2[m2],r2 ;St3[m3],r3 ;Ld4[m4],r4)的原子区域执行的一个示例。一般来说,存储指令 (Stl和Μ; )和加载指令(Ld2和Ld4)可在原子区域302的单一阶段中被退出和/或被提 交,其中标记器A标记单一阶段302的结束区域。但是,与上述TSC区域中的代码的执行不 同,Ld5(l)(在原子区域302之后的指令)的退出必须被延迟,直到原子区域302的单一阶 段中的所有存储器指令退出和/或提交。因此,Ld5(l)只能在原子区域A 302整个提交之 后退出。比较图2的TSC区域与图3的原子区域的提交整个TSC区域205的操作,有利的 是,无需将TSC区域之后的存储器指令的退出延迟,直到TSC区域中的所有存储指令被写到 推测高速缓存(如果整个区域为原子的,则会需要这样)。而是,TSC区域之后的存储器指 令能够在TSC区域205的第一提交阶段202之后退出。TSC区域之后的存储器指令可在TSC 区域的第二提交阶段执行期间发生。本文所述的TSC区域还可具有如下优点按照存储器 顺序较早地提交加载指令,有可能减少因可能的存储器冲突引起的任何区域中止。具体来 说,如果其它线程中与Ld2或Ld4冲突的存储器访问在T(I)与TO)之间或者在A中发生, 则原子区域A将中止,但TSC区域205可能不会中止。虽然本文所述的TSC区域可具有比常规原子区域更弱的存储器顺序,但是本文所 述的TSC区域还可允许TSC区域中的存储器指令的重排序,而不涉及不同线程之间的交互。 因此,本公开的用于TSC区域的二进制优化操作可准许较早的存储指令与稍后的加载指令 之间重排序。与X86中的常规存储器模型不同,TSC区域的第一阶段中的加载指令之间的 原子性可允许加载指令之间的任意重排序,并且TSC区域的第二阶段中的存储指令之间的 原子性可允许存储指令之间的任意重排序。本文所述的TSC区域还可允许较早的加载指令 与稍后的存储指令之间重排序,因为TSC区域中的两个提交阶段可确保加载指令早于存储 指令提交。在将二进制优化操作应用于本公开的TSC区域时,可存在防护指令。在一个实施 例中,TSC区域内部的防护指令可在(该区域中的)存储指令被写到推测高速缓存之后退 出。这可帮助强制实施跨过防护指令的严格存储器顺序。因此,TSC区域内的防护指令可 限制较早的存储指令与稍后的加载指令之间的重排序跨过防护指令。在本申请人进行的 实验中,对TSC区域中的防护指令的限制对于该区域中的动态二进制优化操作具有极小影 响,因为防护和锁在X86应用中很少使用。TSC区域可与用于锁省略技术的原子区域并存。例如,TSC优化器112(图1)可配 置成分析区域代码,并且确定该区域是否具有防护。如果该区域中不存在防护,则该区域可 有效地作为TSC区域来优化和执行。如果该区域中存在防护,则TSC优化器112可能会权衡 将该区域当作原子区域以利用锁省略或者将它当作TSC区域以利用有效区域提交的益处。 如果提交益处高于防护开销,则该区域可标记为TSC区域。如果锁省略增益优于提交益处, 则该区域可标记为原子区域,并且该区域可经过优化(包括例如通过忽略防护语义)。此 外,本文所述的TSC区域可比常规原子区域更有效地实现。这可归因于如下事实无需使 TSC区域之后的存储器指令的退出和/或提交延迟直到TSC区域中的所有存储指令被写到
11推测高速缓存。而是,TSC区域之后的存储器指令能够在TSC区域的第一提交阶段之后退 出和/或提交。而且,无需为区域的第一提交阶段之后的加载指令窥探,本文所述的TSC区 域可减少因可能的存储器冲突引起的不必要的区域中止。当数据竞争或者因高速缓存行粒 度冲突检测引起的假数据竞争发生时,这具有提高多线程应用中的性能的可能性。图4示出说明符合本公开的两阶段提交区域中的代码的示范多线程执行的简图 400。为了这个示例,假定存储器位置[m]在代码402和404执行之前具有初始值0。代码 402可在第一线程(线程1)中执行,而代码404可在第二线程(线程2)中执行,其中各 线程在存储器位置[m]操作。在这个示例中,代码402可包括下列存储器指令Ld[m],rl ; Π -rl+1 ;St[m], rl ;表示与加载指令(Ld)关联的数据可从高速缓存/存储器位置[m] 读取并且加载到处理器寄存器(rl)中,处理器寄存器(rl)可递增值1,并且数据可从寄存 器rl存储到高速缓存/存储器位置[m]中。在这个示例中,代码404可包括下列存储器指 令Ld[m],r2 ;r2 - r2+l ;St [m],r2 ;表示与加载指令(Ld)关联的数据可从高速缓存/存 储器位置[m]读取并且加载到处理器寄存器(rf)中,处理器寄存器(rf)可递增值1,并且 数据可从处理器寄存器(rf)存储到存储器位置[m]中。由于两个线程(线程1和2)中的代码402和404的执行,数据被写到存储器[m]。 与本公开一致,如果线程(线程1和2)如本文所述在TSC区域中交织,则在线程1中的代 码402和线程2中的代码404执行时,存储器(m)将具有所产生值1。如果线程1和2被 交织并且加载指令在线程2中发生(在存储指令在线程1中退出之前,与加载指令关联的 数据从存储器(m)读取并且加载到处理器寄存器(rf)中),则存储器指令(加载/存储指 令)能够重叠并且组合值,因而存储器(m)可具有所产生值1。存储器(m)的所产生值1可 对于代码序列的锁定段内部不存在的代码区域发生。相比之下,如果代码402和404在相应常规原子区域中的两个线程(线程1和2) 中执行,则存储器位置[m]不会具有所产生值1。而是,存储器[m]会具有所产生值2。这 是因为代码402和404如果是原子的,必须以原子方式执行(全部或没有),在原子区域中 执行时,在线程1与2之间不存在重叠的可能性。在原子线程1中的代码402的执行将产生 值1,在原子线程2中的代码404的执行也是一样。因此,存储器[m]的所产生值为2。这个 示例证明,原子区域对动态优化施加更强的存储器顺序要求,因为位置[m]中的两个结果1 和2都是正确的,并且原子区域仅允许2作为结果。图5示出根据本公开的一个实施例的示范操作的流程图500。这个实施例的操作 可包括在运行时间分析源二进制代码的分布,以便识别代码中的“热点”(50 。在这里,“热 点”是频繁执行的指令或代码块,如上所述。操作还可包括连接源代码的“热点”以形成目 标二进制代码的区域(504),并且形成包括目标二进制代码的TSC区域(506)。操作还可包 括对TSC区域执行二进制优化操作(例如对存储器指令重排序)(508)。关于TSC区域形 成,根据这个实施例的操作还可包括定义其中加载指令以原子方式提交的TSC区域的第一 阶段(510)以及其中存储指令以原子方式提交的TSC区域的第二阶段(512)。这个实施例 还可包括生成代码以标记TSC区域的开始和/或结束(514)。TSC区域的执行可通过区域 入口处的标记器来触发(516)。附加的加载指令(来自TSC区域外部)可插入TSC区域的 第二阶段,并且允许在第二阶段中提交(518)。在执行期间,如果TSC区域中止(520),则这 个实施例的操作还可包括撤回到原始的源二进制代码供执行(522)。如果TSC区域成功地执行,则这个实施例的操作还可包括继续进行如本文从操作502开始所述的源二进制代码 的运行时间分析。当然,虽然图5示出根据一个实施例的示范操作,但是要理解,在其它实施例中, 图5所示的操作可能并非全部是必要的。实际上,本文中完全预期,本公开的其它实施例可 包括图5所示操作的子组合,和/或本文中完全预期的附加操作。因此,针对一个附图中没 有完全示出的特征和/或操作的权利要求被认为落入本公开的范围和内容之内。存储器104、高速缓存/存储器105和存储缓冲器110可包括下列类型的存储器中 的一个或多个半导体固件存储器、可编程存储器、非易失性存储器、只读存储器、电可编程 存储器、随机存取存储器、闪速存储器、磁盘存储器和/或光盘存储器。作为补充或替代,存 储器104、高速缓存/存储器105和存储缓冲器110可包括其它和/或将来开发的类型的计 算机可读存储器。本文所述方法的实施例可使用处理器和/或其它可编程装置来实现。为此,本文 所述的方法可在其上存储了指令的有形计算机可读介质上实现,指令在由一个或多个处理 器执行时执行这些方法。存储介质可包括任何类型的有形介质,例如任何类型的盘,包括 软盘、光盘、压缩盘只读存储器(⑶-ROM)、可重写压缩盘(⑶-RW)和磁光盘;半导体器件,诸 如只读存储器(ROM)、例如动态随机存取存储器(RAM)和静态RAM等RAM、可擦可编程只读 存储器(EPROM)、电可擦可编程只读存储器(EEPROM)、闪速存储器、磁卡或光卡;或者适合 于存储电子指令的任何类型的介质。除非以其它方式具体说明,否则,从前面的论述中可清楚地理解,在说明书全文 中,采用诸如“操作”、“处理”、“计算”、“运算”、“确定”等术语的论述表示计算机或计算系统 或者类似的电子计算装置或设备的动作和/或过程,所述计算机或计算系统或者类似的电 子计算装置或设备处理表示为计算系统的寄存器和/或存储器中的物理(如电子)量的数 据和/或将其转换为类似地表示为计算系统的存储器、寄存器或者其它这种信息存储、传 送或显示装置中的物理量的其它数据。
权利要求
1.一种方法,包括加载源二进制代码供计算机系统执行,所述计算机系统包括存储器和处理单元,所述 处理单元包括多个寄存器和至少一个存储缓冲器;在所述源二进制代码的运行时间期间,识别所述源二进制代码中的多个频繁执行的存 储器指令,所述频繁执行的存储器指令包括多个存储指令和多个加载指令;定义包括所述频繁执行的存储器指令的两阶段提交(TSC)区域,并且对所述TSC区域 中的所述多个存储器指令执行二进制优化操作;定义所述两阶段提交(TSC)区域的第一阶段,其中,当由所述处理单元执行时,所述多 个加载指令在所述第一阶段中以原子方式提交,并且所述多个存储指令在所述第一阶段中 退出;定义用于频繁执行的代码块的所述TSC区域的第二阶段,其中,所述多个存储指令在 所述第二阶段中以原子方式提交;以及允许来自所述TSC区域外部的至少一个附加的加载或存储存储器指令在所述TSC区域 的所述第二阶段中退出。
2.如权利要求1所述的方法,其中,所述二进制优化操作包括在所述多个频繁执行的 指令中的加载和存储指令的重排序。
3.如权利要求1所述的方法,还包括识别所述多个频繁执行的指令中的防护指令,并且其中所述二进制优化操作还包括限 制加载指令和/或存储指令跨过所述防护指令的重排序。
4.如权利要求1所述的方法,还包括生成入口标记器代码,并且将所述入口标记器代码插入所述TSC区域的开始处,所述 入口标记器代码使所述处理单元开始在TSC模式中的处理;以及生成结束标记器代码,并且将所述结束标记器代码插入所述TSC区域的结束处,所述 结束标记器代码使所述处理单元停止在TSC模式中的处理。
5.如权利要求1所述的方法,还包括由所述处理单元来执行所述TSC区域,并且如果中止在所述TSC区域的执行期间发生, 则所述方法还包括返回到原始的源二进制代码。
6.如权利要求1所述的方法,其中,所述处理单元还包括多个核心,并且所述方法还包 括对于所述TSC区域的所述第一阶段期间的所述加载指令中的至少一个,确定正在由所述 加载指令访问的存储器位置是否正在由所述核心中的不止一个核心在执行期间访问。
7.如权利要求1所述的方法,其中,所述处理单元还包括多个核心,并且所述方法还包 括对于所述TSC区域的所述第二阶段期间的所述存储指令中的至少一个,确定正在由所述 存储指令访问的存储器位置是否正在由所述核心中的不止一个核心在执行期间访问。
8.如权利要求1所述的方法,还包括为所述加载和存储指令建立执行阈值;在运行时间期间监测所述加载和存储指令,并且对其执行次数进行计数,并且其中,所 述频繁执行的加载和存储指令是超过所述执行阈值的指令。
9.如权利要求1所述的方法,其中,当与所述加载指令关联的数据从存储器位置移入 一个或多个寄存器时,所述多个加载指令在所述第一阶段中以原子方式提交;其中,当与所述存储指令关联的数据从一个或多个寄存器移到所述存储缓冲器中的一个或多个位置时, 所述多个存储指令在所述第一阶段中退出;以及其中,当与所述存储指令关联的数据从所 述存储缓冲器移到存储器时,所述多个存储指令在所述第二阶段中以原子方式提交。
10.一种包括上面存储了指令的有形存储介质的产品,所述指令在由处理器执行时引 起下列操作,其中包括加载源二进制代码以供执行;在所述源二进制代码的运行时间期间,识别所述源二进制代码中的多个频繁执行的存 储器指令,所述频繁执行的存储器指令包括多个存储指令和多个加载指令;定义包括所述频繁执行的存储器指令的两阶段提交区域,并且对所述区域中的所述多 个存储器指令执行二进制优化操作;定义用于频繁执行的代码块的两阶段提交(TSC)区域的第一阶段,其中,所述多个加 载指令在所述第一阶段中以原子方式提交,并且所述多个存储指令在所述第一阶段中退 出;定义用于所述频繁执行的代码块的所述TSC区域的第二阶段,其中,所述多个存储指 令在所述第二阶段中以原子方式提交;以及允许来自所述TSC区域外部的至少一个附加的存储器指令在所述第二阶段中退出。
11.如权利要求10所述的产品,其中,所述二进制优化操作包括在所述多个频繁执行 的指令中的加载和存储指令的重排序。
12.如权利要求10所述的产品,其中,所述指令在由所述处理器执行时引起下列附加 操作,其中包括识别所述多个频繁执行的指令中的防护指令,并且其中所述二进制优化操作还包括限 制加载指令和/或存储指令跨过所述防护指令的重排序。
13.如权利要求10所述的产品,其中,所述指令在由所述处理器执行时引起下列附加 操作,其中包括生成入口标记器代码,并且将所述入口标记器代码插入所述TSC区域的开始处,所述 入口标记器代码使所述处理器开始在TSC模式中的处理;以及生成结束标记器代码,并且将所述结束标记器代码插入所述TSC区域的结束处,所述 结束标记器代码使所述处理器停止在TSC模式中的处理。
14.如权利要求10所述的产品,其中,所述指令在由所述处理器执行时引起下列附加 操作,其中包括由所述处理单元来执行所述TSC区域,并且如果中止在所述TSC区域的执行期间发生, 则所述方法还包括返回到原始的源二进制代码。
15.如权利要求10所述的产品,其中,所述处理器包括多个核心,并且其中所述指令在 由所述处理器执行时引起下列附加操作,其中包括对于所述TSC区域的所述第一阶段期 间的所述加载指令中的至少一个,确定正在由所述加载指令访问的存储器位置是否正在由 所述核心中的不止一个核心在执行期间访问。
16.如权利要求10所述的产品,其中,所述处理器包括多个核心,并且其中所述指令在 由所述处理器执行时引起下列附加操作,其中包括对于所述TSC区域的所述第二阶段期 间的所述存储指令中的至少一个,确定正在由所述存储指令访问的存储器位置是否正在由所述核心中的不止一个核心在执行期间访问。
17.如权利要求10所述的产品,其中,所述指令在由所述处理器执行时引起下列附加 操作,其中包括为所述加载和存储指令建立执行阈值;以及在运行时间期间监测所述加载和存储指令,并且对其执行次数进行计数,并且其中,所 述频繁执行的加载和存储指令是超过所述执行阈值的指令。
18.一种系统,包括处理单元,所述处理单元包括多个寄存器和至少一个存储缓冲器;以及 存储器,所述存储器配置成容纳将在所述处理器上执行的两阶段提交(TSC)优化器代 码和源二进制代码,其中,当在所述处理器上执行所述TSC优化器代码时,所述TSC优化器 代码使所述处理器执行下列步骤在所述源二进制代码的运行时间期间,识别所述源二进制代码中的多个频繁执行的存 储器指令,所述频繁执行的存储器指令包括多个存储指令和多个加载指令;定义包括所述频繁执行的存储器指令的两阶段提交区域,并且对所述区域中的所述多 个存储器指令执行二进制优化操作;定义用于频繁执行的代码块的TSC区域的第一阶段,其中,所述多个加载指令在所述 第一阶段中以原子方式提交,并且所述多个存储指令在所述第一阶段中退出;定义用于所述频繁执行的代码块的所述TSC区域的第二阶段,其中,所述多个存储指 令在所述第二阶段中以原子方式提交;以及允许来自所述TSC区域外部的至少一个附加的存储器指令在所述第二阶段中退出。
19.如权利要求18所述的系统,其中,所述二进制优化操作包括在所述多个频繁执行 的指令中的加载和存储指令的重排序。
20.如权利要求18所述的系统,其中,所述TSC优化器代码还使所述处理器执行下列步骤为所述加载和存储指令建立执行阈值;在运行时间期间,监测所述加载和存储指令,并且对其执行次数进行计数,并且其中, 所述频繁执行的加载和存储指令是超过所述执行阈值的指令。
全文摘要
一般来说,本公开提供生成具有两个独立提交阶段的两阶段提交(TSC)区域的系统和方法。可为TSC区域识别和组合频繁执行的代码。通过例如对加载和存储指令重排序,二进制优化操作可对TSC区域执行,以便使代码能够更有效地运行。在第一阶段,区域中的加载操作可以原子方式提交,以及在第二阶段,区域中的存储操作可以原子方式提交。
文档编号G06F9/30GK102103485SQ20101061558
公开日2011年6月22日 申请日期2010年12月16日 优先权日2009年12月16日
发明者C·王, Y·吴 申请人:英特尔公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1