通过监控重复指令序列的运行时代码并行化的制作方法

文档序号:11635148阅读:165来源:国知局
通过监控重复指令序列的运行时代码并行化的制造方法与工艺

发明领域

本发明总体上涉及处理器设计,并且具体地涉及用于运行时代码并行化的方法和系统。

发明背景

已经提出了用于在运行时动态地并行化软件代码的各种技术。例如,akkary和driscoll在1998年12月的第31届微体系结构年度国际研讨会的论文集“adynamicmultithreadingprocessor”中描述了实现单个程序的动态多线程执行的处理器架构,该文章通过引用并入本文。

marcuellu等人在1998年的第12届国际超级计算会议的论文集“speculativemultithreadedprocessors”中描述了一种处理器微架构,该微架构通过不需要编译器或用户支持的控制推测技术来同时执行从单个程序获得的多个控制线程,该文章通过引用并入本文。

marcuello和gonzales在1999年的13届国际超级计算会议的论文集“clusteredspeculativemultithreadedprocessors”中提出了在运行时从单线程应用中产生推测性线程的微架构,该文章通过引用并入本文。

在2000年的第14届并行与分布式处理国际研讨会的论文集“aquantitativeassessmentofthread-levelspeculationtechniques”(其通过引用并入本文)中,marcuello和gonzales分析了不同线程推测技术的益处以及线程单元中的值预测、分支预测、线程初始化开销和连接的影响。

ortiz-arroyo和lee在2003年的第16届并行与分布式计算系统的国际会议(pdcs'03)的论文集“dynamicsimultaneousmultithreadedarchitecture”中描述了被称为动态同时多线程(dsmt)的多线程架构,该多线程架构在同时多线程处理器核上执行来自单个程序的多个线程的,该文章通过引用并入本文。

发明概述

本文中描述的本发明的实施例提供了一种方法,该方法包括在执行程序代码的指令的处理器中,监控重复的指令序列的段中的指令,以构建所监控的指令的寄存器访问的规范。响应于检测到所监控的指令中的分支误预测,对规范进行校正以补偿分支误预测。基于校正后的规范,将重复序列的执行并行化。

在一些实施例中,监控指令还包括生成由所监控的指令遍历的流控制轨迹,并且该方法包括对流控制轨迹进行校正以补偿分支误预测。在实施例中,该方法包括在并行化执行期间继续监控指令。在实施例中,该方法包括在校正规范之后继续监控指令并构建规范。在示例实施例中,校正规范包括终止对该段的指令的监控,并且丢弃在该段中收集的寄存器访问的规范的至少一部分。

在一些实施例中,校正规范包括基于分支误预测之后的指令,将规范回滚到与在其中发生分支误预测的分支指令处或其之前的指令对应的先前状态。在实施例中,监控指令包括在规范中记录对寄存器的最后写入操作在所述序列中的位置,并且回滚规范包括校正最后写入操作的位置。在示例实施例中,记录最后写入操作的位置包括递增对寄存器的写入操作的计数,以及校正位置包括将该计数递减到与其中发生分支误预测的分支指令对应的值。

在所公开的实施例中,监控指令包括在规范中记录由所监控的指令访问的寄存器的分类,并且校正规范包括对寄存器中的一个或更多个进行重新分类以补偿分支误预测。

在一些实施例中,监控指令包括保存在沿着所监控的段的一个或更多个相应的分支指令处或其之前的规范的一个或更多个状态,并且校正规范包括恢复到与其中发生分支误预测的分支指令处或其之前的指令对应的保存状态。

保存状态可以包括仅针对沿着所监控的段的分支指令的部分子集,保存状态。该方法可以包括根据程序代码中的指示或来自程序代码的编译器的指示和/或基于在运行时评估的标准来选择分支指令的部分子集。

在一些实施例中,监控指令包括基于在处理器的执行流水线中从存储器提取的分支指令,基于在处理器的执行流水线中被解码的分支指令,以及/或者共同地基于在处理器的执行流水线中从存储器提取的分支指令和被解码的分支指令,生成所监控的指令的流控制轨迹。

在一些实施例中,监控指令包括基于在处理器的执行流水线中被解码的指令,基于在处理器的执行流水线中被执行的指令,和/或基于被提交的但由于分支误预测而未被清除的指令,在规范中记录对寄存器的最后写入操作在所述序列中的位置。

在实施例中,监控指令包括仅在评估序列的条件分支指令的相应分支条件之后才收集寄存器访问。在另一个实施例中,监控指令包括生成所监控的指令的流控制轨迹,包括对于处理器的分支预测单元未知的分支指令。

根据本发明的实施例,另外提供了包括执行流水线和监控单元的处理器。执行流水线被配置为执行程序代码的指令。监控单元被配置为监控重复指令序列的段中的指令,以便构建所监控的指令的寄存器访问的规范,被配置为响应于检测到所监控的指令中的分支误预测,对规范进行校正,以补偿分支误预测,并且基于校正后的规范,将重复序列的执行并行化。

从结合附图进行的本发明的实施例的以下详细描述,本发明将被更完全地理解,其中:

附图简述

图1是根据本发明的实施例示意性地图示了执行运行时代码并行化的处理器的框图;

图2是根据本发明的实施例示意性地图示了程序循环的运行时并行化的图;以及

图3是根据本发明的实施例示意性地图示了用于在监控重复指令序列期间缓解分支误预测的方法的流程图。

具体实施方式

综述

本文中描述的本发明的实施例提供了用于在处理器中对代码的运行时并行化的改进的方法和设备。在所公开的实施例中,处理器识别重复的指令序列,并且创建和执行被称为段的多个并行代码序列,其执行不同出现的序列。这些段被调度,以用于通过多个硬件线程进行并行执行。

例如,重复序列可以包括循环,在这种情况下,段包括多个循环迭代、迭代的部分或循环的延续。作为另一示例,重复序列可以包括函数,在这种情况下,段包括多个函数调用、函数的部分或函数延续。在运行时,对预编译代码执行并行化。术语“重复序列”通常指的是被重新访问并执行多次的任何指令序列。

在一些实施例中,在识别重复序列时,处理器监控序列中的指令并构建“记分板”-由所监控的指令对寄存器的访问的规范。记分板与由所监控的序列遍历的特定流控制轨迹相关联。处理器基于在记分板和轨迹中收集的信息来决定如何以及何时创建和执行多个段。

指令监控的其他方面在题为“run-timecodeparallelizationwithcontinuousmonitoringofrepetitiveinstructionsequences”的代理人案卷编号1279-1004的美国专利申请以及题为“registerclassificationforrun-timecodeparallelization”的代理人案卷编号1279-1004.1的美国专利申请中进行讨论,这些专利申请被转让给本专利申请的受让人并且其公开内容通过引用并入本文。

在一些实施例中,处理器在其执行流水线中提取和处理指令。当预测条件分支指令采用分支但在实际执行期间未采用分支时,可能发生分支误预测,或反之亦然。在检测到分支误预测时,处理器通常清除随后的指令和相应的结果。

当分支误预测发生在其指令被监控的段中时,记分板中的寄存器访问信息通常将是不正确的或至少是不完整的。本文描述的一些实施例提供了用于在检测到分支误预测事件之后校正在记分板中收集的寄存器访问信息的技术。

在示例实施例中,处理器停止对所讨论的段的监控,并丢弃在其中收集的寄存器访问信息。在其他实施例中,处理器将记分板回滚到误预测之前的状态,并且在正确的分支决策之后继续监控段。

处理器可以以各种方式回滚记分板,诸如通过提前保存记分板在条件分支指令之前的状态,并且在需要时恢复到先前保存的状态。可替代地,处理器可以通过追溯误预测之后的指令并将寄存器访问计数器递减回到其在误预测之前的值来回滚记分板。可以针对所有条件分支指令执行回滚,或仅针对条件分支指令的所选子集执行回滚。还描述了用于选择子集的示例标准。

在一些实施例中,作为监控过程的一部分,处理器生成与记分板相关联的流控制轨迹。在检测到误预测时,处理器通常也使用上述任何方法来校正所生成的流控制轨迹。

在其他公开的实施例中,处理器通过适当选择生成流控制轨迹的执行流水线级以及收集寄存器访问信息的执行流水线级来降低误预测的影响。

在各种实施例中,处理器可以在提取之后、在解码之后或者两者组合之后立即从指令中生成轨迹。

可以例如在紧接解码之后、在执行(包括将被清除的误预测的指令的执行)之后或提交(仅包括将不被清除的指令)之后收集寄存器访问信息。

系统描述

图1是根据本发明的实施例示意性地图示处理器20的框图。处理器20运行预编译的软件代码,同时使代码执行并行化。处理器在运行时通过在程序指令从存储器中被提取并被解码的时候对其进行分析来执行并行化决策。

在本示例中,处理器20包括执行流水线,该执行流水线包括一个或更多个提取单元24、一个或更多个解码单元28、乱序(ooo)缓冲器32和执行单元36。提取单元24从多级指令高速缓存存储器中提取程序指令,该高速缓存存储器在本示例中包括1级(l1)指令高速缓存40和2级(l2)指令高速缓存44。

分支预测单元48预测在执行期间预期由程序遍历的流控制轨迹(在本文中为了简短起见而被称为“轨迹”)。预测通常基于由提取单元24提取的先前指令的地址或程序计数器(pc)值。基于预测,分支预测单元48指示提取单元24将提取哪些新的指令。单元48的流控制预测也影响代码执行的并行化,如以下将解释的。

由解码单元28解码的指令存储在ooo缓冲器32中,以用于通过执行单元36进行乱序执行,即,不按照指令被编译和存储在存储器中的顺序。可替代地,所缓冲的指令可以按顺序执行。随后发出所缓冲的指令,以供各种执行单元36执行。在本示例中,执行单元36包括一个或更多个乘法累加(mac)单元、一个或更多个算术逻辑单元(alu)、一个或更多个加载/存储单元和分支执行单元(bra)。另外或可替代地,执行单元36可以包括其他合适类型的执行单元,例如浮点单元(fpu)。

由执行单元36产生的结果被存储在寄存器文件和/或多级数据高速缓存存储器中,其在本示例中包括1级(l1)数据高速缓存52和2级(l2)数据高速缓存56。在一些实施例中,l2数据高速缓存存储器56和l2指令高速缓存存储器44被实现为相同物理存储器中单独的存储器区域或者在没有固定预分配的情况下简单地共享相同的存储器。

在一些实施例中,处理器20还包括负责运行时代码并行化的线程监控和执行单元60。下面详细说明单元60的功能。

图1中所示的处理器20的配置是示例配置,其纯粹为了概念清楚起见而被选择。在替代的实施例中,可使用任何其他合适的处理器配置。例如,在图1的配置中,使用多个提取单元24和多个解码单元28来实现多线程。每个硬件线程可以包括被分配以提取用于线程的指令的提取单元以及被分配以对所提取的指令进行解码的解码单元。另外或可替代地,多线程可以以许多其他方式实现,例如使用每线程的多个ooo缓冲器、单独的执行单元和/或每线程的单独的寄存器文件。在另一个实施例中,不同的线程可以包括不同的相应处理核心。

作为又一个示例,可以在没有高速缓存或有不同的高速缓存结构,在每线程没有分支预测或者有单独的分支预测的情况下实现处理器。处理器可以包括附加元件,例如,仅举几个例子,重排序缓冲器(rob)、寄存器重命名。此外,可替代地,所公开的技术可以用具有任何其它合适的微架构的处理器执行。

处理器20可以使用任何合适的硬件例如使用一个或更多个专用集成电路(asic)、现场可编程门阵列(fpga)或其他设备类型来实现。另外或可替代地,可使用软件或使用硬件和软件元件的组合来实现处理器20的某些元件。可以使用诸如随机存取存储器(ram)的任何合适类型的存储器来实现指令高速缓存存储器和数据高速缓存存储器。

处理器20可以用软件编程以执行本文中所描述的功能。该软件可通过网络以电子形式下载到处理器,例如,或者可替代地或另外,它可以被提供和/或储存在非暂时性有形介质上,诸如,磁存储器、光存储器或电子存储器。

基于段监控的运行时代码并行化

在一些实施例中,处理器20中的单元60识别重复的指令序列并且使其执行并行化。重复指令序列可以包括例如,程序循环的相应迭代、函数或过程的相应出现或被多次重新访问和执行的任何其他合适的指令序列。在本上下文中,术语“重复指令序列”是指在过去至少一次执行其流控制轨迹(例如,pc值序列)的指令序列。数据值(例如,寄存器值)可能因执行而异。

在所公开的实施例中,处理器20通过使用多个硬件线程并行或半并行地调用和执行多个代码段来并行化重复指令序列。每个线程执行相应的代码段,例如循环的相应迭代、多个(不一定是连续的)循环迭代、循环迭代的一部分、循环的延续、其函数或一部分或延续或任何其它合适类型的段。

使用多个硬件线程来执行处理器20中段的并行化。在图1的示例中,尽管不是必然的,但每个线程包括已经由单元60分配以执行一个或更多个段的相应提取单元24和相应解码单元28。在另一个示例实施例中,在两个或更多个线程之间共享给定的提取单元24。

在实践中,数据依赖性存在于段之间。例如,在某个循环迭代中执行的计算可取决于在先前迭代中执行的计算的结果。使段并行化的能力在很大程度上取决于这种数据依赖性。

图2是根据本发明的示例实施例展示程序循环的运行时并行化的图。本示例涉及指令的并行化,但是所公开的技术也可以以类似的方式用于并行化微操作(micro-ops)。该图的顶部示出了示例程序循环(从specint测试套件的bzip基准测试版重现)和指令之间的依赖性。一些依赖性在相同循环迭代中的指令之间,而其他依赖性在给定循环迭代中的指令和先前迭代中的指令之间。

该图的底部示出了根据本发明的实施例的单元60如何使用四个线程th1...th4来并行化该循环。该表跨越总共十一个周期,并列出了在每个周期内执行哪些线程的哪些指令。每个指令由其迭代数和迭代中的指令数表示。例如,“14”代表第1循环迭代的第4个指令。在该示例中,指令5和指令7被忽略,并且假设完美的分支预测。

线程执行中的参差(staggering)是由于数据依赖性。例如,由于指令21(第二次迭代中的第一指令)依赖于指令13(第一次迭代的第三指令),因此线程th2不能执行指令21和22(第二次循环迭代中的前两个指令)直到周期1。整个表中存在类似的依赖性。总的来说,这种并行化方案能够在六个周期内执行两次循环迭代,或者每三个周期执行一次迭代。

重要的是要注意,图2中所示的并行化仅考虑指令之间的数据依赖性,而不考虑其他约束,诸如执行单元的可用性。因此,图2中的周期不一定直接转换为相应的时钟周期。例如,图2中列出为在给定周期内执行的指令实际上可能在多于一个时钟周期内执行,因为它们竞争相同的执行单元36。

在一些实施例中,单元60通过监控处理器流水线中的指令来决定如何使代码并行化。响应于识别重复指令序列,单元60在序列被处理器提取、解码和执行时开始监控该序列。

在一些实施方式中,单元60的功能可以分布在多个硬件线程之间,使得给定的线程可以被视为在执行期间监控其指令。然而,为了清楚起见,下面的描述假设监控功能由单元60执行。

作为监控过程的一部分,单元60生成由所监控的指令遍历的流控制轨迹以及在本文中被称为记分板的监控表。段的记分板通常包括寄存器的一些分类。此外,对于至少一些寄存器,记分板指示对寄存器的最后写入操作的所监控的序列中的位置。

可以使用任何合适的指示来指示最后写入操作的位置,诸如对寄存器的写入次数的计数或最后写入操作的地址。最后写入指示使单元60能够确定例如何时允许它执行依赖于寄存器的值的随后段中的指令。记分板生成的其他方面可以在以上引用的美国专利申请代理人案卷编号1279-1004和1279-1004.1中找到。

在段监控期间处理分支误预测

在一些实施例中,处理器20基于将在未来的分支指令处采用的分支决策的预测来推测性地提取和处理指令。分支预测由分支预测单元48执行,并且影响被提取以用于由提取单元24执行的指令。

根据实际代码和单元48的性能,分支预测可能是错误的。在其中预测条件分支采用分支但事实上该分支未被采用或者反之亦然的事件在本文中被称为分支误预测,或为了简洁而简称为误预测。在图1的实施例中,分支执行单元(bra)将分支预测与实际的分支决策进行比较,并且在不匹配的情况下输出误预测指示。

如上所述,在一些实施例中,监控单元60在执行期间监控流控制轨迹和寄存器访问。在其他实施例中,单元60可以在并行执行期间同时监控各种段内的流控制轨迹和寄存器访问。当误预测发生在被监控的段中时,所得到的轨迹和记分板通常将是不正确的。例如,记分板可以包括在误预测的分支后并稍后将被清除的指令收集的寄存器访问信息。

在一些实施例中,单元60在发生误预测的情况下采取各种措施以用于校正记分板。下面描述的校正方法主要涉及对寄存器访问信息的校正。在一些实施例中,单元60也使用这些方法来校正所生成的流控制轨迹。

在一些实施例中,响应于检测到的误预测事件,单元60停止对该段的监控,并丢弃到目前为止在该段中收集的寄存器访问信息。通常将在另一个段中重新尝试监控。

在其他实施例中,单元60并不丢弃寄存器访问信息,而是将寄存器访问信息回滚到其在误预测之前的状态。回滚后,单元60可以沿着正确的轨迹继续监控过程。

单元60可以以各种方式回滚记分板信息。在一些实施例中,单元60追溯回在误预测后的指令,并且对寄存器访问信息进行校正以消除这些指令的影响。例如,如果寄存器访问信息包括对寄存器的写入操作的计数,则单元60可以减少计数以消除在误预测后的写入操作的影响。如果寄存器访问信息包括对寄存器的最后写入操作的位置的一些其它指示,则单元60也可以校正这些指示。

在替代实施例中,单元60通过保存记分板在条件分支指令之前具有的状态来预先准备记分板到该指令的可能的回滚。如果误预测发生在该指令中,则单元60可以恢复到记分板的已保存状态,并从该点继续监控。记分板的已保存状态通常包括在分支指令之前的寄存器访问信息和寄存器分类。该状态可以对应于确切的条件分支指令,对应于先前指令或者对应于在条件分支指令之前的另一个合适的指令。

在一些实施例中,单元60在每个条件分支指令之前保存记分板状态,从而实现在任何误预测之后的回滚。在替代实施例中,单元60仅针对段中的条件分支指令的选定子集保存记分板状态。这种技术可以减少存储器空间,但另一方面,仅针对一些可能的误预测实现了回滚。如果误预测发生在对其未保存先前记分板状态的指令中,则单元60通常必须中止监控该段并在另一个段中重新尝试监控。

单元60可以使用任何合适的标准来选择条件分支指令的子集(对其保存了记分板的先前状态)。通常,标准旨在选择可能被误预测的条件分支指令,并且排除可能被正确预测的条件分支指令。在一个实施例中,将被选择的子集在代码中被指定或由编译该代码的编译器指定。在另一个实施例中,该子集在运行时由单元60选择。例如,单元60可以累积误预测统计数字,并选择其中分支预测精度低于某一水平的条件分支指令。

上述实施例主要涉及在误预测之后对记分板中的最后写入指示的校正。另外或可替代地,单元60可以对记分板中可能受到误预测影响的任何其他合适的寄存器访问信息进行校正。例如,记分板通常包括由所监控的指令访问的寄存器的分类,其基于其中该寄存器被用作操作数或用作所监控的指令中的目的地的顺序。该分类可以例如在其首次出现是作为目的地的局部(l)寄存器、仅用作操作数的全局(g)寄存器以及其首次出现是作为操作数且随后用作目的地的全局-局部(gl)寄存器之间进行区分。

在一些实施例中,单元60可以重新分类寄存器中的一个或更多个,以便在误预测之前反映它们的正确分类。上述任何校正方法(例如,恢复到先前保存的状态或追溯指令序列)可用于此目的。

上述实施例纯粹是通过示例的方式描绘。在替代实施例中,单元60可以响应于分支误预测以任何其他合适的方式校正记分板。

例如,在一些实施例中,单元60仅执行规范的近似校正,该近似校正仅近似地补偿误预测的影响。在这些实施例中,单元60可将规范回滚到近似于在误预测之前的状态的状态,而不是回滚到精确的先前状态。该近似可以包括例如,对某些寄存器的最后写入指示的近似。在本上下文中,精确校正和近似校正都被认为是规范校正的类型,并且针对误预测的精确补偿和近似补偿都被认为是补偿的类型。

图3是根据本发明的实施例示意性地图示了用于在监控重复指令序列期间缓解分支误预测的方法的流程图。在监控步骤70,该方法始于处理器20的单元60监控重复指令序列的指令。作为监控过程的一部分,在一些实施例中,单元60生成由指令遍历的预测的流控制轨迹和相应的记分板。

在调用步骤74,单元60调用多个硬件线程来执行重复指令序列的相应段。对于至少一些段,单元60在线程中的执行期间继续监控指令。

在误预测检测步骤78,处理器20检查分支误预测是否发生在被执行的给定段中。如果没有遇到误预测,则该方法循环回到上面的步骤74。

在分支误预测的情况下,在校正步骤82,单元60校正记分板以补偿在误预测后的指令的影响。为此,单元60可以使用上述任何技术或任何其它合适的技术。在一些实施例中,校正涉及对寄存器访问信息的校正以及对所生成的流控制轨迹的校正。

缓解分支误预测中的流水线考虑

在一些实施例中,单元60通过适当选择执行流水线中生成轨迹的级以及执行流水线中收集寄存器访问信息的级来降低分支误预测的影响。通常,轨迹生成和寄存器访问信息的收集不需要在相同的流水线级处执行。

在一些实施例中,单元60从被提取的分支指令,即,基于提取单元24的输出端处的分支指令,生成轨迹。在替代实施例中,单元60从被解码的分支指令,即,基于解码单元28的输出端处的分支指令,生成轨迹。

在又一个实施例中,单元60基于解码单元28的输出端处的分支指令和提取单元24的输出端处的分支指令的组合来生成轨迹。

在一些实施例中,单元60在解码单元28的输出端处(即,从被解码的指令)收集寄存器访问信息(例如,寄存器的分类和对寄存器的最后写入操作的位置)。

在其他实施例中,单元60基于在执行单元36中执行的指令,但在最后提交指令和结果之前,收集寄存器访问信息。在该实施例中,寄存器访问信息包括在误预测后的并稍后被清除的指令的影响(与在解码单元之后收集寄存器访问信息的情况一样)。在替代实施例中,单元60仅基于提交的指令来收集寄存器访问信息,即不考虑由于误预测而被清除的指令。

在又一个实施例中,单元60在由分支执行单元评估条件分支指令的条件之后(即,在其中分支指令不再是有条件的级处)收集寄存器访问信息以及/或者生成轨迹。

此外,另外或可替代地,单元60可以基于任何其它合适的流水线级来生成流控制轨迹和/或收集寄存器访问信息。

一般来说,在流水线中较早地监控指令有助于更快速且更有效地调用并行执行,但另一方面,更多地受到误预测的影响。在流水线中较晚地监控指令导致较慢的并行化,但另一方面对误预测较不敏感。

在一些实施例中,单元60能够生成轨迹,即使监控分支预测单元48尚未已知的条件分支指令。例如,当首次遇到重复指令序列并且尚未被识别为重复时,可能会出现这种情况。然而,轨迹仍由解码单元(或由寄存器重命名单元)记录,并且单元60仍然可以能够生成轨迹。通常,将使用该指令不采用的分支来生成轨迹。

将认识到的是,以上描述的实施例是通过示例的方式引用的,并且本发明不限于上文中已经特别示出和描述的内容。相反,本发明的范围包括本文中所描述的各种特征的组合和子组合以及本发明的变型和修改,所述变型和修改将在本领域的技术人员阅读前面描述之后想到并且在现有技术中未被公开。通过引用并入本专利申请的文件被视为本申请的组成部分,除了任何术语在这些并入的文件中在某种程度上以与本说明书中明确地或隐含地作出的定义冲突的方式被定义之外,应该仅考虑本说明书中的定义。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1