具体实施方式
本发明的实施例提供了一种用于存储分支预测信息的方法和设备。在一个实施例中,所述方法包括接收分支指令并且存储所述分支指令的本地分支预测信息,所述本地分支预测信息包括所述本地分支预测信息的本地可预测性值。所述方法还包括只有当本地可预测性值低于可预测性阈值时,才存储所述分支指令的全局分支预测信息。
在下文中,将参考本发明的实施例。然而,应该理解的是,本发明不局限于具体描述的实施例。相反,无论是否涉及不同的实施例,都可以设想到随后的特征和元素的任何组合可以实现并且实施本发明。此外,在各种实施例中,本发明提供了很多优于现有技术的优势。然而,虽然本发明的实施例可以取得优于其它可能的方案和/或现有技术的优势,但是无论特殊的优势是否通过给定的实施例来实现,这都不会限制本发明。由此,随后的方面、特征、实施例和优势仅仅是例示性的,并且除非在一个或多个权利要求中明确叙述,否则不应被认为是所附权利要求的元素或者限制。同样,对“本发明”的提及不应该被认为是此处公开的任何发明主题的归纳,并且不应该被认为是所附权利要求的元素或者限制,除非在一个或多个权利要求中明确叙述。
接下来将依照附图描述本发明的具体实施方式。所述实施例是示例性的,并且如此详细说明是为了清楚地传达本发明。然而,所提供 的细节不意味着限制实施例的预期变型;相反地,目的在于覆盖落入本发明的精神和范围内的所有修改、等同物和替换物,本发明的范围如所附权利要求书定义的那样。
本发明的实施例可供例如计算机系统之类的系统加以利用,并且下面将就此进行描述。正如此处使用的那样,系统可以包括利用了处理器和高速缓冲存储器的任何系统,包括个人计算机、互联网设备、数字媒体设备、便携式数字辅助设备(PDA)、便携式音乐/视频播放器和视频游戏控制台。虽然高速缓冲存储器可以位于与使用高速缓冲存储器的处理器相同的管芯上,但是在某些情况下,处理器和高速缓冲存储器可能位于不同的管芯上(例如,独立模块内的独立芯片或者单个模块内的独立芯片)。
虽然下文就具有多个处理器核和多个L1高速缓存的处理器进行描述,其中每一处理器核使用多条流水线执行指令,但是本发明的实施例可供使用高速缓存的任何处理器使用,包括具有单个处理核的处理器。总体上讲,本发明的实施例可供任何处理器使用,并且不局限于任何特定的配置。例如,总体上讲,各实施例不局限于利用级联的、延迟的执行流水线的处理器。此外,虽然下文就具有L1-高速缓存的处理器进行描述,其中所述L1-高速缓存被分成L1指令高速缓存(L1I-高速缓存,或者I-高速缓存)和L1数据高速缓存(L1D-高速缓存或者D-高速缓存224),但是本发明的实施例可以在使用了统一的L1高速缓存的配置中加以利用。此外,在如下所述的一些实施例中,描述了双重指令缓冲器以用于缓冲指令。在某些情况下,也可以利用单个的、组合的缓冲器或者其它缓冲器配置来缓冲指令。
示例性系统的概述
图1是描述依照本发明一个实施例的系统100的框图。所述系统100可以包含用于存储指令和数据的系统存储器102,用于图形处理的图形处理单元104,用于与外部设备通信的I/O接口(106),用于长期存储指令和数据的存储设备108以及用于处理指令和数据的处理器 110。
依照本发明的一个实施例,所述处理器110可以具有L2高速缓存112以及多个L1高速缓存116,每一L1高速缓存116可供多个处理器核114之一使用。依照一个实施例,每一处理器核114可以被流水线化,其中每一条指令在一系列小步骤中被执行,每个步骤由不同的流水线级执行。
图2是描述依照本发明一个实施例的处理器110的框图。为简单起见,图2描绘了处理器110的单个核114并且就此进行描述。在一个实施例中,每个核114可以是相同的(例如,包含具有相同流水线级的同样的流水线)。在另一个实施例中,每个核114可以是不同的(例如,包含具有不同级的不同流水线)。
在本发明的一个实施例中,所述L2高速缓存可以包含由处理器110使用的一部分指令和数据。在某些情况下,处理器110可以请求没有包含在L2高速缓存112中的指令和数据。当所请求的指令和数据没有包含在L2高速缓存112中时,所请求的指令和数据被检索(或者从更高级的高速缓存或者从系统存储器102)并且被放置在L2高速缓存中。当处理器核114请求来自L2高速缓存112的指令时,所述指令首先由预解码器和调度器220来处理(下文将更加详细地描述)。
在本发明的一个实施例中,可以从L2高速缓存112中成组地取出指令,将其称为I-行。同样,可以从L2高速缓存112中成组地取出数据,将其称为D-行。在图1中描述的L1高速缓存116可以被分成两个部分,用于存储I-行的L1指令高速缓存222(I-高速缓存222)以及用于存储D-行的L1数据高速缓存224(D-高速缓存224)。可以使用L2存取电路210从L2高速缓存112中取出I-行和D-行。
在本发明的一个实施例中,从L2高速缓存112检索出的I-行可以由预解码器和调度器220来处理,并且I-行可以放置在I-高速缓存222中。为了进一步改进处理器性能,指令往往被预先解码,例如从L2(或更高)高速缓存中检索I-行。这种预先解码处理可以包括各种各样的功能,诸如地址生成、分支预测、和调度(确定指令应被发布 的顺序),其是作为用于控制指令执行的分派信息(一组标志)被获取的。在某些情况下,预解码器和调度器220可以在多个核114和L1高速缓存之间共享。同样,从L2高速缓存112中取出的D-行可以被放置在D-高速缓存224中。每一I-行和D-行中的位可用来跟踪L2高速缓存112中的一行信息是I-行还是D-行。作为选择,可以以其它方式从L2高速缓存112中取出数据,例如通过取出更小、更大或者可变数量的数据,而不是依照I-行和/或D-行从L2高速缓存112取数据。
在一个实施例中,I-高速缓存222和D-高速缓存224可以分别具有I-高速缓存目录223和D-高速缓存目录225,以便跟踪哪些I-行和D-行目前处于I-高速缓存222和D-高速缓存224中。当把I-行或者D-行添加到I-高速缓存222或者D-高速缓存224时,相应的条目可以被放置在I-高速缓存目录223或者D-高速缓存目录225中。当把I-行或者D-行从I-高速缓存222或者D-高速缓存224处移走时,处于I-高速缓存目录223或者D-高速缓存目录225中的相应条目也被移走。虽然下文就使用D-高速缓存目录225的D-高速缓存224进行描述,但是本发明的实施例也可以在不使用D-高速缓存目录225的情况下使用。在此情况下,存储在D-高速缓存224自身中的数据可以表明什么样的D-行存在于D-高速缓存224。
在一个实施例中,取指令电路236可用来为核114取出指令。例如,所述取指令电路236可以包含用于跟踪正在核中执行的当前指令的程序计数器。当遇到分支指令时,核内的分支单元可用来改变程序计数器。I-行缓冲器232可用来存储从L1I-高速缓存222中取出的指令。发布和分派电路234可用来把从I-行缓冲器232检索的指令分组为指令组,所述指令组然后可以被并行发布给核114,如下所述。在某些情况下,发布和分派电路可以使用由预解码器和调度器220提供的信息来形成合适的指令组。
除从发布和分派电路234接收指令以外,核114还可以从各种位置接收数据。当核114需要来自数据寄存器的数据时,可以使用寄存器堆240来获得数据。当核114需要来自存储单元的数据时,可以使 用高速缓存加载和存储电路250来从D-高速缓存224加载数据。当执行这种加载时,对所需数据的请求可以被发布给D-高速缓存224。同时,可以检查D-高速缓存目录225以便确定所需要的数据是否位于D-高速缓存224中。当D-高速缓存224包含所需要的数据时,D-高速缓存目录225可以表明所述D-高速缓存224包含所需要的数据,并且可以在事后某一时间完成D-高速缓存访问。当D-高速缓存224不包含所需要的数据时,所述D-高速缓存目录225可以表明所述D-高速缓存224不包含所需要的数据。因为与D-高速缓存224相比,D-高速缓存目录225可以被更加迅速地访问,所以在D-高速缓存目录225被访问之后、而且在完成D-高速缓存访问之前,对所需数据的请求可以被发布给L2高速缓存112(例如,使用L2存取电路210)。
在某些情况下,数据可以在核114中被修改。可以把已修改的数据写入寄存器堆,或者存储在存储器中。回写电路238可用来把数据写回到寄存器堆240。在某些情况下,回写电路238可以利用高速缓存加载和存储电路250把数据写回到D-高速缓存224。作为选择,核114可以直接访问高速缓存加载和存储电路250来进行存储。在某些情况下,如下所述,回写电路238还可以用来把指令写回到I-高速缓存222。
如上所述,发布和分派电路234可用来形成指令组并且向核114发布所形成的指令组。所述发布和分派电路234还可以包括用于循环和合并I-行中的指令并且由此形成合适的指令组的电路。发布组的形成可以考虑多个事项,诸如发布组中的指令之间的相关性,以及可以通过指令的排序来实现的优化,下面将更加详细地描述。一旦形成发布组,就可以把所述发布组并行分派到处理器核114。在某些情况下,指令组可以对于核114中的每条流水线包含一条指令。作为选择,指令组可以具有更少数目的指令。
依照本发明的一个实施例,一个或多个处理器核114可以利用级联的、延迟的执行流水线配置。在图3所描述的示例中,核114包含四个依照级联方式配置的流水线。作为选择,在这种配置中还可以使 用更少的数目(两个或更多流水线)或更多的数目(四个以上的流水线)。此外,图3中描述的流水线的物理布局是示例性的,并不一定表示级联的、延迟执行流水线单元的实际物理布局。
在一个实施例中,处于级联的、延迟执行流水线配置中的每一流水线(P0,P1,P2,P3)均可包含执行单元310。所述执行单元310可以包含多个流水线级,用于执行给定流水线的一个或多个功能。例如,执行单元310可以执行指令的取出和解码操作的全部或者一部分。由执行单元执行的解码操作可以与预解码器和调度器220同享,其在多个核114当中共享,或者作为选择由单个核114使用。所述执行单元还可以从寄存器堆中读取数据、计算地址、执行整数运算功能(例如,使用算术逻辑单元,即ALU)、执行浮点运算功能、执行指令分支、执行数据访问功能(例如,通过存储器加载并且存储)并且把数据存回寄存器中(例如,在寄存器堆240中)。在某些情况下,核114可以利用取指令电路236、寄存器堆240、高速缓存加载和存储电路250和回写电路以及任何其它电路来执行这些功能。
在一个实施例中,每一执行单元310均可执行相同的功能。作为选择,每一执行单元310(或者不同的执行单元组)可执行不同的功能集合。另外,在某些情况下,每一核114中的执行单元310可以与其它核中提供的执行单元310相同或不同。例如,在一个核中,执行单元3100和3102可执行加载/存储和算术功能,而执行单元3101和3102只可执行算术功能。
在一个实施例中,如所描述的那样,执行单元310中的执行过程可以以相对于其它执行单元310被延迟的方式来进行。所述结构也可以被称为级联的、延迟配置,但是所述布局未必表示执行单元的实际物理布局。在这种配置中,当把指令组中的指令(为方便起见,将其称为I0,I1,I2,I3)并行发布到流水线P0,P1,P2,P3时,可以以相对于每一条其它指令被延迟的方式来执行每条指令。例如,指令I0可以在流水线P0的执行单元3100中首先被执行,指令I1可以在流水线P1的执行单元3101中第二个被执行,诸如此类。
在一个实施例中,当把所述发布组发布到处理器核114时,可以在执行单元3100中立即执行I0。稍后,当已经结束在执行单元3100中执行指令I0之后,执行单元3101可以开始执行指令I1,诸如此类,使得并行发布到核114的指令依照相对于彼此被延迟的方式来执行。
在一个实施例中,某些执行单元310可以相对于彼此被延迟,而其它执行单元310并不相对于彼此被延迟。当第二指令的执行取决于第一指令的执行时,转发路径312可用来把第一指令产生的结果转发给第二指令。所述转发路径312仅仅是示例性的,并且核114可以包含从执行单元310中的不同点到其它执行单元310或者到同一执行单元310的更多转发路径。
在一个实施例中,未由执行单元310执行的指令(例如,正被延迟的指令)可以被保留在延迟队列320或者目标延迟队列330中。延迟队列320可用来把指令保留在尚未由执行单元310执行的指令组中。例如,当指令I0正在执行单元3100中被执行时,指令I1、I2和I3可以被保留在延迟队列330中。一旦指令已经移过延迟队列330,那么所述指令就被发布给合适的执行单元310并且执行。目标延迟队列330可用来保留已经由执行单元310执行的指令的结果。在某些情况下,目标延迟队列330中的结果可以被转发到执行单元310以便在适当的时候处理或使其失效。同样,在一些情况下,延迟队列320中的指令也可被无效,如下所述。
在一个实施例中,在指令组中的每条指令已经经过延迟队列320、执行单元310和目标延迟队列330后,可以把结果(例如,数据和如下所述的指令)写回到寄存器堆或者写回到L1I-高速缓存222和/或D-高速缓存224。在某些情况下,所述回写电路306可用来写回最近修改的寄存器值(从目标延迟队列330之一接收的)和丢弃无效的结果。
分支预测信息
在本发明的一个实施例中,所述处理器110可以存储正由处理器 110执行的条件分支指令的分支预测信息。分支预测信息可以反映给定分支指令的执行历史,和/或在执行期间有助于预测所述分支指令的结果。
在本发明的一个实施例中,处理器110可以用来记录本地分支历史信息和/或全局分支历史信息。如下所述,在某些情况下,这种分支预测信息可以被重新编码到分支指令中。此外,在某些情况下,分支预测信息可以存储在分支历史表中。
在一个实施例中,本地分支历史信息可用来跟踪单个分支指令的分支历史。在某些情况下,本地分支历史信息可以包括用来表明一个分支先前被采用还是先前未被采用的单个位,分支历史位BRH(例如,如果该位被设置,那么分支先前被采用,而如果该位没有被设置,那么分支先前未被采用)。当BRH被设置时,在分支指令的后续执行期间,可以做出该分支将被采用的预测,从而在所述分支指令的结果被完全解析之前,允许处理器110取出并且执行分支采用路径(branchtaken path)的指令。类似地,当BRH被清除时,可以做出将不采用该分支的预测,从而允许处理器110取出并且执行分支未采用路径(branch not taken path)的指令。
本地分支历史信息也可以包括计数器(CNT),其可用来确定分支历史位在预测分支指令结果中的可靠性。例如,每当分支结果(采用或未采用)与BRH的值匹配时,计数器就会递增,由此表明BRH预测是更加可靠的。对于某些实施例来说,一旦计数器达到其最高值,计数器就会饱和(例如,3位计数器达到7时饱和)。同样,每当分支结果与BRH的值不匹配时,计数器就会递减,由此表明BRH预测是不太可靠的。当计数器达到其最低值时,计数器也可以停止递减(例如,到0时)。计数器可以是一位计数器、两位计数器或者三位计数器,或者作为选择,计数器可以包括任意位数。
在某些情况下,可以存储本地分支历史信息的另一位(BPRD),其表明本地分支历史信息是否准确地预测了所述分支指令的结果(例如,分支指令是否为本地可预测的)。例如,当CNT低于本地可预 测性阈值时,可以清除BPRD,以表明分支指令不是可预测的。当CNT超出或者等于本地可预测性阈值时,BPRD会被设置,以表明分支指令是可预测的。在某些情况下,BPRD会被初始化为一个值,该值表明分支指令是本地可预测的(例如,BPRD最初可以被清除)。此外,在某些情况下,一旦BPRD被清除,即使CNT升高到可预测性阈值以上,BPRD也会保持清除状态(例如,BPRD可以是粘性(sticky)位),由此表明分支指令保持为本地不可预测的。作为选择,BPRD可以根据CNT的值连续地更新。
在某些情况下,CNT可以被初始化为一个值,该值表明所述分支是可预测的或者是部分可预测的(例如,高于可预测性阈值或者高于“部分可预测性”阈值的值)。此外,在某些情况下,当CNT低于可预测性阈值时,或者作为选择,当CNT是零时,BRH位可以被修改以便反映分支指令的最新结果(例如,采用或未采用)。在某些情况下,当BRH被修改以便反映最新结果时,BPRD可以保持设置(表明不可预测性),直到CNT高于可预测性阈值为止。通过保持表明分支指令的本地可预测性的测量结果和/或位,可以确定是否使用本地分支历史信息来预测分支指令的结果。
全局分支历史信息可用来跟踪多条指令的分支历史。例如,给定分支指令的全局分支历史信息可以看出在当前分支指令之前被执行的多个分支指令(例如,一个,两个,三个,四个或更多),并且记录所述分支被采用还是未被采用。表明先前分支指令的历史结果的位(GBH)可以连同正被执行的分支指令的地址一起用作分支历史表的索引。分支历史表中的每一条目可以包含相应的全局分支历史位(GBRH),其表明分支的相应结果是什么(例如,对于先前分支指令的历史结果GBH来说,当前分支指令的结果GBRH是什么)。
在某些情况下,分支历史表中的每一条目可以包含类似于如上所述的计数器的全局分支历史计数器(GBCNT)。每当全局分支历史GBRH正确地预测了分支指令的结果时,GBCNT可以被递增,而每当全局分支历史条目错误地预测了分支指令的结果时,GBCNT可以 被递减。GBCNT的值可用来确定分支指令的全局分支历史的可靠性或者可预测性。
在某些情况下,所述全局分支历史信息可以包括类似于BPRD的位GBPRD,其当GBCNT超出或者等于可预测性阈值时被设置,而当GBCNT低于可预测性阈值时被清除。由此,GBPRD可用来确定分支指令是否是全局可预测的。在某些情况下GBPRD可以是粘性位(例如,一旦该位被清除,则该位可以保持清除状态)。作为选择,在某些情况下,GBPRD可以根据GBCNT的值被更新。
分支预测信息的存储
在本发明的一个实施例中,在执行期间,本地分支历史信息可以被重新编码到相应的分支指令或者I-行中。通过在相应分支指令中重新编码本地分支历史信息,用于存储分支预测信息的分支历史表的大小可以减少,并且可以提供对本地分支历史信息的基本上无限制的存储(例如,在分支指令本身中或者与其一起)。此外,在本发明的一个实施例中,只有在本地分支历史信息不可靠时(例如,如果确认计数CNT低于给定的本地可预测性阈值),全局分支历史信息才被存储在分支历史表中。由此,在某些情况下,只有当该指令的本地分支历史对于预测分支指令的结果未达到可接受的准确性时,才存储给定分支指令的全局分支历史信息。
图4是依照本发明一个实施例描述的用于记录并存储本地和全局分支历史信息的方法400的流程图。方法400可以从步骤402开始,其中分支指令被接收并且执行。在步骤404,分支指令的分支预测信息例如可以如上所述那样被更新(例如,通过设置或者清除分支历史位,递增或者递减分支历史计数器等等)。在步骤406,可以把更新了的本地分支历史信息(例如,BRH、CNT和/或其它本地分支历史信息)重新编码到分支指令中。
在步骤408,可以确定所述本地分支历史信息是否表明分支指令是本地可预测的(例如,所述分支可以仅使用单独的本地分支历史来 预测)。如上所述,这种确定可以包括确定CNT是否大于或等于可预测性阈值。如果否,那么在步骤410,可以把一个条目添加到包含分支指令的全局分支历史信息(例如,GBRH和/或GBCNT)的分支历史表。然后可以在步骤412结束方法400。
如上所述,本地分支历史信息可以依照各种方式来存储,所述方式可以包括使用指令位和/或I-行位。在一个实施例中,可以把本地分支历史信息和/或目标地址存储在包含分支指令的I-行中。图5A是依照本发明一个实施例描述的用于在I-行502中存储分支指令的本地分支历史信息和/或目标地址的示例性I-行502的框图。
如上所述,所述I-行可以包含多个指令(指令1,指令2等等),用于存储地址(例如,有效地址,EA)的位以及用于存储控制信息的位(CTL)。在本发明的一个实施例中,可以使用图5A中描述的控制位CTL来存储分支指令的本地分支历史信息(例如,BRH位、BPRD位、CNT位和/或其它位)。在本发明的一个实施例中,I-行可以包含多个分支指令,并且可以为每个分支指令存储本地分支历史信息。
在某些情况下,可以把本地分支历史信息存储在为该目的而在I-行里分配的位中。作为选择,在本发明的一个实施例中,可以把本地分支历史信息存储在I-行其它未使用的位中。例如,L2高速缓存112中的每一信息行可以具有额外的数据位,其可用于对在不同高速缓存级别之间传送的数据进行纠错(例如,纠错码ECC,用于确保传送的数据不被破坏并且用于对任何已出现的破坏情况进行修复)。在某些情况下,每级高速缓存(例如,L2高速缓存112和I-高速缓存222)可以包含每一I-行的相同副本。当每级高速缓存包含给定I-行的副本时,可以不使用ECC。相反,例如可以使用奇偶校验位来确定I-行在高速缓存之间是否被正确传送。如果奇偶校验位表明I-行在高速缓存之间被不正确地传送,那么可以从传送高速缓存中重取I-行(因为传送高速缓存包含该行),而不是执行错误检查,由此释放ECC位以便在存储分支预测信息时使用。
作为在I-行的其它未使用位中存储本地分支历史信息的一个例 子,考虑使用十一位来对存储的每两个单词进行纠错的纠错协议。在I-行中,可以使用十一位之一来存储每两条指令的奇偶校验位(当针对每个单词存储一条指令时)。可以使用每一指令的剩余五位来存储本地分支历史信息。
如上所述,在某些情况下,在指令被解码和/或执行(此处通称为重新编码)之后,本地分支历史信息可以被存储在分支指令中。图5B是依照所述指令的一个实施例描述的示例性分支指令504的框图。分支指令504可以包含用于识别指令类型的操作码(Op-Code),一个或多个寄存器操作数(Reg.1),和/或数据。如所描述的那样,分支指令504还可以包含用于存储BRH、BPRD和/或CNT位的位。
当执行分支指令504时,本地分支历史信息可以如上所述那样被修改。然后,所述本地分支历史信息可以被编码到指令504中,使得当指令随后被解码时,可以使用本地分支历史信息来预测分支指令的结果。如下所述,在某些情况下,当分支指令504被重新编码时,包含该指令的I-行可以被标记为改变并且可以被写回I-高速缓存222。
在本发明的一个实施例中,当本地分支历史信息被重新编码到I-行或者分支指令中时,在系统100中使用的每级高速缓存和/或存储器可以包含I-行或者分支指令中包含的已重新编码的信息的副本。在本发明的另一个实施例中,只有指定级别的高速缓存和/或存储器可以包含指令和/或I-行中包含的已重新编码的信息。可以使用本领域技术人员所公知的高速缓存相关性原理来更新每级高速缓存和/或存储器中的I-行的副本。
应注意的是,在传统的利用指令高速缓存的系统中,通常不由处理器110来修改指令。由此,在传统的系统中,I-行通常是在经过一段时间之后因过期而移出I-高速缓存222,而不是被写回L2高速缓存112。然而,如此处所述那样,在一些实施例中,修改的I-行和/或指令可以被写回L2高速缓存112,由此允许本地分支历史信息(和/或其它类型的信息/标志)得以保持在更高的高速缓存和/或存储器级别上。通过把指令信息写回更高的高速缓存级别,先前计算的指令信息 和结果(例如,在预先解码和/或执行指令期间计算的信息)可以随后被重新使用,而不必重复计算。通过重新使用所存储的指令信息并且通过减少指令信息的重新计算,在随后的预解码和调度期间,在预解码和执行指令的过程中消耗的电力得以降低。
作为一个例子,当I-行中预先解码的指令已经由处理器核处理时(可能使本地分支历史信息被更新),I-行可以被写入I-高速缓存222中(例如,使用回写电路238),从而可能覆盖I-高速缓存222中存储的I-行的旧版本。在一个实施例中,当对I-行中存储的信息作出改变时,可以只把I-行置于I-高速缓存222中。作为选择,在一个实施例中,可以总是把I-行写回I-高速缓存222。
依照本发明的一个实施例,当把修改的I-行写回到I-高速缓存222中时,可以把I-行标记为已改变。当把I-行写回I-高速缓存222并且标记为已改变时,I-行可以保持在I-高速缓存中达不同的时间量。例如,如果I-行经常由处理器核114使用,那么I-行可以被取出并且返回到I-高速缓存222若干次,每次都可能被更新。然而,如果I-行不是经常被使用(称为过期),那么可以从I-高速缓存222中清除I-行。当从I-高速缓存222清除I-行时,可以确定是否把I-行标记为已改变。当把I-行标记为已改变时,I-行可以被写回到L2高速缓存112中。作为选择,I-行可以总是被写回L2高速缓存112。在一个实施例中,I-行可以选择性地被立刻写回多个高速缓存级别(例如,写回L2高速缓存112和I-高速缓存222),或者被写回不同于I-高速缓存222的级别(例如,直接写回L2高速缓存112)。
在一个实施例中,分支指令504中的位可以在指令已经执行之后被重新编码,如上所述。在某些情况下,当所述指令从更高级别源代码被编译时,还可以在指令中编码所述本地分支历史信息。例如,在一个实施例中,用于编译源代码的编译器可以被设计成识别分支指令,产生本地分支历史信息并且编码分支指令中的这种信息。
例如,一旦已经创建了程序的源代码,就可以把所述源代码编译为指令,然后就可以在测试执行(或者“训练”)期间执行所述指令。 可以监视测试执行和测试执行的结果,以便产生程序中的分支指令的本地分支历史信息。然后可以重新编译所述源代码,使得分支指令的本地分支历史信息根据测试执行被设置为适当的值。在某些情况下,测试执行可以在处理器110上执行。在某些情况下,可以使用处理器110中的控制位或者控制插脚来把处理器110置于特殊的测试模式进行测试执行。作为选择,还可以使用被设计成能够执行测试执行并且监控结果的特殊处理器。
图6是依照本发明一个实施例描述的用于存储分支预测信息的电路的框图。在某些情况下,处理器核114可以利用分支执行电路602来执行分支指令并且记录分支预测信息。此外,可以使用分支执行电路602来控制和访问分支历史存储器604。所述分支历史存储器604例如可以包括分支历史表606。
图7是依照本发明一个实施例描述的分支历史表606的框图。如上所述,可以把条目706放置在描述分支指令的全局分支历史(例如,GBRH、GBCNT和/或GBPRD)的分支历史表中。在某些情况下,只有当分支指令是本地不可预测的时,才可以产生这种条目。由此,分支历史表606可以不包含正由处理器110执行的所有分支指令的条目。可以把分支指令的地址(分支指令地址)和表明全局分支历史的位用作对分支历史表606的索引704。作为选择,在某些情况下,只有一部分分支指令地址(例如,除表明全局分支历史的五位以外,只有八位分支指令地址)可以用作对分支历史表606的索引704。
可以使用任何适当的位数来索引全局分支历史(例如,一位、两位、三位、四位、五位或更多)。例如,每一位可以表明分支指令中产生的相应先前条件分支指令是被采用还是未采用(例如,如果先前分支指令被采用,则GBH的位0可以被设置,或者如果先前分支指令没有采用,则将其清除,GBH的位1可以根据先前条件分支指令的结果被设置或清除,诸如此类)。
在本发明的一个实施例中,只要相应的条件分支指令在处理器110中被高速缓存(例如,在I-高速缓存222、L2高速缓存112、L3 高速缓存和/或任何其它高速缓存级别中),那么分支历史表706中的条目706就可以被维护。在某些情况下,只有当分支指令处于某些级别的高速缓存时(例如,只有当分支指令处于I-高速缓存222或者L2高速缓存112中时),才可以保留分支指令的条目706。作为选择,例如可以使用年龄值把过期的条目706移出分支历史表606,所述年龄值表明对条目706的最新访问。例如,一旦条目706的年龄值高过年龄阈值,由此表明条目706没有经常被使用,那么可以把条目706从分支历史表706中移走。作为选择,可以使用本领域技术人员公知的任何其它高速缓存维护技术来在分支历史表606中维护条目706。
在某些情况下,除上述用于在分支历史表606中维护条目706的技术外,如果分支指令的本地分支历史信息表明所述分支指令在本地可预测,那么可以去除分支历史表中的条目706。例如,如果分支指令先前是在本地不可预测的并且把全局分支历史信息作为结果加以存储,那么如果分支指令以后变为在本地可预测的,则可以把包含全局分支历史信息的条目706从分支历史表606中移走。由此,在某些情况下,全局分支历史信息无需存储在分支历史表606中。
在某些情况下,可以把本地和全局分支历史信息都存储在表中(例如,全局分支历史表以及本地分支历史表),其中只有当本地分支历史表中的条目表明分支指令是在本地不可预测的时,才在全局分支历史表产生条目。此外,在某些情况下,可以通过把这种信息添加到I-行和/或在指令中重新编码这种信息来存储全局分支历史和本地分支历史。例如,在一个实施例中,本地分支历史信息可以被重新编码到每条分支指令中,同时分支的全局分支历史被附加到包含所述分支指令的I-行。在一个实施例中,只有当分支指令不是在本地可预测的时,才会把给定指令的全局分支历史附加到包含该指令的I-行。
条件分支的预解析
在某些情况下,条件分支指令的结果是可预先解析的(例如,在分支指令依照程序顺序被执行以前,例如,通过尝试性发布和无序执 行条件分支指令,可以确定条件分支指令的结果)。如果条件分支指令是可预先解析的,那么条件分支指令的结果(例如,采用或不采用)可以在条件分支指令于处理器核114中被执行以前得以确定。然后可以使用所确定的结果来调度指令的执行(例如,通过沿条件分支指令的预解析路径来取出、调度和向处理器核114发布指令)。由此,在某些情况下,可以不利用分支预测信息(例如,来自分支指令先前执行的信息)来确定条件分支将被采用还是不采用。
图8是依照本发明一个实施例描述的用于预解析条件分支指令的方法800的流程图。方法800可以从步骤802开始,此时,从高速缓存(例如,从L2高速缓存112或者I-高速缓存222)中取出包含待执行的条件分支指令的I-行。在步骤804,可以确定该条件分支指令是否为可预先解析的。如果该条件分支指令是可预先解析的,那么在步骤806,所述分支指令可以被无序地尝试性发布给处理器核114。在步骤808,可以执行条件分支指令,由此预解析条件分支指令的结果(例如,采用或不采用)。然后,在步骤810,可以存储分支指令的预解析结果。在步骤812,在调度期间,可以使用所存储的分支指令的结果来调度后续指令的执行。然后可以在步骤814结束方法800。
如上所述,可以确定条件分支指令是否为可预先解析的。条件分支指令在多种情况下是可预先解析的。例如,条件分支指令可以检查条件寄存器(CR)中的位以便确定是否分支到另一指令。当条件寄存器中的位已经被设置并且不会被先于分支指令的任何指令(例如,在从L2高速缓存112中取出条件分支指令的时间和执行条件分支指令的时间之间所执行的指令)修改时,所述条件分支指令可以被预解析。通过确保先前指令不会修改条件分支指令的结果(例如,通过确保先前指令不会改变条件寄存器中的值并且由此改变分支指令的结果),可以通过在不执行先前指令的情况下无序地尝试性发布分支指令(或者指令组合)来成功地确定分支指令的结果。然后可以存储条件分支指令的结果以供后续使用。
在某些情况下,为了预解析条件分支指令的结果,可以无序地尝 试性发布两条或更多条指令而不保存指令结果。通过无序地尝试性发布指令而不保存指令结果,可以预解析条件分支的结果(例如,在实际执行分支指令以前)而不需要一般与无序执行相关的系统开销(例如,相关性检查)。例如,在某些情况下,可以执行先于分支指令的、影响条件寄存器中的位的加法指令或者其它算术或逻辑指令。基于受影响的位,条件分支指令可以确定是否采用分支(称为加法-分支组合)。当能够预解析加法-分支组合(例如,不需要执行影响分支指令和加法指令的结果的其它先前指令)时,所述加法指令和分支指令可以被无序地尝试性发布并且被用于确定和存储条件分支指令的结果。在尝试性发布加法-分支组合之后,可以存储条件分支指令的预解析的结果,而加法指令的结果(总和)和所述分支指令(把程序计数器改变为分支目标地址)可以被丢弃。由此,在实际执行指令以前,尝试性发布和执行类似于预取。
在某些情况下,为了预解析条件分支指令的结果,可以无序地尝试性发布三条或更多条指令。例如,可以使用加载指令把数据加载到寄存器中,然后可以使用比较指令把寄存器内容与其它数据相比较。于是比较指令的结果可以影响条件寄存器中的位,其用来确定是否采用分支(将其称为加载-比较-分支组合)。当能够预解析加载-比较-分支组合(例如,不需要执行影响指令的结果的其它先前指令)时,所述指令可以被无序地尝试性发布并且用于确定和存储条件分支指令的结果。
在一个实施例中,可以选择包含条件分支指令以及其它指令的一部分I-行,并且可以执行无序地尝试性发布,由此预解析条件分支指令。当选择了一部分I-行并且无序地尝试性发布时,所述I-行部分可以包含分支指令、一个或多个先前指令以及一个或多个后续指令。所述条件分支指令的结果可以被存储并且用于调度和执行,而其它指令的结果可以被丢弃。
如上所述,在某些情况下,可以执行条件分支指令的尝试性发布。由此,在本发明的一个实施例中,当通过无序执行一个或多个指令来 预解析条件分支指令时,被无序执行的指令可以在不存储任何被所执行的指令改变了的寄存器值的情况下被执行。例如,当分支指令被预解析时,即便条件分支指令的结果(采用或不采用)可以如上所述那样被存储,程序计数器(通常受分支指令的影响)也不会被预解析的分支指令改变。同样,当在预解析期间尝试性发布加法指令、加载指令、比较指令和/或任何其它指令时,在条件分支指令已经被预解析并且分支结果(采用或不采用)已经被存储之后,这种指令的结果可以被丢弃。此外,如上所述的结果不会被转发给没有被预解析的其它指令(例如,正在正常、例如按照次序执行的指令)。在某些情况下,可以在预解析期间无序地尝试性发布的每条指令中设置一位,以表明指令的结果不应该影响任何寄存器或者其它指令,并且表明分支的结果(采用或未采用)应被存储。
在一个实施例中,可以在分支指令中设置一个标志,以便标识所述指令是可预先解析的。所述标志例如可以在预解码和调度条件分支指令期间被设置(例如,通过预解码器和调度器电路220)。还可以为如上所述的指令组合或者部分I-行设置这种标志。当设置所述标志时,处理器110可以检测所述标志,并且作为响应,条件分支指令和预解析所需的任何其它指令可以被无序地尝试性发布以便预解析。在某些情况下,所述标志可以在训练模式(如下所述)期间被设置,并且在条件分支指令的后续执行期间保持设置。作为选择,所述标志可以在编译时由编译器设置,并且可以随后用于确定所述指令是否应被预解析。
在本发明的一个实施例中,当使用级联的、延迟的执行处理器单元(如上文就图3所描述的那样)来执行分支指令时,正被预解析的指令可以被尝试性发布给最延迟的执行流水线(例如,图3中的流水线P3)。如果最延迟的执行流水线是最少使用的执行流水线,那么可以把已预解析的指令尝试性发布给最延迟的执行流水线。
在某些情况下,可以对能预先解析的每条分支指令执行预解析。作为选择,在本发明的一个实施例中,只有当条件分支指令是可预先 解析的并且是不可预测的(例如,不是本地和/或全局可预测的)时,才可以执行预解析。例如,如果条件分支指令的本地可预测性低于可预测性阈值(例如,像如上所述由CNT值确定的那样),并且,当加以利用时,如果条件分支指令的全局可预测性低于可预测性阈值,并且如果条件分支指令是可预先解析的,那么所述条件分支指令就可以如此处所述那样被预解析。作为选择,可以使用本领域技术人员公知的用于确定条件分支指令的可预测性的任何方案来确定条件分支指令是否是可预测的。
在本发明的一个实施例中,可以根据从L2高速缓存112中取出的指令确定条件分支指令是否可以被预解析。例如,当从L2高速缓存112中取出I-行时,可以使用预解码器和调度器电路220来确定取出的I-行是否包含应被预解析的条件分支指令。当I-行包含应被预解析的条件分支指令时,例如在位于I-高速缓存222中的其他指令以前,预解码器和调度器220可以无序地向处理器核114尝试性发布条件分支指令以及预解析所需的任何其它指令。
在本发明的一个实施例中,在从L2高速缓存112预取包含条件分支指令的I-行之后,可以预解析条件分支指令。例如,当处理器110确定正被取出的I-行包含“退出分支指令”时,可以进行I-行的预取,其中所述“退出分支指令”用于分支到(以其为目标)位于I-行外部的指令。退出分支指令的目标地址可以被提取(例如,通过计算目标地址或者使用先前存储的目标地址)并且用于从L2高速缓存112、更高级别的高速缓存和/或存储器预取包含目标指令的I-行。例如,在以I-行中指令作为目标的退出分支指令被执行以前和/或在处理器110的程序计数器被改变以便把I-行中的指令作为目标以前,可以进行这种预取。例如,可以使用分支预测信息来预测退出分支指令的结果。因此,如果退出分支被采用,或当退出分支被采用时,作为目标的I-行可能已经处于I-高速缓存222中,由此避免在I-高速缓存222中发生高代价的未命中并且改进了综合性能。
在已经预取了由退出分支指令作为目标的I-行之后,如上所述, 可以确定预取的I-行是否包含应被预解析的条件分支指令。通过预解析预取的I-行中包含的条件分支指令,可以在早期确定条件分支指令的结果,由此允许处理器110更好地调度指令的执行。此外,在某些情况下,一旦已经预解析了预取的I-行中的分支指令的结果,必要时,就可以使用预解析的分支指令的目标地址来预取额外的I-行。
在一个实施例中,当从高速缓存中预取条件分支指令时,只在所述预取(和/或其它先前的预取,其中I-行系列被预取)是基于另一I-行中的可预测的条件分支指令被执行的时,才可以预解析所述条件分支指令。作为选择,在某些情况下,只有当先前的预取是仅基于一个或两个不可预测的条件分支指令被执行(例如,基于不可预测的分支指令的预取继之以基于另一不可预测的分支指令的预取)时,才可以预解析所述条件分支指令。通过限制基于不可预测的条件分支指令的先前预取的数目,如果已预取的I-行中的指令没有被最终执行(例如,由于基于不可预测的分支指令进行错误的预取,其中不可预测的分支指令最终被解析为与预测相反的结果),那么就可以节省执行预解析所必需的资源。
图9是依照本发明一个实施例描述的用于预解析从L2高速缓存112中取出(或者预取)的条件分支指令的示例性电路的框图。如所描述的那样,可以使用预取电路902例如基于存储在从L2高速缓存112中取出并且经由预解码器和调度器220中继到I-高速缓存222的I-行中的一个或多个地址来执行I-行的预取。此外,如所描述的那样,可以提供分支预解析检测和选择电路904来检测可预先解析的分支和可预先解析的分支指令组合,并且用来从正从L2高速缓存112被取出的或者预取的I-行中选择指令。
在一个实施例中,待预解析的指令可以被放置在队列906中。可以使用发布和分派电路234来确定是从I-行缓冲器232还是从队列906发布指令。在某些情况下,所述条件分支指令或者分支指令组合可以在处理器核114的空闲周期(例如,未使用处理器周期)期间被执行。例如,在一个实施例中,I-行缓冲器232中的指令可以在执行期间被 给予优先级。如果正从I-行缓冲器232被执行的指令导致停顿(例如,由于高速缓存未命中),那么发布/分派电路234可以从队列906尝试性发布指令,由此利用处理器核114来执行预解析,而不必中断其它指令在处理器核114中的执行。作为选择,在一个实施例中,在指令处于队列中达到阈值时间量之后,或者在所执行的来自I-行缓冲器232的指令达到阈值数目之后,可以从队列906尝试性发布指令(例如,可以为无序地尝试性发布的每一个条件分支指令或者分支指令组合执行第一数目的调度指令)。
用于尝试性发布队列906中的分支指令/组合的其它实现方式对于本领域普通技术人员而言应该是显而易见。例如,可以把提前执行指令标签置于指令中或者与所述指令一起存储在队列906中,并且当程序计数器几乎等于提前执行指令标签时(例如,当程序计数器距提前执行指令标签达到阈值数目的指令时,例如当程序计数器距执行指令为一个高速缓存行时),被标记的指令可以从队列906中被弹出并且被尝试性发布。例如,提前执行指令标签可以只提供待尝试性发布的预解析指令的较高阶位。提前执行指令标签的较高阶位例如可以标识包含待尝试性发布的指令的指令行、一组两个指令行或者一组四个指令行等等。当程序计数器落入或者接近被标识的指令行时,被标记的指令可以被尝试性发布并且预解析结果可以被存储以供后续在执行条件分支指令时使用,如上所述。
由此,当把预取的指令置于队列906中时,只有可能将被执行的指令(例如,提前执行指令标签几乎等于程序计数器的预解析指令,并且其可能没有会分支到预解析指令周围的先前分支指令)会从队列906中被实际检索出来并且被执行。作为选择,队列906可以具有固定延迟,队列中的指令可以经此传递。在指令已经处于队列906达到固定延迟的长度之后,所述指令可以被尝试执行。
在本发明的一个实施例中,可以使用条件分支指令的预解析的结果来执行I-行的后续预取。例如,如果当分支被采用时条件分支指令分支到另一I-行中的目标指令,那么如果分支指令的预解析的结果表 明所述分支将被采用,则另一个I-行可以被预取。如果预解析的结果表明所述分支没有被采用,那么预取可以用于另一分支指令的目标或者用于又一个后续的I-行。
在本发明的一个实施例中,从I-高速缓存222取出或者预取的条件分支指令或者条件分支指令组合可以被预解析。例如,从I-高速缓存222中取出的第一I-行(例如,响应于来自处理器核114的命令/请求)可以包含一个或多个目标有效地址(或者一个或多个有效地址部分,例如,所述部分可以仅为标识I-高速缓存222中的I-行的足够的地址位)。所述目标有效地址例如可以对应于包含可在最初取出的I-行中的指令之后被执行的指令的后续I-行。在某些情况下,可以产生对应于待取出的I-行序列的目标地址,并且在预解码和调度期间(例如,通过预解码器和调度器220)将其置于I-行中。作为选择,也可以使用第一I-行中的退出分支指令的目标地址,如下所述。
在一个实施例中,可以使用一个或多个目标有效地址来从I-高速缓存222中预取后续的I-行。例如,第一I-行可以包含标识可分别预取的两个I-行的两个有效地址的部分。在某些情况下,如果确定待预取的I-行没有处于I-高速缓存222中,那么可以从L2高速缓存112中取出I-行。此外,对于每个已预取的I-行,已预取I-行内的目标地址可以用于后续的预取(例如,用于执行一连串的预取)。
使用有效地址从L1高速缓存222中预取的每一I-行可被置于一个或多个缓冲器中。对于每个I-行来说,可以确定I-行是否包含可预先解析的条件分支指令或者条件分支指令组合。如果I-行包含,则可预先解析的条件分支指令或者条件分支指令组合可以如上所述被无序地尝试性发布并且被预解析。
图10是依照本发明一个实施例描述的用于预解析从I-高速缓存222取出(或者预取)的条件分支指令的示例性电路的框图。如所描述的那样,可以使用I-高速缓存预取电路1002来检测正从I-高速缓存222被取出或者预取的I-行中的目标地址,并且发布对相应于目标地址的I-行的请求。然后可以把预取的I-行置于四个I-行缓冲器232、 1010、1012、1014之一中。例如,可以使用第一I-行缓冲器232来依照程序顺序执行指令(例如,用于正被执行的程序的当前部分),而其它I-行缓冲器1010、1012、1014可以用于无序执行条件分支指令/指令组合。其它I-行缓冲器1010、1012、1014还可以用于其它目的,诸如缓冲非预测或者非预解析分支路径,或者用于同时多线程处理,如下所述。
一旦把来自预取的I-行的条件分支指令/指令组合置于I-行缓冲器1010、1012、1014中,所述条件分支指令/指令组合就可以被无序地尝试性发布以用来预解析,如上所述。在某些情况下,如上文针对从L2高速缓存112(例如,经由图9中的队列906)无序地尝试性发布的指令所描述的那样,来自其它缓冲器1010、1012、1014的条件分支指令/指令组合只在处理器核114处于空闲周期期间才被尝试性发布并且无序执行。
虽然上文针对预解析从I-高速缓存222或者L2高速缓存112取出的指令进行了描述,预解析还可以在其他时间被执行,例如在从L3高速缓存中取出条件分支指令之后。
如上所述,预解析的条件分支指令的结果(例如,采用或不采用)可以被存储并且稍后用来确定对后续指令的调度(例如,允许后续指令被正确地发布给处理器核114和/或被预取)。在本发明的一个实施例中,条件分支指令的结果可以被存储为使用按内容寻址存储器(CAM)来访问的位。如果对条件分支指令的预解析表明所述条件分支指令将被采用,那么就可以设置所存储的位。否则,如果预解析表明所述条件分支指令将不被采用,那么就可以清除所存储的位。
图11是依照本发明一个实施例描述的用于存储预解析的条件分支信息的示例性CAM的框图。当把地址应用于CAM1102时,CAM1102的输出可以表明对应于所述地址的条目是否存在于CAM1102中并且可以标识所述条目。然后可以由选择电路1104使用所述条目标识以便从相应预解析的分支数据(例如,RAM阵列)的表1106中获得与条目/地址相关联的数据。由此,分支指令的地址可以用作对CAM 1102的索引,以便获得所存储的预解析分支指令的结果,如果有的话。在某些情况下,只有一部分条件分支指令地址可用来存储条件分支指令的结果。在执行期间,可以检查CAM1102来确定分支指令的结果是否已经被预解析,并且如果是这样的话,则据此调度分支指令和后续指令的执行。此外,如上所述,在某些情况下,只有可预先解析并且不可预测的条件分支指令可以被预解析。因为并非每一条件分支指令都可以被预解析,所以存储条件分支指令结果所需的存储器(例如,CAM1102和/或表1106)的大小可以因此减少。
在本发明的一个实施例中,可以使用CAM1102和预解析分支数据表1106来存储一个或多个条件分支指令的条件寄存器位(例如,代替或者除了条件分支指令的结果和/或其它信息外)。当条件分支指令正被调度以便执行时,对应于所述条件分支指令的条件寄存器条目的位可以被检查以便确定所述分支将被采用还是不采用。
例如,如果条件寄存器表明由处理器110处理的值是零,那么可能采用一个类型的条件分支指令(如果是零则分支,或者BRZ)。当BRZ指令和后续指令正被调度以便执行时,处理器110可以检查CAM1102和表1106以便确定对应于BRZ指令的条件寄存器条目是否处于表1106中。如果发现这种条目,则所述条件寄存器条目中的零位(Z-位)可以被审查以便确定条件分支指令将被采用(如果Z-位被设置)还是不采用(如果Z-位被清除)。
在本发明的一个实施例中,多个条件分支指令可以利用预解析分支数据表1106中的单个条件寄存器条目。每条指令可以检查条件寄存器条目来确定所述分支指令将被采用还是不采用。例如,一个条件分支指令可以检查条件寄存器条目的Z-位来确定先前计算的结果是否是零。另一条件分支可以检查用于表明先前计算结果是否造成溢出的溢出位(例如,所述计算产生的值过大以致于无法由用于存储该值的计数器来保存)。由此,在某些情况下,通过存储分别可用于多个分支指令的条件寄存器条目,预解析分支数据表1106的大小可以减少。
在某些情况下,即使条件分支指令被预解析,也可预取和/或缓 冲条件分支指令的两个目标。例如,在某些情况下,可以在不确定预解析是否完全准确的情况下(例如,在没有确定依照程序顺序先于条件分支指令的指令当被执行时是否将修改预解析的结果的情况下)来预解析所述条件分支指令。在这些情况下,条件分支指令的预解析可以是对将遵循条件分支指令的哪条路径的“最佳猜测”。在一个实施例中,通过缓存所述条件分支指令的两个路径(预解析的和非预解析)同时只发布预解析路径,如果条件分支指令的执行表明所述指令没有遵循预解析的路径,那么处理器110可以通过发布缓冲的、非预解析路径而迅速地恢复。
在某些情况下,条件分支指令可能不是可预先解析的,例如,这是因为条件分支指令依赖于当条件分支指令从L2高速缓存112中检索出时无法解析的条件。当没有对条件分支指令使用预解析时,可以在分支指令之后使用其它技术来调度指令的执行。
例如,在本发明的一个实施例中,可以检查CAM1102来确定对应于条件分支指令的条目是否存在。如果所述CAM1102表明条件分支指令的相应条目存在,那么相应的条目可以用于调度和执行所述条件分支指令和/或后续指令。如果所述CAM1102表明条件分支指令的相应条目不存在,那么可以使用其他方法来调度和执行所述条件分支指令和/或后续指令。例如,分支预测信息(如上所述)可以用来预测不可预先解析的条件分支指令的结果。作为选择,如下所述,可以利用预测性发布或者双重路径发布来执行不可预先解析的条件分支指令。作为选择,本领域技术人员所公知的任何其它条件分支解析机制都可用来调度条件分支指令之后的指令。
条件分支指令的双重路径发布
在本发明的一个实施例中,处理器110可用来同时执行条件分支指令的多个路径(例如,采用和未采用)。例如,当处理器110检测到条件分支指令时,处理器110可以从条件分支指令的分支采用路径发布指令,并且还可以从分支未采用路径发布指令。所述条件分支指 令可以被执行,并且可以确定条件分支指令是采用还是不采用(例如,在两个分支路径都已经被发布之后)。如果条件分支指令被采用,那么来自分支未采用路径的指令的结果可以被丢弃。如果分支未采用,那么来自分支采用路径的指令的结果可以被丢弃。
图12是依照本发明一个实施例描述的用于执行条件分支指令的多个路径的方法1200的流程图。如所描述的那样,方法1200可以从步骤1202开始,其中接收将执行的一组指令。在步骤1204,可以确定该组指令是否包含条件分支指令。如果该组指令包含条件分支指令,那么在步骤1206,处理器110可以从条件分支指令的分支采用路径和分支未采用路径发布指令。在步骤1208,可以确定该条件分支指令是采用还是未采用。如果该条件分支指令未被采用,那么在步骤1210,来自分支采用路径的指令结果可以被丢弃,而来自分支未采用路径的指令结果可以被传播。然而,如果该条件分支指令被采用,那么在步骤1212,来自分支未采用路径的指令结果可以被丢弃,而来自分支采用路径的指令结果可以被传播。然后可以在步骤1214结束该方法。
在本发明的一个实施例中,只有在例如无法使用本地分支预测和/或全局分支预测来预测条件分支指令的情况下(或者作为选择,在条件分支指令不是完全可预测的情况下),才利用双重路径发布。例如,在使用本地分支预测的情况下,如果条件分支指令是在本地可预测的(例如,如果CNT大于或等于可预测性阈值),那么不使用双重路径发布。如果条件分支是在本地不可预测的,那么可以使用双重路径发布(或者作为选择,使用诸如预解析或者预测性发布的其它方法)。在本地分支预测和全局分支预测都使用的情况下,如果条件分支指令是本地可预测的或者是全局可预测的,那么可能不使用双重路径发布。然而,如果条件分支指令既不是本地可预测的又不是全局可预测的,那么可以使用双重路径发布(或者作为选择,使用其它方法)来执行该条件分支指令。此外,在某些情况下,当使用分支预解析时,那么只有在条件分支指令既不可预测又不可预先解析的情况下才使用双重路径发布。
在某些情况下,是否执行双重路径发布可以取决于在处理器核114中是否有两个线程正被同时执行。例如,如果只有一个线程在处理器核114中被执行,那么在检测到不可预测的条件分支指令或者检测到只部分可预测的分支的情况下才执行双重路径发布。
在某些情况下,是否执行双重路径发布取决于条件分支指令的可预测性和是否有两个线程正被执行这两者。例如,在条件分支指令正被执行并且检测到不可预测的条件分支指令的情况下,那么即使当执行双重路径发布时另一线程已停顿,也可以使用双重路径发布。然而,如果检测到部分可预测的条件分支指令,那么只有当另一个线程已经停顿或者未被执行的情况下,才可使用双重路径发布。双重路径发布的这种确定还可取决于与每一线程相关联的优先级。例如,在某些情况下,可以使用如上所述的任何条件来执行双重路径发布,但是只有在经受双重路径发布的线程的优先级大于正被执行的另一个线程的优先级的情况下。
在本发明的一个实施例中,当从L2高速缓存112取出(或者预取)指令行并且发送到I-高速缓存222时,条件分支指令的检测以及双重路径发布的启动可以由预解码器和调度器电路220来执行。在某些情况下,预解码器和调度器220可以确定给定指令组是否包含条件分支指令。所述预解码器和调度器220可用来确定条件分支指令是否是本地和/或全局可预测的。此外,所述预解码器和调度器220可用来为条件分支指令的每一路径取出、预取和/或缓冲指令以及I-行。
在一个实施例中,在预解码器和调度器220确定条件分支指令可以采用双重路径发布来执行的情况下,所述预解码器和调度器220可以存储用于表明可以为该指令使用双重路径发布的位(在某些情况下,例如,在确定所述指令不可预先解析并且不可预测之后)。例如可以在指令中编码所述位,或者依照把该位与条件分支指令相关联的方式来存储。在某些情况下,为了减少用于确定双重路径发布是否适当的功耗,可以只在训练阶段期间计算并且存储该位,如下所述。当随后检测到该位时,可以使用双重路径发布来执行条件分支指令。
在本发明的一个实施例中,所述处理器核114可以利用同时多线程(SMT)能力来执行条件分支指令的每一路径。通常,同时多线程处理可用来发布并且执行处理器110中的第一和第二线程。在用于条件分支指令的双重路径执行的情况下,可以把条件分支指令的一个路径作为第一线程发布给处理器110,并且可以把条件分支指令的另一路径作为第二线程发布给处理器110。在条件分支指令的结果被确定之后,所述结果(采用或未采用)可以用来继续执行其中一个路径/线程,并且丢弃另一个路径/线程的结果。例如,如果条件分支被采用,那么所述分支采用线程可以继续执行,而分支未采用线程(以及结果)可以被丢弃。同样,如果条件分支未被采用,那么所述分支未采用线程可以继续执行,而分支采用线程(以及结果)可以被丢弃。
图13是依照本发明一个实施例描述的用于条件分支指令的双重路径发布的电路框图。如所描述的那样,在某些情况下,可以提供两个I-行缓冲器1332、1336,每个线程一个。同样,还可以提供两组发布/分派电路1334、1338,每个线程一个。还可以提供合并电路1302把来自一个线程与另一个线程的指令合并,并且形成组合的发布组。在某些情况下,单个发布组可以包含来自两个线程的指令。在寄存器堆240中,每一线程还可以具备独立的寄存器组1340、1342。分支路径选择电路1304可以用来确定每个线程的条件分支指令是采用还是未采用,并且适当传播任一线程的结果或者丢弃任一线程的结果。
图14是依照本发明一个实施例描述的使用同时多线程处理执行的示例性指令1402的框图。如所描述的那样,所述指令可以包括op-代码、一个或多个寄存器操作数(Reg.1,Reg.2)和/或数据。对于每个指令和/或寄存器操作数而言,可以提供一个或多个位(T)来表明线程寄存器组1340、1342用于所述指令。由此,例如,线程0中的指令和线程1中的指令可以都利用相同的寄存器(例如,Reg.1),但线程0中的指令将使用线程0寄存器1340中的寄存器1,而线程1中的指令将使用线程1寄存器1342中的寄存器1,由此避免指令之间的冲突。
在本发明的一个实施例中,处理器110可以使用线程有效性位(T0V,T1V)来确定给定分支路径有效还是无效。例如,条件分支指令的每个路径的每一指令或者指令组可以以两个位被设置(表明两个线程是有效的)的状态被发布。在分支指令的结果被确定之后,被遵循的分支路径(例如,采用或未采用)的位可以保持设置,而没有遵循的分支路径的位可以被清除。在该线程中指令的线程有效性位被设置的情况下,可以例如经由转发来传播和/或存储指令的结果,或者将其写回到D-高速缓存224或者寄存器堆240。当在该线程中的指令的线程有效性位被清除的情况下,指令的结果可以由处理器110丢弃并且不被传播。据此,可以使用线程位T0V、T1V来选择并且继续执行遵循的分支路径的线程。
在本发明的一个实施例中,线程位T和/或线程有效性位T0V、T1V可以被存储(例如,编码)到每一指令1102中。作为选择,所述线程位T和/或线程有效性位T0V、T1V可以被存储在指令1402的外面,例如,存储在用于保留指令1402以及所述位的一组锁存器中。
在本发明的一个实施例中,当向处理器流水线发布每一路径的指令时,可以偏向于双重发布的条件分支指令的预测路径。在某些情况下,即使条件分支指令是本地和/或全局不可预测的,也可以使用这种预测(例如,如“最佳”猜测)。
作为预测路径优先于未预测路径的一个例子,可以发布预测路径的指令与未预测路径的指令的固定比例。例如,在把四个指令置于发布组中的情况下,所述比例可以是来自预测路径的三个指令对来自未预测路径的一个指令。在把六个指令置于发布组中的情况下,所述比例可以是预测分支的四个指令对未预测分支的两个指令。在把八个指令置于发布组中的情况下,所述比例可以是预测路径的六个指令对未预测路径的两个指令(同样是三比一的比例)。
作为预测的路径优先于未预测路径的另一个例子,预测路径的指令与未预测路径的指令的比例可以根据条件分支指令的可预测性水平而改变。如果条件分支指令的可预测性在第一范围之内,那么可以发 布指令的第一比例。例如,如果所述条件分支指令是中度不可预测的,那么可以发布较大的指令比例,例如三比一。如果条件分支指令的可预测性在第二范围之内,那么可以发布指令的第二比例。例如,如果所述条件分支指令是完全不可预测的,那么可以发布相等的指令比例,例如一比一。
在某些情况下,预测的分支指令的双重发布只在正由处理器110执行的另一线程停止的情况下才可以使用。例如,如果处理器110正在执行第一线程和第二线程,并且第一线程包含条件分支指令,那么在第二线程例如由于高速缓存未命中而停止的情况下,处理器110可以对第一线程利用双重路径发布。在某些情况下,还可以应用如上所述的其它条件。例如,在第二线程停止并且条件分支指令是本地和/或全局不可预测的情况下,可以使用双重路径发布。
在某些情况下,在双重路径发布使用SMT电路时,如果双重路径发布的一个路径停止,那么双重路径发布的另一个路径可以是所发布的唯一线程,直到停止的线程恢复执行为止(例如,如果第一线程因高速缓存未命中停止,那么可以单独发布第二线程,直到例如从L2高速缓存112中检索到必要的数据为止),或者直到条件分支指令的结果被解析为止,并且线程之一被丢弃。在某些情况下,甚至当停止的线程是条件分支指令的已预测且优选路径时,也可以实施在一个线程停止时发布另一个线程。
在本发明的一个实施例中,I-行缓冲器232和/或延迟队列320可以包含来自条件分支指令的两个路径的指令。因为I-行缓冲器232和延迟队列320是存储电路,并且可能不包含处理电路,所以存储、缓冲和列队条件分支指令的两个路径可以采用相对较少的处理开销来执行。在条件分支指令的结果被解析之后,没有被遵循的分支路径的指令被标记为无效(例如,通过改变线程有效性位T0V、T1V)并且在适当时候从I-行缓冲器232和/或延迟队列230被丢弃。
在某些情况下,双重路径发布在两个指令竞争以得到有限处理资源时是受限制的。例如,如果两个路径包含一个或多个指令,所述一 个或多个指令需要给定流水线以便执行(例如,流水线P0),那么分支路径的双重路径发布会被限制。在本发明的一个实施例中,在条件分支指令的路径的双重路径发布由于处理资源不足而受限的情况下,条件分支指令的预测路径会被发布并且会被利用有限的资源执行。
此外,只发布条件分支的一个路径会被限制,例如,因处理器110中的资源限制/冲突,处理器110可以发布条件分支指令的两个路径如此使得资源被两个路径共享。例如,第一分支路径会被停止,同时第二分支路径使用所述资源。然后,在第二分支完成对资源的利用之后,第一分支路径可以恢复执行并且利用所述资源。作为选择,可以设置对分支路径的指令的调度,如此使得资源冲突不会出现。例如,这种调度可以包括为使用资源的第一分支路径发布指令,同时对第二分支路径发布无序指令。在第一分支路径已经结束对资源的利用之后,可以发布来自利用资源的第二分支路径的指令。
在本发明的一个实施例中,对条件分支指令的双重发布会局限于分支距离低于阈值距离的分支。例如,在某些情况下,处理器110可以只利用较低部分的地址来对处理器核114中的指令进行寻址(例如,可以使用基础地址加上作为从基础地址的偏移的较低部分来对每一指令进行寻址)。可以使用这种局部寻址例如是因为当存储并且计算局部地址时,可以利用较少的处理器资源。
在一个实施例中,在使用每一指令地址的较低偏移部分来在处理器核114中寻址该指令时,只有在分支距离小于地址部分提供的偏移的情况下才可以使用双重路径发布。在此情况下,通过限制双重路径发布的分支距离,两个路径可以有效地利用由处理器核114使用的同一基础地址来对指令进行寻址。同时,在一个实施例中,如下所述,可以对分支距离设置更低的距离阈值,例如其中,如果分支距离小于有效进行条件分支指令的双重发布的阈值距离,那么使用预测的发布来执行条件分支指令。
在某些情况下,当只发布条件分支指令的一个路径时,条件分支指令的另一个路径也可以被缓冲,例如通过取出没有被发布的分支路 径的指令并且将那些指令置于I-高速缓存222和/或I-行缓冲器232中。如果条件分支指令的结果表明所发布的路径没有被遵循,那么来自未发布路径的已缓冲指令可以被迅速发布并且由处理器110执行,由此降低了从被发布但未被遵循的分支路径切换至未发布但被遵循的分支路径所需的等待时间。通过缓冲条件分支指令的两个路径并且只发布预测的路径,如果条件分支指令的结果表明未预测路径应被遵循,那么处理器110可以迅速开始执行未预测的路径。
在一个实施例中,当分支指令的可预测性表明所述分支低于完全可预测的阈值但是大于或等于部分可预测的阈值时,可以缓冲两个分支路径但是只可以发布一个分支路径。在此情况下,部分预测的条件分支指令的预测路径可以都被缓冲并且发布以便由处理器110执行。未预测路径也可以被缓冲但不发布。如果条件分支指令的结果表明预测的并且发布的路径由分支指令遵循,那么预测的并且发布的路径可以继续执行。如果条件分支指令的结果表明预测路径没有被遵循,那么已缓冲但未发布的路径可以被发布并且执行。
在某些情况下,只有当条件分支指令的预测的发布是低效的时(例如,因中间(interceding)指令的数目),或者当不可能进行预测的发布时(例如,因指令的互相依赖性),才可以使用双重路径发布。
短的、条件分支指令的预测执行
在某些情况下,如果分支被采用的话,条件分支指令可以跳过位于条件分支指令和条件分支指令目标之间的一个或多个中间指令。如果条件分支指令未被采用,则中间指令可以被执行。这种分支指令可以被称为短的、条件分支。
在本发明的一个实施例中,例如在条件分支指令的结果被获知以前,短的、条件分支指令和短的、条件分支指令的目标之间的中间指令可以被发布并且由处理器110执行。当执行条件分支指令时,可以确定出分支是否被采用。如果分支被采用,那么已发布的、中间指令 的结果可以被丢弃。如果分支未被采用,那么已发布的、中间指令的结果可以被存储。对短的、条件分支指令发布中间指令的技术可以被称为“预测性发布”,因为对中间指令结果的使用和/或存储是对条件分支指令的结果(例如,未采用)的预测。通过使用预测性发布,处理器110可以把条件分支指令的两个路径作为单个路径来有效地执行(例如,使用单个线程并且不干扰第二有效线程),并且事后确定是否使用中间指令的结果(如果分支被采用,其将被条件分支指令跳过),由此在不停止或转储清除处理器核114中的指令的情况下执行条件分支指令。如下所述,如果处理器确定中间指令的结果不应该被使用,那么例如可以通过清除用以表明中间指令结果无效的位(例如,有效性位)来丢弃所述结果。
图15是依照本发明一个实施例描述的用于执行短条件分支的方法1500的流程图。如所描述的那样,过程1500可以从步骤1502开始,其中接收将执行的一组指令。在步骤1504,可以确定该组指令是否包含短的、条件分支指令。如果该组指令包含短的、条件分支指令,那么在步骤1506,所述短的、条件分支指令以及短的、条件分支指令与短的、条件分支指令的目标之间的中间指令例如可以被发布给处理器核114。在步骤1508,可以确定该条件分支指令的结果是否表明所述条件分支被采用或未采用。如果分支未被采用,那么在步骤1510,中间指令的结果可以被存储并且在处理器110中被传播。如果分支被采用,那么在步骤1512,中间指令的结果可以被丢弃。方法1200可以在步骤1514结束。
图16A-C是依照本发明一个实施例描述的短条件分支指令(I2)的框图。如图16A中所描述的那样,如果条件分支指令I2被采用,那么所述指令可以经由多个中间指令(I3、I4、I5)分支到目标指令(I6)。然而,如果条件分支指令未被采用,那么中间指令(I3、I4、I5)可以在后续指令(例如,指令I6)被执行以前执行。
如上所述,当检测到短的、条件分支指令I2时(例如,通过预解码器和调度器220),可以把条件分支指令I2和中间指令I3-I5发布给 处理器核114,无论所述分支采用还是未采用。在本发明的一个实施例中,每一指令可以包含有效性位(V),其用于表明指令的结果是否有效。例如,如果为给定指令设置了所述位,那么所述指令可以是有效的,并且指令的结果可以被传播给存储器、寄存器以及其它指令。如果没有为给定指令设置所述位,那么所述指令是无效的,并且指令的结果可以被丢弃并且不被传播。
由此,在本发明的一个实施例中,每条指令可以带有一个设置的有效性位被发布,由此表明该指令被假定为有效。在执行了条件分支指令之后,如果确定分支未被采用(例如,如图13B所示),那么可以为每个中间指令I3-I5保持设置有效性位,由此表明中间指令是有效的并且表明中间指令的结果可以被传播。作为选择,如果确定分支被采用(例如,如图16C所示),那么可以为每个中间指令I3-I5清除有效性位,由此表明所述指令的结果应被丢弃。
例如,所述有效性位可以通过转发电路、回写电路238、高速缓存加载和存储电路250和/或处理器110中的其它电路来检查,以便确定是否传播中间指令的结果。如果所述有效性位被设置,那么结果可以被传播(例如,回写电路238可以写回中间指令的结果),而如果有效性位被清除,那么结果可以被丢弃(例如,回写电路238可以丢弃中间指令的结果)。在本发明的一个实施例中,每一指令都可以具有有效性位。作为选择,在一个实施例中,所述有效性位可以只为条件分支指令和目标指令之间的中间指令(I3-I5)保持和/或修改。
在一个实施例中,只有当预测性发布的成本和/或效率(例如,在处理器时间周期中)小于双重发布的成本和/或效率时,才使用短的、条件分支指令的预测性发布。如果中间指令的数目低于有效双重发布的指令的阈值数目,那么预测性发布可以被执行。如果中间指令的数目大于或等于有效双重发布的指令的阈值数目,那么双重发布可以被执行。
作为一个例子,如果处理器核114能够同时处理34条指令,那么在双重发布期间,来自每一分支路径的17条指令可以被发布和/或 执行(或者部分执行)。因为分支指令通常只采用双重路径之一,所以来自未被采用的路径的17条指令可以被无效并且丢弃。据此,在确定是否对短、条件分支使用预测性发布的过程中,可以确定是否在预测性发布期间丢弃17条指令。例如,如果短条件分支和短条件分支目标之间的中间指令的数目小于17,那么如果短的、条件分支被采用并且跳过中间指令,则因为小于17条指令(双重发布的代价)将被丢弃,所以可以使用预测性发布。
在某些情况下,可以挑选任何阈值数目的中间指令来确定是否执行预测性发布(例如,大于、等于或者小于双重发布成本的阈值)。如果中间指令的数目小于阈值数目,那么可以使用短的、条件分支的预测性发布。如果中间指令的数目大于或等于阈值,那么可以使用其他形式的发布(例如,双重发布或者使用预测信息的发布)。
在某些情况下,当确定是否执行预测性发布时,可以对中间指令设置进一步的限制。例如,在本发明的一个实施例中,为了执行预测性发布,可以要求分支指令的目标指令与中间指令无关,使得中间指令的无效不会对目标指令产生不利影响(例如,通过从无效的中间指令向目标指令转发错误的数据)。作为选择,在某些情况下,还要求目标指令之后的一个或多个指令不依赖所述中间指令,从而在条件分支指令的结果被解析之前不会出现不当转发并且中间指令要么有效要么无效。
在某些情况下,当中间指令和随后执行的指令之间的冲突妨碍短的、条件分支指令的预测性发布时,可以对短的、条件分支使用双重路径发布(例如,采用SMT能力)。
用于发布指令的双重指令队列
在一个实施例中,分支指令的多个路径(例如,预测路径和未预测路径)的执行可以被延迟,由此在执行分支指令遵循的路径以前,所述分支指令的结果将被确定。在某些情况下,在不实际执行来自任何一个路径的指令的情况下,通过延迟执行分支指令的路径,分支指 令的遵循路径随后可以被执行,而不必徒劳地执行来自未遵循的分支指令的路径的指令。
在本发明的一个实施例中,所述处理器核114可以利用双重指令队列来延迟执行条件分支指令的预测和未预测路径两者的指令。例如,可以为条件分支指令的两个路径形成发布组。可以把第一个路径的发布组发布给双重指令队列的第一队列。可以把第二个路径的发布组发布给双重指令队列的第二队列。在确定了条件分支指令的结果之后,可以从双重指令队列中检索来自对应于所确定的结果(预测或者未预测)的分支路径的指令,并且在延迟执行流水线的执行单元中执行。
图18是依照本发明一个实施例描述的使用双重指令队列来执行分支指令的方法1800的流程图。方法1800可以从步骤1802开始,其中接收将执行的一组指令。在步骤1804,可以确定该组指令是否包含条件分支指令。如果该组指令包含条件分支指令,那么在步骤1806,可以发布条件分支指令以便执行。
在步骤1810,可以把条件分支指令的预测路径的指令发布给双重指令队列的第一队列,并且把条件分支指令的未预测路径的指令发布给双重发布队列的第二队列。在步骤1812,可以在双重发布队列中延迟所述条件分支指令的预测和未预测路径的指令,直到在步骤1814确定出条件分支指令的结果为止。如果分支指令的预测路径被遵循,那么在步骤1816,在执行单元中执行来自双重指令队列的第一队列的指令(预测路径的指令)。如果分支指令的未预测路径被遵循,那么在步骤1818,可以在执行单元中执行来自双重指令队列的第二队列的指令(未预测路径的指令)。方法1800可以在步骤1820结束。
图19是依照本发明一个实施例描述的具有双重指令队列1900的处理器核114的框图。如所描述的那样,双重指令队列1900可以包括第一I-队列1902和第二I-队列1904。可以使用第一I-行缓冲器2321和第二I-行缓冲器2322来分别为条件分支指令的预测和未预测路径缓冲从I-高速缓存222取出的指令(或者反之亦然)。还可以提供发布和分派电路2341、2342来为条件分支指令的每个路径发布指令。
在一个实施例中,所述条件分支指令可以在分支执行单元1910中执行。在确定条件分支指令的结果的同时,所述条件分支指令的预测路径和未预测路径的指令分别可以在I-行缓冲器2321、2322中缓冲,由发布/分派电路2341、2342发布,并且在双重指令队列1900的I-队列1902、1904中延迟。在本发明的一个实施例中,在使用分支执行单元1910确定出条件分支指令的结果的同时,双重I-队列1900的深度1906足以允许条件分支指令的两个路径都被缓冲,而无需停止在核114中执行指令。
在使用分支执行单元1910来确定条件分支指令的结果(例如,采用或未采用)之后,所述结果可以被提供给选择电路1908。然后,选择电路1908可以从相应的I-队列1902、1904向条件分支指令的遵循路径提供指令。例如,如果预测路径的指令在I-队列0 1902中被延迟并且未预测路径的指令在I-队列1 1904中被延迟,并且如果条件分支指令遵循未预测路径,那么选择电路1908可以从I-队列1 1904中选择指令以便由执行单元310执行。作为选择,如果条件分支指令的结果表明所述分支指令遵循预测路径,那么选择电路1908可以从I-队列01902中选择指令以便由执行单元310执行。
虽然图19中根据流水线的单个双重I-队列1900进行了描述,但是本发明的实施例可以为使用延迟执行的每个流水线(例如,图3中的流水线P1、P2、P3)提供双重I-队列。
在某些情况下,选择电路可以利用存储在双重指令队列1900中的有效性位(例如,取代来自分支执行单元1910的信号)来确定把哪些指令发布给执行单元310。作为一个例子,所述分支执行单元1910例如可以使用存储在双重指令队列1900中的每个路径的路径标识符来表明其中一个路径有效而另一个路径无效。作为选择,可以把有效性位提供给每一路径中的每条指令。所述有效性位可以基于条件分支指令的结果被设置或者清除。
例如,I-队列0 1902中的路径可以是路径0,而I-队列1 1904中的路径可以是路径1。每条路径中的每条指令可以具有被设置为1或 者被清除为0的有效性位。在分支执行单元1910确定遵循分支指令的哪个路径之后,可以把被遵循的路径的有效性位设置为1,由此表明该路径的指令应在执行单元310中被执行。未被遵循的路径的有效性位可以被设置为0,由此表明该路径的指令不应该执行。由此,当所述指令由选择电路1908接收到时,选择电路1908可以使用有效性位(例如,取代来自分支执行单元1910的信号)来确定哪些指令提供给执行单元310。例如,选择电路1908可以只向执行单元310提供设置了有效性位的指令以便执行。
在一个实施例中,可以在没有利用同时多线程处理的处理器核114中使用双重指令队列1900。由此,在某些情况下,可以不为两组发布电路2341、2342提供合并电路(例如,因为预测和未预测路径不会同时执行,由此可以创建并且发布独立的发布组,而无需进行任何合并)。
作为选择,在本发明的一个实施例中,可以在利用同时多线程处理的处理器核114中使用双重指令队列1900。例如,所述双重指令队列1900可供合并电路使用以便在第一线程中发布条件分支指令的预测和未预测路径,并且在第二线程中对指令亦是如此。此外,本发明的实施例可以提供三倍宽度的指令队列,用于保存第一线程的预测路径和未预测路径的指令以及来自第二线程的指令。根据线程的优先级和/或根据正在执行的线程数目,选择电路可用来从三倍宽度的指令队列中的任一延迟队列路径中选择。例如,来自较高优先级线程的有效指令可以从三倍宽度的指令队列中执行。作为选择,来自未被停顿的线程的有效指令可以从三倍宽度的指令队列发布。
在本发明的一个实施例中,只有当条件分支指令是不可预测的或者仅仅部分可预测时,才使用双重指令队列1900来保留预测和未预测路径。当条件分支指令是可预测的时,所述预测路径可以被保存在双重指令队列1900的一个路径中,而例如来自另一线程的其它指令可以被保存在双重指令队列1900的另一个路径中,并且例如当另一个线程停顿时被发布。
在某些情况下,如上所述,可以把多个双重指令队列1900用于多个延迟的执行流水线(例如,P1、P2等等)。作为选择,所述双重指令队列可以被用于单个执行流水线,例如最大延迟的执行流水线。在一个实施例中,当使用了多个双重指令队列1900时,可以确定哪个双重指令队列1900应被用于执行条件分支指令。例如,如果条件分支指令包含长相关性,使得条件分支指令的结果因处理器周期数目延长而无法确定,那么最大延迟的双重指令队列可以用来延迟条件分支指令路径的指令。
依照可预测性执行分支指令
在某些情况下,如上所述的每个方法和电路都可用于执行条件分支指令。作为选择,在本发明的一个实施例中,可以计算条件分支指令的可预测性水平。根据计算出的条件分支指令的可预测性水平,可以使用多种方法之一来执行条件分支指令。例如,可以确定条件分支指令是完全可预测的、部分可预测的还是不可预测的。根据可预测性水平,可以选择条件分支指令的执行方法。通过依照其可预测性来选择执行条件分支指令的方法,处理器110的总体资源使用率得以最大化,同时使处理器110的低效率最小化。
图17A-B依照本发明一个实施例描述了用于根据条件分支指令的可预测性来执行条件分支指令的方法1700。方法1700可以从步骤1702(图17A)开始,其中接收将执行的一组指令。在步骤1704,可以确定该组指令是否包含条件分支指令。如果该组指令包含条件分支指令,那么在步骤1706确定所述分支是否是本地完全可预测的。这种确定例如可以通过确定本地分支历史计数器CNT是否大于或等于本地分支可预测性的阈值来进行。如果所述分支是本地完全可预测的,那么在步骤1408,可以使用本地分支预测来调度并且执行条件分支指令和后续指令。
在步骤1710,如果所述分支不是本地完全可预测的,那么可以跟踪并且存储全局分支预测信息。然后,在步骤1712,可以确定分支指 令是否是全局完全可预测的。这种确定例如可以通过确定全局分支历史计数器GBCNT是否大于或等于全局分支可预测性阈值来进行。如果所述分支是全局完全可预测的,那么在步骤1714,可以使用全局分支预测来调度并且执行条件分支指令和后续指令。当条件分支指令是本地或者全局完全可预测的时,通过使用分支预测,在某些情况下,处理器110可以避免使用执行条件分支指令的预解析、预测性发布或者双重路径发布所需的资源。
如果确定所述分支既不是本地又不是全局完全可预测的,那么在步骤1720,确定条件分支指令是否是可预先解析的。如果条件分支指令是可预先解析的,那么在步骤1722,所述条件分支指令可以被预解析,并且所述条件分支指令和后续指令可以根据条件分支指令的已预解析路径(例如,采用或未采用)被调度、发布并且执行。在一个实施例中,通过使用预解析,处理器110可以避免利用条件分支指令的预测性发布或者双重路径发布,在某些情况下,这会造成执行指令的结果被丢弃并且由此降低处理器的效率。
如果条件分支指令不是可预先解析的,那么在步骤1730(图174B),可以确定条件分支指令是否为可使用预测性发布来执行的短的、条件分支指令。这种确定可以包括确定指令相关性是否妨碍预测性发布,和/或确定双重发布是否比预测性发布更加有效。如果确定出条件分支指令是可使用预测性发布执行的短的、条件分支指令,那么在步骤1732,可以如上所述那样使用预测性发布来发布并且执行短的、条件分支指令。
如果确定预测性发布无法使用,那么在步骤1740,可以缓冲条件分支指令的两个路径。通过缓冲条件分支指令的两个路径,如果处理器110稍后错误预测了条件分支指令的结果,那么稍后可以进行更加迅速的恢复(例如,如果分支指令的结果被错误预测,那么分支指令的另一路径易于获得以便执行)。此外,通过缓冲条件分支指令的两个路径,如果合适,可以执行双重发布。
在步骤1742,可以确定条件分支指令是否是中度可预测的。这种 确定可以包括确定本地分支历史计数器CNT是否超出中度本地可预测性的阈值,和/或确定全局分支历史计数器GBCNT是否超出中度全局可预测性的阈值。如果确定所述条件分支指令是中度可预测的,那么在步骤1744,分支指令的预测路径可以从I-缓冲器232被发布并且执行。如上所述,如果稍后确定预测路径后面没有跟着条件分支指令,那么通过发布并且执行分支指令的未预测、已缓冲路径,可以进行迅速的恢复。如果指令的结果表明所述预测是错误的,并且指令的未预测路径被遵循,那么通过缓冲但不执行分支指令的未预测路径,处理器110可以迅速地恢复并且发布分支指令的未预测路径。
如果确定条件分支指令既不是本地又不是全局中度可预测的(例如,所述分支是不可预测的),那么在步骤1750,可以确定条件分支指令是否可以采用双重路径执行方式来执行。这种确定例如可以包括确定处理器110中的另一线程是否被停止(由此允许两个路径将在独立的线程中被发布),确定条件分支指令的分支距离,确定每个分支路径的指令相关性,和/或如上针对双重路径执行所述的任何其它事项。
如果确定条件分支指令可使用双重路径发布来执行,那么在步骤1754,可以如上所述那样使用双重路径发布来发布并且执行所述条件分支指令。然而,如果确定条件分支指令不可以使用双重路径发布来执行,那么可以使用对条件分支指令的最佳预测来调度、发布并且执行分支指令和后续指令。所述最佳预测例如可以包括根据哪种类型的预测更加可靠来使用本地或者全局预测(例如,如果GBCNT大于或等于CNT,那么可以使用全局预测而不是本地预测来执行分支指令)。然后可以在步骤1760结束方法1700。
维护和更新分支预测信息
在本发明的一个实施例中,在执行指令的同时,分支预测信息和/或其它信息可以被连续地跟踪和更新,使得当执行给定指令集时,所述分支预测信息以及其它所存储的值可以随时间而改变。由此,例如 当执行程序时,所述分支预测信息可以被动态地修改。
在本发明的一个实施例中,在指令集的初始执行阶段期间(例如,在执行程序的初始“训练”期间)可以存储分支预测信息和/或其它信息。所述初始执行阶段还可以被称为初始化阶段或者训练阶段。在训练阶段期间,例如可以依照如上所述的标准来跟踪并且存储分支预测信息(例如,在包含指令的I-行中或者在影子高速缓存中)。
在一个实施例中,可以使用一个或多个位(例如存储在包含分支指令的I-行中或者在全局分支历史表中)来表明指令是否正在训练阶段中执行或者处理器110是否处于训练阶段模式。例如,在训练阶段期间,处理器110中的模式位可以被清除。当所述位被清除时,可以如上所述那样来跟踪并且更新分支预测信息。当训练阶段完成时,所述位可以被设置。当所述位被设置时,所述分支预测信息不再被更新并且训练阶段完成。
在一个实施例中,训练阶段可以在特定的时间段内继续(例如,直到已经过去了若干时钟周期为止,或者直到给定指令已经被执行若干为止)。在一个实施例中,当特定时间段过去并且退出训练阶段时,可以仍存储最近存储的分支预测信息。此外,在一个实施例中,所述训练阶段可以继续直到给定I-行已经被执行了阈值次数为止。例如,当从给定级别的高速缓存中(例如,从主存储器102、L3高速缓存或者L2高速缓存112)取出I-行时,I-行中的计数器(例如,两位或者三位计数器)可以被重置为零。当计数器低于I-行执行的阈值次数时,对I-行中的指令的训练阶段可以继续。在每次执行I-行之后,计数器可以被递增。在达到I-行执行的阈值次数之后,对I-行中的指令的训练阶段可以停止。此外,在某些情况下,根据正被执行的I-行中的指令,可以使用不同的阈值(例如,对于结果在较大程度上发生改变的指令可以使用更多的训练)。
在本发明的另一个实施例中,所述训练阶段可以继续,直到一个或多个退出标准得以满足为止。例如,所述初始执行阶段可以继续,直到分支指令变为可预测的为止。当分支指令的结果变为可预测的时, 可以在I-行中设置锁定位,所述锁定位表明初始训练阶段完成,并且强烈可预测的分支指令的分支历史位可用于分支指令的后续执行。
在本发明的另一个实施例中,可以在间歇训练阶段中修改所述分支预测信息。例如,可以存储每个训练阶段的频率和期限值。每当对应于该频率的多个时钟周期过去时,训练阶段可以被启动并且在规定的期限值内可以继续。在另一个实施例中,每当对应于该频率的多个时钟周期已经过去时,所述训练阶段可以被启动并且继续,直到规定的阈值条件得以满足为止(例如,直到到达指令的规定的可预测性水平为止,如上所述)。
虽然上文在某些情况下针对级联、延迟的执行流水线单元中的指令执行进行了描述,但是本发明的实施例可广泛用于任何处理器,包括不利用延迟执行流水线的处理器。虽然上文是针对本发明的实施例,但是在不脱离本发明的基本范围的情况下,可以设计出其它和进一步的实施例,本发明的范围由随后的权利要求书来确定。