用于运行时并行化的对于代码段的顺序监测和管理的制作方法

文档序号:13387355阅读:165来源:国知局
用于运行时并行化的对于代码段的顺序监测和管理的制作方法

发明领域

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

发明背景

已经提出了用于在运行时使软件代码动态并行化的各种技术。例如,marcuellu等人在1998年的proceedingsofthe12thinternationalconferenceonsupercomputing中发表的“speculativemultithreadedprocessors”中描述了一种处理器微架构,其依靠不需要编译器或用户支持的控制推测(controlspeculation)技术,同时执行从单个程序获得的多个控制线程,其内容通过引用并入本文。

codrescu和wills在2000年10月的journalofuniversalcomputerscience第10期第6卷第908-927页上的“ondynamicspeculativethreadpartitioningandthemem-slicingalgorithm”中描述了一种动态推测多线程处理器,其在没有软件支持的情况下自动提取来自顺序二进制应用的线程级并行性,其内容通过引用并入本文。

发明概述

在本文中描述的本发明的实施例提供了一种包括指令流水线和控制电路的处理器。指令流水线被配置为处理程序代码的指令。控制电路被配置成在运行时监测被处理的指令(instructions),以构建包括多个条目的调用数据结构,其中,每个条目(i)指定作为分支指令(branchinstruction)的目标的初始指令,(ii)指定遵循从初始指令开始的一个或更多个可能的流控制轨迹(flow-controltraces)的程序代码中的一部分,以及(iii)针对在条目中指定的每个可能的流控制轨迹,指定在对可能的流控制轨迹进行处理之后将要处理的下一个条目,并且将指令流水线配置为通过连续地遍历调用数据结构的条目来处理程序代码的段(segments)。

在一些实施例中,控制电路被配置成对于流过流水线的全部的指令连续地监测指令,使得调用数据结构向着覆盖整个程序代码逐渐生长。在实施例中,控制电路被配置成响应于(i)对于当前监测过程的每次终止,(ii)对于尚未指定下一个条目的条目的每次遍历,以及(iii)对于在调用数据结构中不存在其指定的下一个条目的每次遍历,触发对于后续指令的监测。

在另一个实施例中,响应于终止对于流控制轨迹的监测,控制电路被配置为或者(i)触发对于调用数据库中的与在被终止的流控制轨迹之后的指令相对应的给定条目的遍历,或者(ii)触发对于在被终止的流控制轨迹之后的指令的监测。

在又一个实施例中,控制电路被配置成将可能的流控制轨迹中的每一个限定为在相应的分支指令中结束。在所公开的实施例中,控制电路被配置为通过以下方式构建调用数据结构:当处理器处理在给定的条目中指定的给定流控制轨迹上的指令时,识别对给定流控制轨迹未指定下一个条目;以及监测处理器在给定流控制轨迹之后处理的程序代码的新部分,并将新部分添加到调用数据库。

在一些实施例中,控制电路被配置成响应于满足预定义的终止准则而决定终止对新的流控制轨迹的监测,然后将新的流控制轨迹添加到调用数据库。控制电路可以被配置为响应于以下中的一个或更多个来满足终止准则:达到间接分支指令;达到对函数的调用;达到对函数的间接调用;达到功能的回报;达到反向分支指令;达到预定数量的反向分支指令;遇到分支误预测;达到已经属于调用数据库中现有条目的指令;检测到新部分超过预定数量的循环迭代;以及检测到新部分超过预定义的大小。

在实施例中,终止准则是部分随机的。在另一个实施例中,控制电路被配置成检测到新的流控制轨迹包含在调用数据库中已经指定的现有流控制轨迹或者被包含在调用数据库中已经指定的现有流控制轨迹内,并且仅保留现有流控制轨迹和新的流控制轨迹之一。在实施例中,在调用数据结构中的每个可能的流控制轨迹包括以下之一:第一类型,该第一类型通过返回到初始指令或返回到在分支到初始指令的函数调用之后的指令来结束;以及第二类型,该第二类型通过分支到程序代码中的所述一部分之外来结束。

在一些实施例中,控制电路被配置成将指令流水线配置为通过至少部分地并行地调用段中的两个或更多个段以处理段。在一些实施例中,控制电路被配置成在给定的流控制轨迹中包括循环的多次迭代。

根据本发明的实施例,另外提供了一种方法,该方法包括:在包括处理程序代码的指令的流水线的处理器中,在运行时监测所处理的指令,并且构建包括多个条目的调用数据结构。每个条目(i)指定作为分支指令的目标的初始指令,(ii)指定遵循从初始指令开始的一个或更多个可能的流控制轨迹的程序代码中的一部分程序代码,以及(iii)针对在条目中指定的每个可能的流程控制轨迹,指定在对可能的流控制轨迹进行处理之后将要处理的下一个条目。流水线被配置成通过连续地遍历调用数据结构的条目来处理程序代码中的段。

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

附图简述

图1是根据本发明的实施例示意性示出处理器的框图;

图2是根据本发明的实施例示意性示出调用数据库的图示;

图3是根据本发明的实施例示意性示出用于构建调用数据库并且管理代码段的方法的流程图;以及

图4是根据本发明的实施例示意性示出调用数据库中的示例条目的图示。

实施例的详细描述

综述

本文描述的本发明的实施例提供了用于在处理器中处理程序代码的改善的方法和装置。在一些实施例中,处理器包括执行程序代码指令的流水线以及除其它任务之外指示流水线要处理哪些指令的控制电路。

程序代码包括条件分支指令。因此,根据在运行时采取的实际分支决定(decisions),在代码的某个区域中的实际处理可能会遍历各种可能的流控制轨迹。由流水线处理的实际的一系列指令在本文中被称为段。换句话说,段可以被视为特定流控制轨迹的实例化,并且对应于特定的一系列分支决定。

在一些实施例中,控制电路监测在运行时流经流水线的指令,并且构建被称为调用数据库的数据结构。调用数据库由控制电路连续更新,并且同时被用于选择和调用将要由流水线处理的下一个段。

调用数据库包括多个条目。给定条目通常指定下列内容:

■初始指令,也被称为调用指令标识符(iid)。初始指令通常被限制为分支指令(被采取或未被采取)的目标。

■通过代码的一部分的一个或更多个可能的流控制轨迹。给定条目中的所有可能的流控制轨迹都从该条目的初始指令开始。每个轨迹以分支指令(被采取或未被采取)结束。在这种情况下,从函数的返回也被视为分支指令。

■对于每个指定的流控制轨迹,将会在处理该流控制轨迹后处理调用数据库的下一个条目。然而,在任何时间点,一些流控制轨迹可能使下一个条目设置为“未指定的(unspecified)”。

控制电路通常通过遍历调用数据库来指示流水线关于要处理哪些代码段。当遍历具有多个可能的流控制轨迹的条目时,控制电路使用轨迹预测来选择将要遵循的流控制轨迹。当达到当前遵循的流控制轨迹的终点时,或者当流水线中的提取单元之一变得空闲时,控制电路跳转到为该轨迹指定的下一个条目。使用这类调用数据库的方面在2016年3月24日提交的美国专利申请15/079,181中也得到了处理,该专利申请被转让给本专利申请的受让人,并且其公开内容通过引用被并入本文。

在典型的实施例中,调用数据库最初为空的。随着时间的变化,控制电路酌情继续添加新条目和/或将流控制轨迹添加到现有条目。通常在处理器的常规操作期间更新调用数据库。当处理器完成提取具有未指定下一个条目的流控制轨迹的段时,或者当遇到代码中的触发器(例如,反向分支)时,控制电路开始监测正在处理的后续代码,并且在某些阶段决定终止所监测的流控制轨迹并将其添加到数据库。在一些实施例中,终止由分支指令(或者被采取,或未被采取)执行。

本文描述了用于决定何时终止被监测的流控制轨迹并将其添加到数据库的示例终止准则。在一些实施例中,一旦识别出当前受监测的流控制轨迹包含现有的流控制轨迹、或当前受监测的流控制轨迹被包含在现有的流控制轨迹内,控制电路仅保留这些轨迹中的一个轨迹并丢弃另一轨迹。还描述了用于决定要保留哪个轨迹的合并准则。

在一些实施例中,处理器的流水线能够至少部分地并行处理多个段。在这些实施例中,控制电路可以至少部分地并行监测多条轨迹,和/或指示流水线至少部分地并行处理多个段。

当应用所公开的更新过程、以及终止准则和合并准则时,所得到的调用数据库变得高效。由于数据库被配置成在单个条目中存储具有较大通用性的多个流控制轨迹,因此在存储器空间方面是高效的。如在调用数据库中表示的不同轨迹之间的通用性也有助于处理器进行可靠的轨迹预测。

与专注于特定代码区域(诸如,循环和函数)的可能幼稚的解决方案不同,本文所述的监测和数据库构建过程旨在使调用数据库连续地覆盖整个代码。连续性意味着,在任何给定的时间处,控制电路都遍历在调用数据库中已经可用的流控制轨迹,或者监测指令以使数据库覆盖该指令。一旦在数据库中没有要遵循的现有流控制轨迹,即可立即触发监测,例如,响应于分支或轨迹误预测。

系统描述

图1是根据本发明的实施例示意性示出处理器20的框图。在本示例中,处理器20包括多个硬件线程24,其被配置成并行操作。每个线程24被配置成处理代码的一个或更多个相应段。例如,线程并行化的某些方面在美国专利申请14/578,516、14/578,518、14/583,119、14/637,418、14/673,884、14/673,889和14/690,424、14/794,835、14/924,833和14/960,385中得到了处理,这些美国专利申请全部转让给本专利申请的受让人,其公开内容通过引用并入本文。

虽然本示例涉及多线程处理器,但是所公开的技术也同样适用于单线程处理器。虽然本文描述的实施例主要是指无序处理器,但是所公开的技术同样可用于有序处理器。

在本实施例中,每个线程24包括提取模块28、解码模块32和重命名模块36。提取模块24从存储器中(例如,从多级指令高速缓存中)提取其相应代码段的程序指令。在本示例中,处理器20包括存储器系统41,其用于存储指令和数据。存储器系统41包括多级指令高速缓存,其包括一级(l1)指令高速缓存40和二级(l2)高速缓存42,其缓存在存储器43中存储的指令。解码模块32对提取的指令进行解码。

重命名模块36执行寄存器重命名。由解码模块32提供的解码的指令通常根据处理器的指令集架构的架构寄存器来指定。处理器20包括寄存器文件,该寄存器文件包括多个物理寄存器。重命名模块将解码的指令中的每个架构寄存器关联到寄存器文件中的相应物理寄存器(通常为目标寄存器分配新的物理寄存器,并将操作数映射到现有的物理寄存器)。

被重命名的指令(例如,由重命名模块(renamingmodules)36输出的微操作/指令)在一个或更多个重排序缓冲区(rob)44(也称为无序(ooo)缓冲区)中被有序地缓冲。在可选的实施例中,使用一个或更多个指令队列缓冲区而不是rob。所缓冲的指令对于由多个执行模块52的无序执行(即,不是按照它们被提取的顺序)是未决的。在可选的实施例中,所公开的技术也可以在有序执行指令的处理器中实施。

在rob44中缓冲的被重命名的指令被调度以用于由各个执行单元52执行。指令并行化通常通过同时向各个执行单元(可能无序地)发出一个或更多个被重命名的指令/微操作(micro-ops)来实现。在本示例中,执行单元52包括被表示为alu0和alu1的两个算术逻辑单元(alu)、乘法累加(mac)单元、被表示为lsu0和lsu1的两个加载-存储单元(lsu)、分支执行单元(bru)和浮点单元(fpu)。在可选的实施例中,执行单元52可以包括任何其他合适类型的执行单元和/或每种类型的任何其他合适数量的执行单元。线程24(包括提取模块28、解码模块32和重命名模块36)、rob44和执行单元52的级联结构在本文被称为处理器20的流水线。

由执行单元52产生的结果被保存在寄存器文件中,和/或被存储在存储器系统41中。在一些实施例中,存储器系统包括介于执行单元52和存储器43之间的多级数据高速缓存。在本示例中,多级数据高速缓存包括一级(l1)数据高速缓存56和l2高速缓存42。

在一些实施例中,处理器20的加载-存储单元(lsu)在执行存储指令时将数据存储在存储器系统41中,并且在执行加载指令时从存储器系统41取出数据。数据储存操作和/或取出操作可以使用数据高速缓存(例如,l1高速缓存56和l2高速缓存42)来减少存储器访问延迟。在一些实施例中,高级别高速缓存(例如,l2高速缓存)可以被实现为例如在同一物理存储器中的单独的存储器区域,或者在没有固定预分配的情况下仅仅共享相同的存储器。

分支/轨迹预测模块60预测分支(branches)或流控制轨迹(单次预测中的多个分支)(在本文中为简化而被称为的“轨迹”),预期在由各种线程24执行期间由程序代码遍历。基于预测,分支/轨迹预测模块60指示提取模块28将从存储器提取出哪个新的指令。在此情况下,分支/轨迹预测可以预测对于段或对于段的部分的整个轨迹,或预测各个分支指令的结果。

在一些实施例中,处理器20包括段管理模块64。模块64监测由处理器20的流水线处理的指令,并且模块64构建调用数据结构(也称为调用数据库68)。调用数据库68将程序代码分成多个部分,并指定对于这些部分的流控制轨迹以及它们之间的关系。模块64使用调用数据库68来选择将要处理的指令段,并指示流水线处理它们。数据库68通常被存储在处理器的合适的内部存储器中。下面详细描述数据库68的结构、及其由模块64构建并且使用的方式。

图1中显示的处理器20的配置为示例配置,其仅仅被选择用于概念清晰的目的。在可选实施例中,可使用任何其他合适的处理器配置。例如,并行化可以以任何其他合适的方式来执行或者可以被完全省略。处理器可以在没有高速缓存的情况下或者采用不同的高速缓存结构来实施。处理器可以包括图中未显示的附加元件。进一步可选地,所公开的技术可以采用具有任何其它合适的微架构的处理器执行。作为另一个示例,处理器执行寄存器重命名不是强制的。

在各种实施例中,本文描述的技术可以由模块64使用数据库68来执行,或者其可以分布在模块64、模块60和/或处理器的其他元件之间。在本专利申请的上下文中和在权利要求中,构建调用数据库并使用数据库来控制流水线的任何的和全部的处理器元件统称为“控制电路”。

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

处理器20可以以软件的方式编程,以执行本文描述的功能。例如,软件可通过网络以电子形式被下载到处理器,或者软件可以可替换地或附加地被提供和/或储存在非暂态有形介质(诸如,磁存储器、光存储器或电子存储器)上。

调用数据库的运行时构建和代码段的管理

图2是根据本发明的实施例示意性示出调用数据库68的示例的图示。在下面的描述中,为了简洁起见,调用数据库68简称为“数据库”,并且流控制轨迹简称为“轨迹”。

数据库68包括多个条目。图2的示例显示了被表示为74a-74c的三个条目。给定的条目指定初始指令以及通过从该初始指令开始的代码的一部分的一个或更多个可能的流控制轨迹。初始指令由相应的调用指令标识符(iid)标识,该初始指令可以包括例如程序计数器(pc)值,该程序计数器(pc)值定义了程序代码中的指令的位置。可选地,只要将具有相同初始指令的全部流控制轨迹分组在相同的索引下,则可以由任何其它合适的索引来表示iid。

当创建和更新数据库68时,iid被选择为分支指令的目标,并且每个轨迹被设置为以分支指令(被采取或未被采取)结束。在给定的条目(例如,条目74a-74c)内,每个轨迹由相应的轨迹标识符(轨迹id)标识。每个条目还指定由通过该代码的每个轨迹遍历的流控制路径。在实施例中,每个轨迹由对应的一系列分支决定(“被采取的分支”或“未被采取分支”)指定。一系列分支决定可以例如以紧凑的方式由二进制串表示,其中“1”表示“采取的”分支决定,“0”表示“未被采取的”分支决定。

例如,考虑图2中显示的第一条目74a。该条目指定属于iid=78的两条轨迹。所讨论的代码区包括五个条件分支指令。对于第一轨迹进行的流控制为“不采取”、“采取”、“采取”、“不采取”、“采取”,即“01101”。对于第二轨迹进行的流控制为“不采取”、“采取”、“采取”、“采取”、“不采取”,即“01110”。可选地,可以使用任何其它合适的表示来指定轨迹。

另外,对于每个流控制轨迹,条目指定将要处理的下一个条目(或相当于下一个iid)。下一个iid指示(indications)设置其中流水线处理代码的顺序。在运行时,当流水线完成(或即将完成)处理某个轨迹时,控制电路指示流水线随后处理指定的下一个iid。

在一些实施例中,数据库68中的各种轨迹被分为两种类型,在本文中被称为“正常”轨迹和“退出”轨迹。正常轨迹是通过返回到初始指令或返回到调用初始指令的函数来结束的轨迹。退出轨迹是通过分支出所讨论的代码区域而结束的轨迹。

当开始处理包括多个轨迹的给定的条目(给定的iid)时,控制电路通常基于由分支/轨迹预测模块60提供的轨迹预测结果而在多个轨迹之间进行选择。对于(根据以上的定义的)正常轨迹,下一个调用来自相同的条目,即,来自相同的iid。对于(根据以上的定义的)退出轨迹,下一个调用来自不同的条目,即,来自不同的iid(指定的下一个iid)。

在图2的示例中,每个可能的轨迹都有指定的下一个iid。然而,由于数据库68在运行时被构建和更新,因此一些轨迹在某个时间点可能不具有指定的下一个iid。在本上下文中,“未指定”指示也被视为下一个iid指示。

在一些实施例中,数据库68中的流控制轨迹可以以间接分支指令结束。在这种情况下,相同的间接分支可以具有多个不同的目标地址,这意味着根据间接分支的结果,可以有多个不同的下一个iid。控制电路可以以各种方式代表数据库68中的这种情况。在一个示例中,数据库包括用于指定每个轨迹的多个下一个iid的适当字段、以及导致各个下一个iid的条件。可选地,数据库可以指示下一个iid将由不同的预测器指定,然后控制电路可以使用该预测器在运行时确定下一个iid。进一步可选地,可以将任何其它合适的技术用于说明在轨迹结束时由间接分支导致的多个下一个iid。

在一些实施例中,数据库68还为每个轨迹指定“记分牌”。给定的轨迹的记分牌是这样的数据结构:其指定处理器20的寄存器由该轨迹的指令访问的方式。记分牌可以例如向特定寄存器指示最近的写入指令在代码中的位置(或者相当于对于寄存器的写入的数量)。记分牌还可以将寄存器的分类指定为全局、本地或全局-本地。例如,记分牌用于使对代码段的处理有效地并行化。关于记分牌的结构和用途的进一步细节在以上引用的美国专利申请14/578,516、14/578,518、14/583,119、14/637,418、14/673,884、14/673,889和14/690,424、14/794,835、14/924,833和14/960,385中得到处理。

另外地或可选地,数据库68可以包括任何其他合适类型的条目或字段,并且可以指定任何其他合适的参数。

图3是根据本发明的实施例示意性示出用构建数据库68并且使用数据库68管理代码段的方法的流程图。为了清楚起见,图3以稳态流为重点,并排除了其中没有可用的轨迹的场景,诸如,数据库68的初始创建以及误预测。下面进一步处理这些场景。

在段处理步骤80处,该方法以段管理模块64指示处理器20的流水线处理程序代码的某个段来开始。该段遵循在数据库68的当前遍历的条目中指定的可能的轨迹之一。

在完成检查步骤84处,模块64检查流水线是否已完成(或即将完成)对于当前段的提取。如果是,则在下一个条目检查步骤88处,模块64检查数据库68中当前遍历的条目是否为当前轨迹指定了下一个iid。

如果指定了下一个iid,则在下一个轨迹选择步骤92处,模块64访问指定的下一个条目,并且选择在该条目中指定的可能的轨迹之一。然后,该方法循环回到上面的步骤80,其中,模块64指示流水线处理遵循所选择的下一个轨迹的代码段。

在一些情况下,模块64可以在步骤88处发现数据库68中当前遍历的条目并未为当前的轨迹指定下一个iid;或者模块64可以在步骤88处发现指定了下一个iid,但是针对该下一个iid,数据库中不存在条目。在这种情况下,随后的代码之前未被监测,并且数据库68未覆盖该随后的代码。

在这种情况下,模块64开始这一监测过程:该过程创建了新轨迹和可能的新iid。在监测步骤96处,模块64监测正在由流水线处理的随后的指令。作为监测过程的一部分,模块64记录由受监测的指令遍历的轨迹(例如,记录分支决定),并且构建与轨迹相关联的记分牌。这个新的轨迹和关联的记分牌稍后将被添加到数据库68。

在终止检查步骤100处,模块64决定是继续还是终止监测过程。各种合适的终止准则都能用于该目的。例如,模块64可以响应于遇到特定类型的分支指令(例如,间接分支指令、对函数的调用、从函数返回、或反向分支指令,或在一定数量的分支之后)来决定终止监测过程。

作为另一个示例,模块64可以响应于检测到分支误预测而决定终止监测过程。作为又一个示例,模块64可以响应于达到已经属于数据库68中的现有条目的指令(即,在遇到先前监测的iid时)而决定终止监测过程。具体地,模块64可以在遇到现有的iid时(即,当达到数据库68中现有条目的初始指令时)终止监测过程。注意,这种终止可能创建并不在分支中结束的轨迹。

作为又一个示例,当新轨迹超过一定数量的循环迭代时,模块64可以决定终止该监测过程。循环迭代的数量可以是固定的,或者它可以例如取决于循环中的分支数量或循环中的指令数量。

作为另一个示例,当轨迹的长度变得太大时,模块64可以决定终止监测过程。例如,当轨迹超过一定数量的受监测的指令或微操作时、当轨迹超过一定数量的分支指令时、当轨迹超过一定数量的被写入的寄存器时、当轨迹超过对同一个寄存器的一定数量的写入时,模块64可终止监测过程。在这样的情况下,模块64可以在下一次遇到的分支指令中或在先前遇到的分支指令中终止监测。

在一些实施例中,模块64可以将一定程度的随机性引入到终止准则中。例如,当轨迹超过一定数量的分支指令,并且在0和1之间分布的随机数小于预定义值p(0<p<1)时,模块64可以决定终止监测过程。作为另一个示例,在遇到后向分支、并且在0和1之间分配的随机数小于预定义值p(0<p<1)时,模块64可以决定终止监测过程。按照这种方式,可以将一些随机性添加到以上描述的终止准则中的任意终止准则。

进一步可选地,控制电路可以评估任何其它合适的终止准则。

如果不满足终止准则,则该方法循环回到上面的步骤96,其中,模块64继续监测该指令、记录轨迹并构建记分牌。

当满足终止准则时,模块64在包含检查步骤104处检查新记录的轨迹是否包含数据库68中已经存在的轨迹、或被包含在数据库68中已经存在的轨迹中。如果没有,并且如果数据库中已不存在相同的轨迹,则模块64在轨迹添加步骤108处将新轨迹添加到数据库68。然后,该方法循环回到上面的步骤80。

如果新记录的轨迹包含现有轨迹、或被包含在现有轨迹内,则在丢弃步骤112处,模块64选择仅保留轨迹之一(新轨迹或现有轨迹)并丢弃另一轨迹。然后,该方法移动到步骤108,其中,被选择为要保留的轨迹被添加到数据库68。

模块64可以使用各种合适的准则(在本文中被称为合并标准)以用于决定要保留两条轨迹中的哪一条轨迹(被包含的轨迹或包含的轨迹)。在一个示例实施例中,如果一条轨迹是正常轨迹,而另一条轨迹是退出轨迹(根据以上的定义),则模块64保留正常轨迹并丢弃退出轨迹。换句话说,如果现有的轨迹是正常轨迹,而新的轨迹是被包含在正常轨迹内的退出轨迹,则新的轨迹将被丢弃。如果新轨迹是正常轨迹,而现有轨迹是被包含在正常轨迹内的退出轨迹,则丢弃现有轨迹,并添加新轨迹以在数据库中替代现有轨迹。

在一些实施例中,模块64限制每数据库条目(即,每iid)的流控制轨迹的最大数量。这种限制可能是由于例如硬件限制。在这样的实施例中,当针对给定的iid创建新的轨迹时,模块64可以决定用新的轨迹替代现有轨迹,以便不超过最大允许数量的轨迹。

应当注意,由于处理器20的流水线包括多个硬件线程24,因此流水线可以至少部分地彼此并行地处理多个段。

实际上,存在其中数据库68中没有控制电路要遵循的轨迹的各种场景。换句话说,可能发生的是在给定时间处流过流水线的指令与数据库68中已经存在的轨迹中任一个不匹配。这一情况可能发生在例如分支或轨迹误预测之后、在反向分支之后、在从函数返回之后、从由间接分支、具有链路的分支(bl)或间接bl导致的跳转之后。另外地或可选地,所讨论的轨迹可能已存在于数据库中,但是被删除,例如,由于有限的存储空间或其他实施方式的约束。

在一些实施例中,当发生以上的条件之一(或其他合适的条件)时,控制电路立即开始监测该指令,以便将适当的轨迹添加到数据库68。注意,这些条件也被指定为对于轨迹的可能的终止条件。因此,当轨迹终止(并且可能被添加到数据库)时,控制电路立即开始监测后续指令。

当执行以上描述的过程时,在任何给定的时间处,控制电路或者遍历在调用数据库中已经可用的流控制轨迹,或者监测指令,以使数据库覆盖指令。随着时间的变化,数据库68逐渐向着连续覆盖整个程序代码(而不仅是重复区域或其他特定区域)增长。

为了清楚起见,图3呈现了当没有要遵循的轨迹时控制电路开始监测指令的流程。在其他实施例中,即使在数据库68中表示当前遵循的轨迹时,控制电路也连续地监测指令。在这一情况下,如果发生误预测,则监测已经进行,并且可以维持连续性。例如,可以恢复到新的轨迹。在美国专利9,135,015中处理了在误预测期间的监测的某些方面,该专利的公开内容通过引用并入本文。

图4是根据本发明的实施例示意性示出在调用数据库68的给定条目中指定的三个轨迹128、132和136的图示。图中的向下方向对应于程序代码中的指令顺序。

在本示例中,全部三个轨迹都以相同的初始指令(iid)开始。所讨论的代码区域包括被表示为140和144的两个条件分支指令,其中指令144是间接分支。

轨迹128在分支指令140处对应于“未被采取”分支决定,并且在分支指令144处对应于另一“未被采取”分支决定。轨迹132在分支指令140处对应于“未被采取”分支决定,并且随后在分支指令144处对应于“被采取”分支决定。轨迹136也在分支指令140处对应于“未被采取”分支决定,并且在分支指令144处对应于“被采取”分支决定。轨迹132和136在间接分支指令144的目标地址方面不同。

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

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