错误推测之后的指令再执行的管道外部跟踪缓冲器的制作方法

文档序号:6415995阅读:295来源:国知局
专利名称:错误推测之后的指令再执行的管道外部跟踪缓冲器的制作方法
技术领域
本发明涉及处理器,更具体来说,涉及具有一个或多个跟踪缓冲器的处理器。
当前的超标量处理器,如微处理器,执行诸如转移预测和无序执行的技术,以增强效能。具有无序执行管道的处理器执行某些指令时,执行的次序不同于指令被提取和解码的次序。对于没有从属对象(dependencies)的指令来说,指令可以无序地执行。无序执行由于防止了执行单元仅仅因为程序指令的顺序就闲置,因而提高了处理器的效能。指令结果是在执行之后重新排序的。
通过限制指令解码要顺序进行,简化了处理数据从属对象的任务。处理器然后就可以确定数据如何通过寄存器从一条指令流到后继指令。为确保程序的正确性,寄存器要被重命名,指令要在备用站(reservation stations)中一直等到它们的输入操作数的生成,这时指令才被发往适当的功能单元去执行。寄存器重命名器(renamer)、备用站以及有关机构,将具有从属对象的指令连接在一起,使得从属指令不在其所从属的指令之前执行。相应地,这种处理器受到顺序提取和解码的限制。
当来自指令高速缓存的指令缺失,或者某个转移被误预测(mis-predicted)时,处理器只得等待,要么等到从更高层的高速缓存或存储器提取了指令块,要么等到误预测的转移被还原,错误路径的执行被复位。这种过程的结果是,在指令高速缓存缺失和误预测转移之前和之后的独立指令不能被并行地执行-尽管这样做是正确的。
已经采用了存储器顺序缓冲器以排序加载和存储。处理器中需要有改进的机制让处理器从推测错误中恢复。
在本发明的一个实施例中,处理器包括一个执行指令的执行管道,其中至少有些指令是推测性地执行的。处理器也包括一个位于执行管道外部的跟踪缓冲器,用于保存指令,其中,跟踪缓冲器中与推测错误相关联的指令要在执行管道中再执行(replay)。
在另一个实施例中,处理器包括一个执行指令的执行管道,其中至少有些指令是推测性地执行的。处理器也包括一个位于执行管道外部的跟踪缓冲器,用于保存指令和指令执行的结果,其中,至少有些指令要在管道中执行之后受初始弃置(initial retirement)处理,但是一直保留在跟踪缓冲器中,直到最终弃置。
从下面展开的详细说明和本发明实施例的各附图中将能更全面地了解本发明,不过,这些说明和附图不应被用来将本发明限定于所说明的特定实施例,相反,它们只是为了方便对本发明解释和理解。


图1是一个处理器实施例中某些部件的高级框图表示。
图2是按照本发明一个实施例的处理器的框图。
图3是按照本发明另一个实施例的处理器的框图。
图4是一个二线程的例子的流程图。
图5是另一个二线程的例子的流程图。
图6是一个四线程的例子的流程图。
图7是表示图6的线程的重叠执行的示意图。
图8是表示按照本发明一个实施例的各个跟踪缓冲器的框图。
图9表示一个指示在两个时刻的程序和弃置顺序的阵列。
图10是图8的一个跟踪缓冲器实施例中的某些部件的框图表示。
图11是图8的另一个跟踪缓冲器实施例中的某些部件的框图表示。
图12是图10的跟踪缓冲器的指令队列阵列的一个实施例的一部分的图形表示。
图13是图10的跟踪缓冲器的数据与从属对象阵列的一个实施例的一部分的图形表示。
图14是表示修改量寄存器(modifier registers)的一个实施例和在创建图10的阵列的从属字段(dependency field)中所使用的一种修改后的寄存器(modified register)。
图15在创建图13的阵列的从属字段中所使用的一种逻辑“或”门。
图16是表示用于创建图13的阵列的从属字段的操作的一个实施例的流程图。
图17是按照本发明实施例的、某特定寄存器和跟踪缓冲器中上有从属对象的位置的图形表示。
图18是图10的跟踪缓冲器的输出寄存器堆的一个实施例的一部分的图形表示。
图19是图10的跟踪缓冲器的输入寄存器堆的一个实施例的一部分的图形表示。
图20是按照本发明实施例的、与图18的输出寄存器堆和图19的输入寄存器堆联合使用的比较器和再执行触发逻辑(replay triggering logic)的框图。
图21是表示输出寄存器堆的内容可以被使用的程序位置的流程图。
图22是表示按照本发明实施例、位于图2的存储器顺序缓冲器(MOB)内的各个MOB的框图。
图23是图22的MOD的存储缓冲器(store buffer)的一个实施例的局部图示。
图24是图22的MOD的加载缓冲器(load buffer)的一个实施例的局部图示。
图25表示一个比较加载和存储指令的地址的比较器。
图26表示一个比较加载和存储指令的地址的比较器。
图27是按照本发明实施例的MOB控制电路和存储缓冲器的框图表示。
图28是按照本发明实施例的MOB控制电路和加载缓冲器的框图表示。
图29是一个六线程的例子的流程图。
图30是一个树,表示在时刻t1时图29的线程中的关系。
图31是一个树,表示在假定线程T4在线程T1弃置之前复位的情况下,在时刻t2时图29的线程中的关系。
图32是一个树,表示在假定线程T1在线程T4复位之前弃置的情况下,在时刻t2时图29的线程中的关系。
图33是一个树,表示在时刻t3时图29的线程中的关系。
图34是表示一个五线程的例子的框图。
图35是一个树,表示在时刻t1时图34的线程中的关系。
图36是一个树,表示在时刻t2时图34的线程中的关系。
图37是按照替代图2的实施例的另一个实施例的处理器的框图表示。
图38是一个包括图2的处理器的计算机系统。
最佳实施例的详细说明A.线程的创建和管道108概述B.关于跟踪缓冲器114的详细说明1.跟踪缓冲器114Aa.指令队列阵列202Ab.DAD阵列206A和从属生成电路212Ac.输出寄存器堆210A和输入寄存器堆208A2.跟踪缓冲器114’C.一个再执行顺序算法D.二级或最终弃置E.存储系统1.存储缓冲器和加载缓冲器2.加载和存储地址的比较a.加载指令的执行b.存储指令的执行c.复位3.存储指令的再执行4.多个加载指令的再执行5.加载和存储指令的最终弃置F.关于线程管理逻辑和最终弃置逻辑的其它信息G.一个没有多线程操作(multithreading)的实施例H.其它信息和实施例图1表示处理器10的某些部件。处理器10包括执行管道12和跟踪缓冲器14,后者位于执行管道12之外。执行管道12可包括存储器顺序缓冲器。导线18上的指令被提供到执行管道12去执行。指令也通过导线22被提供到跟踪缓冲器14。在执行管道12中,可以推测性地执行指令。推测的例子包括数据推测(data speculation)和从属性推测(dependency speculation)。可以广泛使用各种推测。处理器10包括有检测推测错误(误推测)和从错误推测恢复的机制(包括跟踪缓冲器14)。
当检测到误推测时,就将误推测指令从跟踪缓冲器14通过导线24提供到执行管道12,并在执行管道12中再执行。如果某指令“被再执行”,则该指令和从属于该指令的所有指令要被重新执行,不过未必同时执行。如果某指令“被完全再执行”,则该指令和按程序顺序来说位于该指令之后的所有指令要被重新执行。程序顺序是指令在顺序处理器中执行时应有的顺序。指令可以完全地按程序顺序通过导线18,也可以不按程序顺序。处理器10可以是一个有序或无序处理器。从属指令的重新执行,会产生依赖于正在被再执行的从属指令的指令。通过控制触发再执行的事件,能控制指令重新执行的次数。一般来说,执行一词的含义包括原始执行和重新执行。至少将一部分指令的结果通过导线26提供到跟踪缓冲器。最终弃置逻辑34在确定指令的原始执行正确或重新执行正确时,就弃置跟踪缓冲器14中的这种指令。
执行管道12可以是各种各样的执行管道中的任何一种,可以是更大型管道的一部分。执行管道12可以用于各种各样的处理器。图2中所示的例子,表示具有执行管道108的处理器50的各种部件,图3中所示的例子,表示具有执行管道308的处理器100。在图2的本发明一个实施例中,执行管道108包括寄存器重命名。在另一个实施例中,执行管道不包括寄存器重命名。处理器可以并发地处理多个线程(如图2中的处理器50那样),或者不同时地处理多个线程(如图3中的处理器100那样)。首先将讨论处理器50。
本说明书中提及的“一个实施例”或“实施例”,指的是结合该实施例所述的特定特点、结构或特征,被本发明的至少一个实施例涵盖。本说明书中各处出现的“在一个实施例中”,不一定都指同一个实施例。
A.线程的创建和管道108概述通过导线102将指令提供到指令高速缓存(I-高速缓存)104。图中显示的解码器106从I-高速缓存接受指令,但是解码器也可以在指令到达I-高速缓存之前就解码指令。视所选择的环境和具体实现的不同,“指令”一词可以包括宏操作(macro-op)、微操作(uops)或者某个其它形式的指令。有各种各样的指令集可以使用,它们包括-但不限于-精简指令集计算(RISC)或复杂指令集计算(CISC)指令。此外,解码器106也可以将CISC指令译解成RISC指令。I-高速缓存104中的指令,通过MUX110提供到管道108,通过导线118提供到跟踪缓冲器114。
跟踪(trace)是一个指令集。线程包括跟踪和有关信号,诸如寄存器值和程序计数器值。
线程管理逻辑124由I-高速缓存104中的程序或过程创建不同的线程,方法是通过导线130向程序计数器112A、112B、…112X提供起始计数(其中X代表程序计数器的个数)。例如,X可以是4,或者大于4或小于4。线程管理逻辑124能通过停止相关的程序计数器来结束线程。线程管理逻辑124可以使程序计数器再开始另一个线程。不同线程的各部分是并发地从I-高速缓存104读取的。
为了确定在程序或过程中的何处创建线程,线程管理逻辑124可通过导线128从解码器106读取指令。线程可以包括由程序员或编译程序插入的、明确地划定了线程的起始和终结界限的指令。另外,线程管理逻辑124也可以分析程序或过程的指令,把向I-高速缓存124提供的程序或过程分解成不同的线程。例如,转移、循环、后向转移、返回、跳转、过程调用和函数调用都是分割线程的好位置。线程管理逻辑124会考虑潜在线程的长度、使用多少变量、连续的线程之间公用的变量的个数、以及涉及从何处开始线程的其它因素。线程管理逻辑124在确定线程的边界时,会考虑程序顺序。程序顺序是线程和线程内部的指令在顺序处理器中执行时应有的顺序。线程内部的指令可以无序地执行(与程序顺序相反)。线程可以由管道108作基本上独立的处理。线程管理逻辑124可以包括一个包含历史表在内的预测机构,以避免作出次于最优的选择。例如,线程管理逻辑124可能在创建一个线程后确定该线程原来实际上并非程序顺序的一部分。在这种情况下,如果再次遇到同样的程序代码,就可以用该预测机构来决定是否还要创建同样的线程。线程管理逻辑124可以将线程的动态创建与对编译程序或程序员明确的指令提示的使用组合起来使用,来确定在指令中的什么位置创建线程。
动态创建线程是由并非特地为多线程操作编写或编译的程序来创建线程,其中线程中至少有一个从属于线程的另一个。程序可能起源于一个包含执行管道108和线程管理逻辑124的芯片。动态创建线程、执行线程、检测并更正执行中的推测错误,统称为动态多线程操作。
图4表示一个包含一条条件后向转移指令的线程T1。按照程序顺序,线程T2是在该条件后向转移指令之后执行的。按照时间顺序,当线程T1第一次到达该条件后向转移指令时,线程T2就被推测性地开始执行。因此,线程T1和T2有的部分是并行执行的。如果线程T2牵涉到误推测,则线程T2受影响的指令就要再执行。
线程管理逻辑124可通过导线130监测程序计数器的计数值。监测计数值的目的是确定某线程何时要结束。例如,当不满足条件转移的条件时,要是允许线程T1的程序计数器继续的话,它就会前进到线程T2的第一条指令。所以,当条件不满足时,线程管理逻辑124就停止线程T1的程序计数器。
图5表示一个包含一条函数调用指令的线程T1。按照程序顺序,当到达该调用指令时,程序计数器就跳转到该函数的位置并执行到一条返回指令,此时,程序计数器返回到该调用之后的指令。按照程序顺序,线程T2是从该返回之后的指令开始执行的。按照时间顺序,当线程T1第一次到达该调用时,线程T2就被推测性地开始执行。如果线程T2牵涉到误推测,则线程T2受影响的指令就要再执行。线程T1在其程序计数器到达线程T2的第一条指令时结束。图5中的Load MX和Store MX指令将在下文讨论。
图6表示的线程T1、T2、T3和T4是一个程序段落的一部分。不同的程序计数器产生了线程T1、T2、T3和T4。线程T1包含的指令,先是达到点A(函数调用指令),然后从点B到点C(条件后向转移指令)、到点D、再到点C(该循环可能要重复若干次)。线程T2的起始指令,按照程序顺序来说,紧接着在点A调用的函数的返回指令。线程T3的起始指令,按照程序顺序来说,紧接着点C的条件后向转移,该线程继续到点E、到点F、到点G、到点H、到点I,点I是一条返回指令,返回到线程T2紧接着点A后开始的指令。线程T4的起始指令,按照程序顺序来说,紧接着点E的条件后向转移。
如图7中所示,线程T1、T2、T3和T4有的部分是并行地取指令、解码和执行的。线程的取指令、解码和执行之所以无序,是因为不遵循程序顺序。按照时间顺序,线程T2、T3和T4分别是紧接着位于点A、C和E的指令执行的。纵向的短划线表示一种父子关系。线程T2、T3和T4是依赖寄存器和/或存储器位置中的数据推测性地被执行的,执行之前并不肯定这些数据是正确的。处理器100具有检测误推测并使误推测的指令再执行的机构。事实上线程T4不是程序顺序的一部分。可以执行线程T4,直到线程管理逻辑124确定线程T4不是程序顺序的一部分。此时,可以将线程T4复位,将处理器100中在处理线程T4时占用的资源释放,然后分配给另一个线程。按照程序顺序,线程T1、T2和T3要以下列次序执行首先是线程T1、其次是线程T3,最后是线程T2。
参看图2,来自MUX100的指令被重命名/分配单元150接收,后者提供寄存器堆152中被重命名的物理寄存器的物理寄存器标识(PRID)。该RPID通过旁路导线126被提供给跟踪缓冲器114。分配涉及到将寄存器分配给指令并分配调度/发布单元156的备用站的条目。一旦备用站中的特定指令的操作数准备就绪,该指令就被发往执行单元158的一个执行单元(例如整数、浮点),或者发往一个存储器执行管道-后者包括地址生成单元(AGU)172、存储器顺序缓冲器(MOB)178和数据高速缓存176。根据指令,可以通过导线168从寄存器堆提供操作数。按照本发明的一个实施例,可以这样连接线程内的从属指令,使得它们不按顺序执行。然而,不同线程中会同时有从属指令被无序地取指令、解码和执行。某些线程的执行可能是推测性的。
为了提高性能,将备用站和有关机构设计得使指令的发送具有低延迟和高带宽。对延迟和带宽的要求限制了能在备用站中等待的指令的个数。通过在管道108外设置跟踪缓冲器114,就能有大量的指令可供执行/再执行,而又不会显著降低管道108的通量。通过管道操作,能减少执行管道108与跟踪缓冲器114之间延迟的影响。
执行的结果和相关信息,从写回单元162通过导线122(就寄存器来说)以及通过MUX192和导线196,被写到跟踪缓冲器114。结果和相关信息也可以被写到寄存器堆152和相关的重定序寄存器(ROB--re-order register)164。就管道108而言,一旦某指令的结果和相关信息被写到寄存器堆152和ROB164,该指令就依次地被弃置。这种弃置被称为第一级或初始弃置。在第一级弃置时或第一级弃置之前,要释放调度/发布单元156中该被弃置指令使用的资源,包括备用站、寄存器堆152和ROB164。然而,有关该指令的所有需要的详细信息要保留在跟踪缓冲器114和MOB178中,一直到最终弃置-下文将作说明。
如果按照程序顺序,在较晚的线程中使用的数据是在较早的线程中产生的,那么在较晚的线程与较早的线程之间就存在着从属性。数据可能是在较早的线程中通过一条存储器或非存储器指令产生的。例如,如果较晚的线程中的某加载指令(load instruction)与较早的线程中的某存储指令(store instruction)有相同的地址,则较晚的线程从属于较早的线程。如果较晚的线程中的某指令使用一个在较早的线程中修改过的寄存器,则较晚的线程也从属于较早的线程。同样,如果按照程序顺序,较晚的指令使用由较早的指令产生的数据,则较晚的指令从属于较早的指令。“从属性”一词也用在“从属性推测”这个短语中。从属性推测的例子是,推测某加载指令与某较早的存储指令之间没有从属性。地址匹配(addressmatching)是检查从属性推测错误的技术的一个例子。数据推测的例子是,推测某寄存器中的数据是正确数据。寄存器匹配(registermatching)是检查数据推测错误技术的一个例子。
B.关于跟踪缓冲器114的详细说明参看图8,跟踪存储器114包括跟踪缓冲器114A、114B、114C、…、114Y,其中Y代表跟踪缓冲器的个数。例如,如果Y=4(即Y=D),则有4个跟踪缓冲器。如果Y小于3,则跟踪缓冲器114就不是包含图8中所示的全部跟踪缓冲器。Y可以等于X,也可以与X不同(X是程序计数器个数)。跟踪缓冲器114可以是划分成各个跟踪缓冲器的一个单一存储器,或者是物理上分离的跟踪缓冲器,或者是这二者的组合。
参看图9,在一个实施例中,线程管理逻辑124包括一个由线程标识(ID)组成的规定了程序顺序(也是弃置顺序)的阵列198。在该例中,每个跟踪缓冲器都有一个独有的线程标识符或者向线程标识符的一对一的映射。例如,跟踪缓冲器114A被赋予线程标识符1,跟踪缓冲器114B被赋予线程标识符2,等等。线程标识符可以是硬连线的或者是程序设置的。在一个实施例中,每个程序计数器都与一个特定的线程标识符和跟踪缓冲器相关联。(另外,也可以没有这种限制关系)。
图9表示的是线程在时刻t1和时刻t2的弃置顺序的一个例子。该例中,只有四个跟踪缓冲器和四个线程标识符。相关的线程号在括号中表示。根据具体的实现,括号中的线程号实际上并不包含在阵列198中。在时刻t1,程序和弃置顺序是线程T1、T3、T2和T4--如同图6的例子中的一样。在时刻t1与t2之间,确定线程T4不在程序顺序中。因此,将线程T4复位,在跟踪缓冲器114D中为线程T5(图中未予示出)腾出空间。将线程T5与线程标识符4关联。线程T1弃置,在跟踪缓冲器114A中为线程T6腾出空间。将线程T6与线程标识符1关联。在时刻t2,程序和弃置顺序是线程T3、T2、T5和T6(如果线程T1是在线程T4复位之前弃置的,则线程T5和T6就应当有不同的线程标识符,但程序和弃置顺序则不改变)。根据所使用的算法,有可能线程T2一开始在阵列198中位于线程T3之前,但是程序和弃置顺序应当更正过来--如时刻t1时的阵列198一样。
前文说过,线程的程序顺序是线程在顺序处理器上执行时的顺序。指令的程序顺序是指令在顺序处理器上执行时的顺序。线程管理逻辑124不必在一开始就为线程确定真正的程序顺序。然而,线程管理逻辑124终归要确定真正的程序顺序。
参看图7,跟踪缓冲器114A、114B、…、114Y通过与导线118相连的导线118A、118B、…118Y接收指令。在导线118A、118B、…118Y与导线118之间可以有多路分解电路。或者,也可以用选通信号来控制激活哪个跟踪缓冲器。再者,也可以有足够的并行导线来处理并行的事务处理。跟踪缓冲器114A、114B、…、114Y通过与导线120相连的导线120A、1208B、…120Y,向管道108提供指令和用于再执行的相关信息。注意到可以有多个指令从跟踪缓冲器114并行地通过导线120和MUX110去重新执行。与此同时,可以有多条指令首次从解码器106通过MUX110。有一个线程标识符和一个指令标识符伴随每个指令通过管道。伴随指令的还可以有一个再执行计数值。就加载荷存储指令来说,伴随指令的也可以有一个加载缓冲器标识符(LBID)和一个存储缓冲器标识符(SBID)。在一个实施例中,LBID和SBID伴随每个指令,虽然当指令不是加载(load)或存储(store)时LBID和SBID的值可能没有意义。如下文所述的那样,一个PRID或值也可以伴随一条被重新执行的指令。
跟踪缓冲器114A、114B、…、114Y通过与导线126相连的旁路导线126A、126B、…、126Y从重命名/分配单元150接收PRID、LBID和SBID值。跟踪缓冲器114A、114B、…、114Y通过与导线122相连的导线122A、122B、…、122Y,以及通过与导线196相连的导线196A、196B、…、196Y,接收写回结果信息以及相关信号。再执行信号是通过与导线194相连的导线194A、194B、…、194Y提供的。在导线120、126、122、194和196中可以使用多路转换和/或选通电路和/或相当数量的并行导线。各跟踪缓冲器可以完全相同,也可以有所不同。
在图10中的跟踪缓冲器114A,表示的是跟踪缓冲器的第一个实施例。在图11中的跟踪缓冲器114A’,表示的是跟踪缓冲器的第二个实施例。跟踪缓冲器的其它实施例可能包括跟踪缓冲器114A和114A’的变化形式,也可能包括有相当差异的结构。
1. 跟踪缓冲器114A参看图10,跟踪缓冲器114A包括一个指令队列阵列202A、一个数据与从属对象(DAD)阵列206A、一个输入寄存器堆208A、一个输出寄存器堆210A、从属对象生成电路212A和控制电路224A。“阵列”一词广义上包括在多个方向上的信息,没有对特定形式的限制。
a. 指令队列阵列202A以下结合图12,说明按照本发明一个实施例的指令队列阵列202A的结构及其与其它部件的交互作用。指令队列阵列202A接收从I-高速缓存提取的、作为某特定线程的一部分的指令。线程内部的指令是按照顺序提取并写入指令队列阵列202A的。作为另一个线程的一部分的指令,要写入不同跟踪缓冲器的指令队列,或是在不同的时间写入指令队列阵列202A。指令队列阵列202A包含对应每个指令标识符的各种信息字段。不同实施例可能包含有些不同的字段和不同的行数。在指令队列阵列202A这个实施例中,没有考虑程序计数器值,但在其它实施例中可能会考虑。指令队列阵列202A和附图中表示的所有其它部件,包含未予示出的各种字段、信号和结构。这些字段、信号和结构之所以未予示出,是因为它们是随具体实现的不同而不同的,本领域的熟练人员理解,它们会使本说明书复杂化,会影响阐明本发明的实质。
指令要在跟踪缓冲器114A中一直等待到它们被最终弃置或丢弃(原因例如是,确定该线程不是程序的顺序执行的一部分)。如果指令队列阵列202A内容已满,而在跟踪指令集中还有尚未执行的指令,则跟踪缓冲器114或重命名/分配单元150就不接收这种指令一直到有指令从指令队列阵列202A弃置并有一行被释放。通过移动首部和尾部指针,可以对系统100中各种阵列的条目进行分配和释放。
对指令队列阵列202A的说明,结合了以下各行代码I0mul R1,R2→R1I1mul R3,R4→R2I2add R1,R2→R1I3add 10,R1→R4I4store R2→MxI5store R1→My这些代码是某线程内的前6条指令。显然,按照程序顺序,某个不是跟踪缓冲器114A的跟踪缓冲器,要早于跟踪缓冲器114A。
“操作码”字段含有特定指令相关的操作码。“目的地”、“源1”和“源2”字段,标识指令的目的地、源1和源2。“源1的索引”字段标识包含源的跟踪缓冲器114A内的指令项。例如,指令标识符0的目的地被用作指令标识符2的源1。所以将0放置在指令标识符2的“源1的索引”字段。指令标识符2的目的地被用作指令标识符3的源2。所以将2放置在指令标识符3的“源2的索引”字段。X表示无所谓。
“有效1”和“有效2”字段是数个位,当某指令标识符的对应源操作数以前已经被跟踪缓冲器114中的线程外部的指令产生时,数位被设置成第一值(例如逻辑0),当某指令标识符的对应源操作数以前已经被线程内部的指令产生时,数位被设置成第二值(例如逻辑1)。指令标识符0的源1(R1)是在指令队列阵列202A中的跟踪指令集的外部产生的。相应地,指令标识符0的有效1是逻辑0。指令标识符3的源2来自指令标识符2的目的地。相应地,指令标识符3的有效2是逻辑1。
指令I3要将R1加上常数“10”。该常数可以与指令存储在一起,可以存储在某个专用寄存器(未予示出)中,存储在源1字段中,或是通过其它某种机构存储。图2中显示,指令标识符3的源1字段中是X(无所谓)。或者也可在源1字段中放置某种标志符。
存储缓冲器标识符(SBID)字段保存一个与存储缓冲器中的存储(store)指令相关联的SBID,这将在下文作说明。加载缓冲器标识符(LBID)字段保存一个与加载缓冲器中的加载(load)指令相关联的LBID项,这将在下文作说明。SBID和LBID的值由重命名/分配单元l50分配,并通过旁路导线126被写到指令队列阵列。指令队列阵列202A中可以包含一个线程标识号字段,但是并不需要有线程标识号字段,因为它是隐含的。
b.DAD阵列206A和从属生成电路212A参看图13,一个DAD阵列206A实施例中包括与指令队列阵列202A的各指令标识符项形成一一对应关系的各“指令标识符”项(行)。指令队列阵列202A与DAD阵列206A确实也可以是同一个阵列的不同部分。然而,在有些实施例中,有不同的读取端口与指令队列阵列202A和DAD阵列206A相关联。
DAD阵列206A包含一个“值或PRID”字段,它含有某指令生成的值或者寄存器堆152中的PRID。值是通过写回单元162和写回总线122和196从执行单元被写回到跟踪缓冲器114A的。一个占两位的“状态”字段,指示“值或PRID”字段中含有的是一个“值”还是“PRID”。在一个实施例中,“值或PRID”字段中有可能既不合“值”也不合“PRID”。“再执行计数”字段能唯一地标识一次指令发送,每当具有相同指令标识符的指令在管道108中被再执行时,它就递增。按照一个实施例,指令有可能在管道108中被同时再执行一次以上。在这种情况下,按照一个实施例,只将最高“再执行计数”的相关信息写回到DAD阵列206A。
“从属字段”中的各位对应每个逻辑寄存器。为简明起见,图13中只表示了4个逻辑寄存器(R1、R2、R3和R4)。然而,这个数字可以更大。在该例中,当从属字段项被设置为1时,指示在跟踪指令集和指令项的输入值之间存在一个数据从属链和如果没有从属为零。从属字段项确定的是,如果收到输入值(例如检测到值误推测时),跟踪指令集中的哪个指令需要得到执行。
随着指令被提取、解码并写入跟踪缓冲器114A,从属位被顺序计算,并写入DAD阵列206A。从属位可以在确定是否再执行某指令之前就生成。图13中的从属位对应于在上文的B.1.a一节中引用的6条指令I0-I5。
从属字段可以通过机械方法(mechanical approach)来创建。在描述这种方法之前,将在更直觉的知识层次解释这种创建。
ⅰ.直觉知识层次指令I0的结果只依赖寄存器R1和R2。所以,在指令标识符0(该行保存指令I0的相关信息)的R1和R2列中放置1,R3和R4列中依然是0。
指令I1的结果只依赖寄存器R3和R4。所以,在指令标识符1的R1和R2列中放置0,在R3和R4列中放置1。
指令I2的结果直接依赖分别在指令I0和I1中生成的寄存器R1和R2的内容。在指令I0中,R1依赖在跟踪指令集开始时的R1和R2的值。在指令I2中,R2依赖在跟踪指令集开始时的R3和R4的值。所以,指令I2间接地依赖在跟踪指令集开始时的R1-R4的值,于是在指令标识符2的R1-R4各列中放置1。
指令I3的结果直接依赖在指令I2中生成的寄存器R1的内容。所以,指令I3间接地依赖在跟踪指令集开始时的R1-R4的值一因为I2依赖这些值,于是在指令标识符3的R1-R4各列中放置1。
指令I4的结果直接依赖在指令I1中生成的寄存器R2的内容。R2则依赖在跟踪指令集开始时的R3和R4的值。所以在指令标识符4的R1和R2列中放置0,在R3和R4列中放置1。
指令I5的结果直接依赖在指令I2中生成的寄存器R1的内容,而I2则依赖在跟踪指令集开始时的R1-R4的值。所以在指令标识符4的R1-R4各列中放置1。
ⅱ.一种机械方法以下是可用于按照本发明一个实施例生成从属字段的寄存器和算法。参看图14,从属对象生成电路(dependency generation circuitry)212A含有对应每个逻辑寄存器的临时寄存器230、232、234和236,外加寄存器240。临时寄存器230、232、234和236含有逻辑寄存器R1、R2、R3和R4的修改量(modifiers)。修改寄存器(modified register)240含有的各个位,指示哪个逻辑寄存器要被某跟踪指令集(trace)中的指令修改。每当有新指令写入跟踪缓冲器时,寄存器230、232、234、236和240就被更新。寄存器之间的边界有点任意。例如,它们可以都在一个组合寄存器中。
为各逻辑寄存器提供一个跟踪缓冲器地址寄存器,它指向跟踪缓冲器114A修改该逻辑寄存器的最后指令。各修改位(modified bits)及最后修改量地址(last modifier addresses),被用于计算下一条要写入跟踪缓冲器114A的指令的从属位。
注意,在本文中,修改寄存器只是指将某个值写入寄存器。这并不一定指寄存器的内容由于指令的结果而改变。例如,如果将R1和R2的内容相乘(如指令I0中的那样)并将结果写入寄存器R1,R1的内容未必会由于指令I0的结果而改变。例如,如果在指令之前R1的内容为“0”或R2为“1”时,则指令之后的R1的内容就不会改变。
图16中的流程图250代表一个算法,对指令的每个源操作数(例如源1和源2)执行该算法,能创建DAD阵列206A的从属字段。在步骤252中,判断寄存器240中的相关位是否置位。如步骤254所示,如果寄存器240中的该位没有置位,则将该寄存器所关联的从属字段中的该位设置为逻辑1。如步骤258所述,如果寄存器240中的该位置位,就用从该相关寄存器的对应索引寄存器(230、232、234或236)创建的索引(index)来读取源从属字段。然后,如步骤262所述,用逻辑“或”操作将这些源从属位与当前指令从属位合并。这种逻辑“或”操作由图15中的“或”门(OR gate)244表示(其中多个位在输入端出表示)。在执行图16的算法时,修改寄存器和所涉及的修改量,是恰好在某指令被执行之前就存在的。
就I0而言,在指令I0之前,寄存器240中对应R1、R2、R3和R4的都是逻辑0,寄存器230、232、234和236的值为X(无所谓)。执行步骤252时,寄存器240中对应R1和R2的修改位每个都是0。所以,执行步骤254后,DAD阵列206A的指令标识0所在行中对应R1和R2的从属字段位每个都被设置为1。寄存器R3和R4涉及不到,在指令标识0所在行中依旧是0。指令I0修改寄存器R1。所以将0放置在寄存器230中,表示指令I0是最近一次修改寄存器R1的指令。寄存器232、234和236的值依旧为X(无所谓)。将寄存器240的R1位设置为1,表示R1被跟踪指令集内部的指令修改过。
指令I1的从属字段的生成,类似于I0的从属字段的生成。修改寄存器240的R1逻辑寄存器列依旧被设置为1。在修改寄存器240的R2列中放置逻辑1。寄存器232中的1代表指令I1。
就指令I2而言,根据步骤252,在指令I2之前,寄存器240中对应R1和R2的修改位各为逻辑1(即置位)。执行步骤258,在指令I2之前,将R1的修改量寄存器(230)和R2的修改量寄存器(232)用作索引。寄存器230含有表示指令I0的0。DAD阵列206A的指令标识0中的指令I0的从属字段是0011。寄存器232含有表示指令I1的1。指令标识1中的指令I1的从属字段是1100。根据步骤262,0011和1100的逻辑“或”是1111。所以,将1111放置到DAD阵列206A中对应的指令标识2的从属字段中。R1被指令I2修改。不过,寄存器240中已经有了表示寄存器R1的1。将2放入寄存器230中,表示指令I2是最近一次修改寄存器R1的指令。
指令I3的从属字段的生成,类似于I2的从属字段的生成。将逻辑1添加到修改寄存器240的R4列,将代表指令I3的3放入寄存器236中。逻辑“或”的结果是1111。
就指令I4而言,根据步骤252,在指令I4之前,寄存器240中对应R2的修改位被设置为1。执行步骤258,在指令I4之前,用R2的修改量寄存器(232)用作作为索引。寄存器232含有表示指令I1的1。DAD阵列206A的指令标识1中的指令I1的从属字段是1100。根据步骤262,1100(指令标识1的源)与0000(没有源2)的逻辑“或”是1100。所以,将1100放置到DAD阵列206A中对应的指令标识4这一行的从属字段中。
指令I5的从属字段的生成,类似于I4的从属字段的生成。指令I5和I6修改外部存储器位置,不会引起寄存器230、232、234、236或240的变化。
从属信息可以被调度/发布单元156使用,要不然调度/发布单元156可只推导其自己的从属信息。
在再执行中,可以有不同的方法从跟踪缓冲器114A发出一系列或一串指令。一种方法是顺序地读跟踪缓冲器,提取从属位被置位的那些指令,并把发送它们,供再执行。然而,零可能有在管道中产生冒泡(bubbles)的作用。另一种方法是,在发送供执行/再执行的指令之前,通过打包逻辑(packing logic)去除冒泡。参看图17,另一种方法要使用另外某种硬件,包括对应每个逻辑寄存器的阵列268。阵列268包含从属于寄存器R1的各指令的指令标识值。指令268中的值起着指向指令队列阵列202A中全部指令标识项的指针的作用。这就便于对指令缓冲器的快速读取。每次读取一个指令决(可能有2条或4条指令)。跟踪缓冲器114A可能是多端口的(multi-ported),有四个解码器,它将从寄存器阵列获得的这些索引每一个都传入各解码器,于是就能在一个周期读出指令I0、I2、I3和I5。可以在再执行开始之前、创建从属字段的时候对寄存器R1阵列进行汇编。间接的水平(level of indirection)利用了高带宽再执行。
c.输出寄存器堆210A和输入寄存器堆208B跟踪缓冲器114A包括检测某些推测错误的检测电路。按照本发明的一个实施例,每个跟踪缓冲器都有一个输出寄存器堆,用于保存相关线程的寄存器环境(register context),一个输出入寄存器堆,用于接收按程序顺序的前一个线程的寄存器环境。寄存器环境是逻辑寄存器的内容或状态。输出寄存器堆的内容经常被更新,也许每次寄存器中有变化时就更新。输入寄存器堆的内容只有在某个比较之后才被更新一下文将作说明。
图18和19表示的是(跟踪缓冲器114A中的)输出寄存器堆210A和(跟踪缓冲器114B中的)输入寄存器堆208B的实施例一尽管可以使用其它实施例。输出寄存器堆210A和输入寄存器堆208B中包括一个“值或PRID”字段和一个状态字段。状态字段指示在“值或PRID”字段保存的是一个有效值还是一个有效PRID。在一个实施例中,要么有有效值,要么有有效PRID。在另一个实施例中,可能二者都没有,在这种情况下,依赖输入寄存器堆的指令会等待一个。
注意,在上面说明的例子中,指令I0要使用寄存器R1和R2,它们哪一个都不曾是包含指令I0的线程内某个指令的目的地。然而,却要能从输入寄存器堆208B得到寄存器R1和R2对应的值或PRID。
参看图20,比较器280B将当前线程的(跟踪缓冲器114B中的)输入寄存器堆208B的内容,与按程序顺序的前一个线程的(跟踪缓冲器114A中的)输出寄存器堆210A进行比较。比较可以在前一个线程的执行结束时进行,或者在前一个线程的原始执行期间进行。比较也在前一个线程的弃置(retirement)结束时进行。在一个实施例中,仅在前一个线程的弃置结束时进行比较。
有各种事件会触发由比较器280B进行的比较。进行比较是为了检测推测错误。如果输入和与输出寄存器堆之间存在差别,则表明前一个线程的输出寄存器的一个或多个值已经变化。作为响应,输入寄存器堆208B被更新,再执行触发逻辑284B促使受影响的指令用变化后的寄存器值再执行。从属字段可能会被再执行触发逻辑284B使用。不能保证变化后的值就是最终正确值(即在纯粹顺序处理器中本当产生的寄存器值)。指令可能还需要再次再执行,可能要再执行多次。
在一个实施例中,线程的检测电路包括一个输出寄存器堆、一个输入寄存器堆、一个比较器和相关的控制电路,用于检测在包含该输入寄存器堆的跟踪缓冲器中存放的指令中的某些推测错误。在一个实施例中,检测电路可包含有某些不同的电路。
举例来说,参看图21,线程T2是个当前线程,与跟踪缓冲器114B关联。线程T1是线程T2的前一个线程,与跟踪缓冲器114A关联。线程T1包含一个函数调用、函数和从函数调用的返回指令。将函数调用时输出寄存器堆210A的现有内容复制到输入寄存器堆208B。根据输入寄存器堆208B中的寄存器环境,对线程T2的指令进行推测性的执行。在到达返回指令时,由比较器280B对输入寄存器堆208B的内容与输出寄存器堆210A的内容进行比较。如果有差别,就更新输入寄存器堆208B并将线程T2中受影响的指令再执行。这种比较也可以在中间的一个或多个时刻进行。这可以防止由于更加均匀分布的指令再执行而产生的瓶颈问题,但是,如果-例如-输出寄存器堆的内容在该功能期间不止一次变化时,又会导致更多的再执行。如果输出寄存器堆总是发生变化,则最好有一个接收输出寄存器堆210A内容的中间缓冲器。然后可以对中间缓冲器与输入寄存器堆208B的内容进行比较。
如图8和10中所示,寄存器环境是通过导线216在输出寄存器堆和输入寄存器堆之间传递的。导线216将每个输入寄存器堆与可能存放前一个线程的跟踪指令集的每个跟踪缓冲器的输出寄存器堆连接。如果能保证程序顺序总是遵循特定的跟踪缓冲器顺序,则导线216的布局就可以相当简单。输出和输入寄存器堆可以由图10和11中所示的控制电路224A来控制。
因为输出和输入寄存器堆将提供一个值或者一个PRID,所以,输入寄存器堆接收内容的时间与能用该输入寄存器堆中某个寄存器作为源操作数来执行指令的时间之间的延迟可能非常短。如果某个值得不到,则可以将到达寄存器堆152的PRID用于管道108中的执行。
预计,随着正确的源操作数从各种线程的寄存器堆出现,许多指令都要被再执行若干次。不过也可预计,对于许多程序来说,有大量的指令要么根本不需要再执行,要么再执行相对较少的次数,这大大提高了单位时间得到正确执行的指令的数量,减少了运行程序所需的总体时间。
2.跟踪缓冲器114’参看图11,跟踪缓冲器114’类似于(图10中的)跟踪缓冲器114。不过,在跟踪缓冲器114’中,从属字段是在决定了要再执行某指令之后、在从属生成与解码电路218A中生成的。尽管这会导致再执行时的某些初始延迟,但是如果对用于再执行的指令的发布以及对从属对象的确定是以管道方式进行的,则一旦过程开始后,就很少有另外的延迟。
在一个实施例中,从属生成与解码电路218A仅用一个字段来存放从属信息。(在图13中,有4个字段。)该同一个字段可以被重复使用。例如,在从属于寄存器R1的指令的再执行期间,可用该字段来列举从属于寄存器R1的指令。在从属于寄存器R2的指令的再执行期间,可用该相同字段来列举从属于寄存器R2的指令,如此等等。从属生成与解码电路218A可以只包含一个修改量字段和一个索引寄存器。(在图14中有4个。)或者,从属生成与解码电路218A也可以包含多个变址字段和寄存器。从属生成与解码电路218A一次只能确定一些指令的从属对象(dependencies)。
数据阵列214A包括对应每个指令标识项的“值或PRID”字段、状态位字段和再执行计数字段(如图10和13中的DAD阵列206A一样)。或者也可以将数据阵列214A的内容放入从属生成与解码电路218A中,不再需要数据阵列214A。让数据阵列214A和从属生成与解码电路218A之间保持独立是有益的,理由有二。首先,它们可以包括不同读端口。其次,在一个实施例中,从属生成与解码电路218A中没有指令队列阵列202A和数据阵列214A中的那么多的行数。换言之,在一个实施例中,从属生成与解码电路218A重复使用各行,就像它能重复使用从属字段一样。所以,有许多可能。
正如以下将要更详细地说明的那样,MOD178通过导线194发出加载指令何时要被再执行的信号。可以生成一个具有一个从属字段(如图13中R1的存储字段一样)的阵列,列出从属于该待再执行的加载指令的指令。然而,对于加载指令来说,该从属指令列表以该加载指令作为开始,而不是像寄存器的情况中那样,以跟踪指令集中的第一条指令作为开始。加载指令的从属字段可以放在(图11中的)从属生成与解码电路218A中。(当然,其它跟踪指令集的加载指令要从其它跟踪缓冲器取出后被再执行。)在一个实施例中,从属生成与解码电路218A被用作加载指令和寄存器这二者的从属字段。同一个字段可用于二者。在另一个实施例中,寄存器的从属字段在DAD阵列206A中,加载指令的从属字段在从属生成与解码电路218A中。
在另外一个实施例中,加载指令是被完全再执行的(即该加载指令之后的所有指令都被重新执行),这样就不需要从属字段。
C.一个再执行顺序算法当再执行触发逻辑(诸如再执行触发逻辑284B)确定某个源操作数(或其它输入值)被误预测了时,它就触发相应的跟踪缓冲器(诸如跟踪缓冲器114B)发布要在管道108中再执行的那些直接或间接从属于该被误预测源操作数的指令。可以由跟踪缓冲器中DAD阵列的从属字段或者通过如图13中所示的另一个阵列来确定直接或间接从属的指令。
所确定的指令被按指令在跟踪缓冲器中的顺序(就是按程序顺序)从跟踪缓冲器中调度出来去执行。例如,对指令标识0项中的指令的调度,在指令标识0项中的指令之前或者同时。然而,可以在调度/发布单元156的控制下,对这些指令进行无序的执行-就像在任何无序处理器中一样。将控制位附在从跟踪缓冲器发出的指令上,向重命名/分配单元150指出是否要(1)进行寄存器重命名,(2)放弃在重命名/分配单元150中进行重命名别名表查找,而是使用相应的跟踪缓冲器中的PRID,或者(3)彻底放弃重命名,取DAD阵列中的值,把它当作指令中的常数操作数来使用。
正如结合图8所作的解释一样,“有效1”和“有效2”字段内的位,在指令的相应的源操作数已经由跟踪缓冲器114A中的线程外部的指令(例如指令的目的地)产生时,被设置成第一值(例如逻辑0);在指令的源操作数已经由线程内部的指令产生时,被设置成第二值(例如逻辑1)。
(1)有效位1。如果指令队列阵列202A中的该有效位被设置成逻辑1,则用源操作数来读取DAD阵列206A中的相应的值或PRID。如果DAD阵列的状态字段的值位和PRID位都不是有效的,则表明源操作数寄存器尚未被重命名。在这种情况下,通过导线120和MUX110将指令与具有逻辑0值的值与PRID状态位一起发出,让重命名/分配单元150像通常所作的那样去进行别名表查找(寄存器重命名)。如果PRID或值是有效的,它就被与指令一起通过导线120和MUX110传送到重命名/分配单元150,后者对其作出的响应是不进行重命名步骤。
(2)有效位0。如果某源操作数的对应有效位被设置成逻辑0,则该输入操作数来自跟踪的外部。源寄存器名被用来访问输入寄存器堆208A。将输入寄存器堆208A中的值或PRID连同指令一起传送到重命名/分配单元150,后者对其作出的响应是不进行重命名步骤。
无论有效位是0还是1,对于每个被调度的指令来说,DAD阵列206A中的值与PRID状态字段位都要被复位或保持为逻辑0。这样能达到两个目的。其一,它能保证将允许在重命名步骤中PRID被复制到该项之前被调度的后面的从属指令被按照重命名别名表来重命名,以避免使用跟踪缓冲器114A中的过时的PRID。其二,它也保证指令在最后的执行实例被写回之前一直不弃置,因而使指令仅当在所有数据误预测都已经被更正时才弃置。
D.二级或最终弃置一条指令从跟踪缓冲器114中弃置(退出)的时机是,前面所有线程的所有指令都已经弃置并且属于该指令的所有再执行事件都已经被服务。换言之,指令是在能确保该指令已经被用正确的源操作数执行过的时候被最终弃置的。线程是按顺序被弃置的。例如,线程X中的指令一直要等到前面所有线程都已经被弃置时(即前面所有线程的指令都已经被弃置时)才能被弃置。线程内部的指令是按顺序弃置的,不过,都作好了弃置准备的指令是可以同时被弃置的。
最终弃置是由最终弃置逻辑134控制的。在本发明一个实施例中,最终弃置包括(1)向顺序寄存器堆提交结果;(2)服务中断、例外和/或转移误预测;(3)释放跟踪缓冲器和M0B178的各资源项;(4)通知MOB将存储指令作弃置标记并将它们发往存储器。释放各资源项可能涉及移动首部指针。如下文所述,MOB178中的存储指令,一直要等到能确定相关数据被复制到数据高速缓存176或其它存储器时,才被释放。关于MOB178中的加载和存储指令的最终弃置,在下文作说明。
E.存储器系统图22表示,图2的MOB178的一个实施例包括MOD178A、178B、…、178Y,其中Y代表MOB的个数,与跟踪缓冲器114的个数相配。MOD178A、178B、…、178Y保存分别保存跟踪缓冲器114A、114B、…、114Y中跟踪指令集的加载和存储指令的副本。加载指令被保存在加载缓冲器182A、182B、…、182Y中。存储指令被保存在存储缓冲器184A、184B、…、184Y中。导线194代表各种向MOB178或从MOB178传输信号的导线。再执行导线194从MOB178向跟踪缓冲器114提供信号,提醒跟踪缓冲器114有加载指令要被再执行。控制电路302执行各种控制功能。
1.存储缓冲器和加载缓冲器图23表示的存储缓冲器184A的一个实施例,也代表存储缓冲器184B、…、184Y。可以使用其它各种实施例。存储缓冲器184A包含各行的存储缓冲器项的各种字段。每项由一个存储缓冲器标识符(SBID)来标识。重命名/分配单元150向每个首次被提取和执行、但没有开通再执行的存储指令分配一个SBID项。该存储指令具有该相同的SBID值,一直到最终弃置。例如,在图23中,项SBID 0被分配给指令store 0。项SBID 1被分配给指令store 1,如此等等。图23中表示了一个LBID字段,它存放下文将作说明的“存储LBID”值。在一个实施例中,当(图12中)指令队列阵列202A的某项含有存储指令时,指令队列阵列202A的SBID字段就存放标识含有该存储指令的存储缓冲器184A中该项的SBID,LBID字段则存放该存储指令的存储LBID(如果有的话)。SBID和存储LBID通过管道108伴随有存储指令。在那个实施例中,LBID字段可以不包括在存储缓冲器184A。
指令标识符字段存放指令队列阵列202A中的存储指令的指令标识符。线程缓冲器标识符字段在存储缓冲器184A和跟踪缓冲器114A二者中都是隐含的。操作码字段存放存储指令的操作码。存储地址字段存放存储指令的目标地址。在所示实施例中,该地址是由AGU172生成的。SB地址有效字段包含一位,指示该存储地址是否是个有效地址。数据字段存放要被存储的数据。数据有效字段包含一位,指示该数据是否有效。可以使用独立的地址和数据有效位,这是因为有效地址的到达时间可能与有效数据的不同。地址和数据二者的到达都早于存储指令的执行。按照一个实施例,数据被作为一部分包含在指令中。弃置字段包含一位,当最终弃置逻辑134指出该存储指令应当弃置时,该位置位;当从存储器收到向存储器的存储已经完成的确认时,该位复位。加载和存储指令的弃置,将在下文讨论。再执行计数字段包含一个再执行计数值(它类似于图13中DAD阵列206A的再执行计数字段)。按照一个实施例,存储指令每次只能再执行一次,因而没有再执行计数字段。
图24表示的加载缓冲器182A的一个实施例,也代表加载缓冲器182B、…、182Y。可以使用其它各种实施例。加载缓冲器184A包含各行的加载缓冲器项的各种字段。每项由一个加载缓冲器标识符(LBID)来标识。重命名/分配单元150向每个首次被提取和执行、但没有开通再执行的加载指令分配一个LBID项。该加载指令具有该相同的LBID值,一直到最终弃置。例如,在图24中,项LBID 0被分配给指令load 0。项LBID 1被分配给指令load 1,如此等等。(LBID项号和SBID字段可以被称作MOB ID)。图24中表示了一个SBID字段,它存放下文将作说明的“加载SBID”值。在一个实施例中,当(图12中)指令队列阵列202A的某项含有加载指令时,指令队列阵列202A的LBID字段就存放标识含有该加载指令的加载缓冲器184A中该项的LBID,SBID字段则存放该加载指令的加载LBID(如果有的话)。LBID和SBID伴随加载指令通过管道108。在该实施例中,SBID字段也可能不包含在加载缓冲器182A中。
指令标识符字段存放指令队列阵列202A中的加载指令的指令标识符。线程缓冲器标识符字段在加载缓冲器182A和跟踪缓冲器114A二者中都是隐含的。操作码字段存放加载指令的操作码。加载地址字段存放加载指令从其加载的地址。项有效字段包含一位,指示该项被一个有效的加载指令占据。在所示实施例中,没有包含地址有效字段,这是因为该地址已经被AGU172生成。PRID字段存放来自重命名/分配单元150的、指示加载指令在寄存器堆152中的目的地的PRID。SB命中(SB Hit)、线程标识符合再执行计数字段(如果有的话),可以被看作是状态字段的一部分,下文将结合存储指令的执行来加以说明。
当存储和加载指令被首次从重命名/分配单元15O接收时,就在存储缓冲器184和加载缓冲器182中分配存储和加载指令的各项,并在寄存器堆150和ROB164中分配用于接收被加载值的寄存器的各项。这些项不会受到第一级弃置,而是像跟踪缓冲器114中的各项一样,一直被分配,直到最终弃置。相应地,在再执行时不重新分配各项。如果某存储或加载缓冲器满,来自I-高速缓存104的存储或加载指令就不会穿过重命名/分配单元150,直到有某项被释放。然而,来自跟踪缓冲器的正被重新执行的加载或存储指令将穿过重命名/分配单元150。
2. 加载和存储地址的比较参看图5,按照程序顺序,线程T1中的store MX的执行时间早于load MX在线程T2中执行的时间。然而,由于是并行执行,所以,按照时间顺序,store MX可能在load MX之前或之后执行。如果按照程序顺序,store MX在load MX之前执行,那么对load MX的推测性执行,相对于store MX的顺序将是正确的。如果按程序顺序先于store MX的所有指令都已经被弃置,则load MX肯定将从存储器位置MX加载正确值。正确值是如果线程是由顺序处理器运行时会被加载的值。如果按程序顺序先于store MX的指令并非全部都已经被弃置,则总是存在着store MX的数据不正确的机会。
相反,如果按时间顺序,store MX是在load MX之后执行的,则load MX的推测性执行将不是按照相对于store MX的正确顺序,不能确定load MX将加载正确的值。要是正确的值正好就在存储器位置MX中(或者存储缓冲器项的数据字段存放着store MX,直到storeMX最终被弃置),那也纯属偶然。为了确保执行最终正确,MOD178包含了各种保证线程之间的存储器数据的一致性的机制。
a.加载指令的执行在加载指令被执行之前,要将其地址与存储指令的地址进行比较,以确定哪个存储指令是最邻近的在先匹配存储指令(CEMSI)。“匹配”指具有与加载指令相同的地址。“在先”指该CEMSI按程序顺序来说比加载指令更早。“最邻近”指在该CEMSI与要执行的加载指令之间没有其它匹配的存储指令。如果只有在先匹配存储指令,它就是CEMSI。
如果有CEMSI,加载指令就从CEMSI的数据字段读取其数据。如果没有CEMSI,加载指令就从存储器-诸如数据高速缓存176(一种二级高速缓存)或主存储器-取得其数据。将来自存储缓冲器184或存储器的数据传过MUX192并写入跟踪缓冲器114中由线程标识符和指令标识符指定的项。也可以将该数据写入寄存器堆152中由PRID指定的寄存器。也可以根据具体的高速缓存规则-例如写回(write back)、写过(write through)等等,将数据存储在数据高速缓存176中。MUX192是个旁路(bypass),因为它能旁路存储器-诸如数据高速缓存176(一种二级高速缓存)或主存储器。
在一个实施例中,有不同的比较器与每一个存储缓冲器184的每项关联,用于将待执行的加载指令的地址与存储指令的地址进行比较。图25中的比较器320是一个例子,它接收加载指令地址和存储缓冲器184A中SBID 1项的存储地址。导线322以及其它比较器的输出导线与MOB控制电路302相连。
加载SBID指向对待执行的加载指令而言是最邻近的在先存储指令(CESI)的LBID。该CESI位于与该加载指令具有相同的线程标识符的存储缓冲器中。如果有CEMSI,则它要么是该CESI,要么按程序顺序来说比该CESI更早。重命名/分配单元150跟踪程序中存储和加载指令的顺序并提供SBID和LBID值。它们可以通过导线126被写到跟踪缓冲器114。按照一个实施例,如果某加载指令没有对应的CESI,则没有与该指令相关联的加载SBID。这在跟踪指令集中的第一条存储器指令是加载指令时发生。可以采用各种技术来处理这种情形,包括用重命名/分配单元150发送某些信号来指示没有有效的加载SBID。下文所说明的阵列回绕位(array wrap around bit)可以用于这个用途。
考察按以下程序顺序的存储和加载指令store 0store 1load 0store 2load lstore 3store 41oad 2。
LBID字段中的存储LBID值,在存储缓冲器182A中表示。SBID字段中的加载SBID值,在加载缓冲器184A中表示。例如,LBID项1的SBID字段中的2,表示位于存储缓冲器184A中的项SBID 2处的存储指令,存放着对应LBID项1中的加载指令的CESI。指令store0、store 1、store 2、load 0晚于或早于load 1。指令store 3、store 4、load 2早于或晚于load 1。
控制电路302可以用各种方法来确定哪条存储指令是CEMSI。现在结合图27举例讨论一些方法,图中的存储缓冲器184A、184B、184C和184D是MOD178中仅有的存储缓冲器,分别与线程A、B、C和D相关联。假设程序顺序是线程A、线程B、线程C、线程D。本例中,待执行的加载指令在加载缓冲器182C中。有一个CESI,它在存储缓冲器184B中。
导线342、344、346和348是各种比较器的输出导线。导线362、364、366和368提供使比较器能进行比较的控制信号。在不同的实施例中,控制电路302使能(1)每个存储缓冲器中所有项的比较器;(2)仅仅是某个存储缓冲器中的那些比较器--该存储缓冲器具有的线程标识符与加载指令的线程标识符相同,或者按程序顺序来说早于加载指令的线程标识符;或者(3)仅仅是与按程序顺序来说早于加载指令的各项相关联的那些比较器。
匹配确定逻辑356确定存储指令中哪条是CEMSI。在图27中,存储缓冲器184C上部的store MX指令是CEMSI。假设该store MX不在存储缓冲器184C中的话,则CEMSI就应该是存储缓冲器184B中的store MX指令。在比较器和匹配确定逻辑356确定是否有CEMSI的同时,可以在数据高速缓存176(或其它存储器)中进行查找,为如果没有CEMSI的情况作好准备。匹配确定逻辑356包含数据路径控制逻辑390,它在导线370上提供控制信号,控制MUX 192从存储器还是存储缓冲器传送数据。
按照一种方法,有两种由MOB控制电路302作出的优先权决定。一种是决定存储缓冲器内存储指令的优先权。另一种是决定存储缓冲器的优先权。决定的先后顺序可以随便。在对存储缓冲器内的优先权的决定中可以使用一种进位链结构。例如,在一个实施例中,对于除具有与加载指令的相同的线程标识符的存储缓冲器以外的每个存储缓冲器,确定哪条匹配的存储指令是按程序顺序来说最年轻的,如果有的话。对于具有与加载指令的相同的线程标识符的存储缓冲器,如果有的话,确定哪条指令按程序顺序来说最邻近(包括等于)CESI。然后,确定那些存储缓冲器中的哪一个含有一个其线程标识符按程序顺序来说最接近该加载指令的线程标识符的匹配指令。
存储缓冲器184可以是各有一个首部和尾部的环形阵列。一开始,具有较大SBID值的存储指令是较年轻的。然而,随着存储项的释放和分配,尾部最终将回绕,使得首部指向一个比尾部指向的更高的SBID项。在一个实施例中,一个回绕位在尾部从最高变成最低SBID值时反转,并被提供给最邻近的匹配确定逻辑356。
b.存储指令的执行当存储指令被执行时,要将其地址与加载指令的地址进行比较,以确定(如果有的话)按程序顺序来说较晚的(出自相同或较年轻的线程的)加载指令哪些具有与存储指令地址相同的地址。存储SBID所指向的最邻近的在后加载指令(CLLI)指定了可以考虑的最早加载指令。
在一个实施例中,有不同的比较器与每一个存储缓冲器182的每项关联,用于进行这些比较。其中一个比较器就是图26中所示的比较器324。只是作为例子,将比较器324与加载缓冲器182A的LBID1项关联。比较器324在一个输入端接收一个存储指令的地址,在另一个输入端接收加载缓冲器182A中SBID 1项的加载地址。输出导线326上的信号表示地址是否相同。导线326以及其它比较器的输出导线与MOB控制电路302相连。如下文所述,比较器(诸如比较器324)也可以比较存储指令的状态位与加载缓冲器中的状态位。
图28与图27类似。然而在图28中,加载缓冲器182A-182D中的加载地址是与待执行的存储指令的地址比较的,匹配确定逻辑356确定是否要再执行加载指令。在一个实施例中,匹配确定逻辑包括再执行触发逻辑394,后者在导线194上提供信号,向跟踪缓冲器指出哪些加载指令要再执行。在一个实施例中,匹配确定逻辑356考察加载指令与自CLLI开始的存储指令的匹配。可以采用不同的算法。线程管理逻辑124指出按程序顺序来说晚于正在执行的存储指令的线程标识符的那些线程标识符。在一个实施例中,将所有比较器都被使能。在另一个实施例中,仅使能加载缓冲器中具有按程序顺序来说等于或晚于加载指令的线程标识符的线程标识符的导线。在另一个实施例中,仅使能与CLLI和较晚的指令相关联的加载缓冲器中的导线。要考察的线程,可以在对加载缓冲器内哪些加载指令按程序顺序来说晚于存储指令的确定之前、之后或期间确定。
按照一个实施例,检测加载指令的执行中的某些推测错误的检测电路,包括与加载缓冲器关联的比较器、匹配确定逻辑356的部分、以及相关的控制电路。在其它实施例中,检测电路可包含有些不同的电路。并不要求检测推测错误的检测电路位于执行管道中。不同的匹配确定逻辑都能与数据路径控制逻辑和再执行触发逻辑结合起来使用。
ⅰ.有地址匹配的各种情况在确定是否再执行时,要考察有地址匹配的那些更年轻指令的状态字段(SB命中、SBID、线程标识符、再执行计数(若使用的话)。状态字段指出加载指令是从存储器(例如数据高速缓存176)还是从存储缓冲器的数据字段取得其数据的。例如,如果数据来自存储器,SB命中字段就含有0,如果数据来自存储缓冲器,就含有1。SBID和线程标识符字段存放数据来自的存储指令的SBID和线程标识符。存储指令的线程标识符未必是有地址匹配的加载指令的线程标识符。加载指令的线程标识符在加载缓冲器中是隐含的。再执行计数字段(若使用的话)指示涉及到哪个再执行。(如果SB命中是0,则SBID、线程标识符及再执行计数诸字段中的数据没有意义)如果SB命中=0(来自存储器的以前数据),就在导线194上从加载缓冲器向由加载指令的线程标识符所标识的跟踪缓冲器发出再执行事件信号,于是从跟踪缓冲器再执行该加载指令及所有从属指令。在导线194上发送指令标识符和线程标识符,以指示哪条指令被再执行。
如果SB命中=1(来自存储缓冲器的以前数据),则SBIID字段、线程标识符字段和再执行计数字段(如果使用的话)中的值控制是否触发一次再执行。第一种情况是,特定加载指令的状态字段的线程标识符等于存储指令的线程标识符,特定加载指令的状态字段中的SBID与存储指令的SBID匹配。在第一种情况下,如果加载指令的再执行计数大于状态字段中的再执行计数,就再执行加载指令。如果没有加载计数(因为存储指令每一次只能被再执行一次),就再执行加载指令。
第二种情况是,状态字段中的线程标识符等于存储指令的线程标识符,但是状态字段中的SBIID与存储指令的SBID不匹配。在第二种情况下,如果状态字段中的SBID小于存储指令的SBID,就再执行加载指令,但是,如果状态字段中的SBID大于存储指令的SBID,就不再执行。
第三种情况是,状态字段和存储指令的线程标识符不匹配。预计这是一种不常发生的情况。为简单起见,按照一个实施例,加载指令被再执行(即使它可能违反程序顺序)。这可能是一个假的再执行。加载指令被再执行时,将接收正确的存储数据。可以采用其它方法,但是它们复杂得多,不值得用于这种不常发生的情况。
ⅱ.没有地址匹配的各种情况如果地址不匹配,则不触发再执行--除非是下述不常见的情况。如果SB命中=1,状态字段的线程标识符与存储指令的线程标识符匹配,并且状态字段的SBID与存储指令的SBID匹配。在这种情况下,就有再执行,被再执行的加载指令从新的一项或存储器中接收其数据。
c.复位当确定某线程不符合程序顺序时,线程要被复位。然而,其它线程的加载指令可能已经从该线程中的存储指令的相关数据字段取过数据。线程管理逻辑124向控制电路302发送控制信号。在一个实施例中,当某线程被复位时,要将复位线程的线程标识符与每一个加载缓冲器(除了该复位线程对应的加载缓冲器)中的每一个加载指令进行比较。如果状态字段中的线程标识符与复位线程的线程标识符匹配时,就触发对加载指令的再执行。被再执行的加载指令取自适当的跟踪缓冲器。
3.存储指令的再执行如上所述,加载指令是根据存储指令的执行情况而被再执行的。在一个实施例中,存储指令是根据跟踪缓冲器中寄存器的比较结果表明某个寄存器值已经改变而被再执行的。例如,参看图12和13,跟踪缓冲器114A的指令标识符4和5是存储指令,图中显示它们依赖于寄存器R1-R4。
4.多个加载指令的再执行某加载缓冲器中有一个以上的加载指令的状态字段与某个存储指令匹配是可能的。为了避免复杂的逻辑,一种方法是让控制电路302检测何时有多重加载地址匹配并促使位于跟踪指令集中最早的加载指令之后的所有指令被重新执行。
5.加载和存储指令的最终弃置当某个加载或存储指令要被最终弃置时,最终弃置逻辑134向跟踪缓冲器114和MOB184提供信号,指出有指令要被最终弃置。(由指令标识符和线程标识符所确定的)跟踪缓冲器中的一项于是被释放。就加载指令而言,(由指令标识符和LBID所确定的)加载缓冲器中的一项被释放。就加载指令而言,最终弃置是彻底的(complete)。就存储指令而言,在释放之前,必须将数据字段中的数据提交到存储器。存储缓冲器中该项的释放以及由此导致的最终弃置,要一直等到收到存储已经完成的确认时才发生。或者,也可以在确认之前使该项最终弃置,但是该项的重新分配则要一直等到收到确认时才能发生。导线200上的信号能向线程管理逻辑124指出存储指令的弃置何时完成、何时可以开始下一个线程。
“SB弃置”指示某指令已经被弃置。当最终弃置逻辑134指出某指令应当弃置时,SB弃置字段中的一位就被置位(asserted)。一旦SB弃置字段被置位,就将相关的指令写入存储器。一旦MOB 184A知道该指令已经被写到存储器,SB弃置字段马上就被复位(deasserted),该指令就被释放。
加载缓冲器182A和存储缓冲器184A可以是具有首部和尾部的队列。当有指令被释放时,首部就被移动。在加载缓冲器184A以及跟踪缓冲器114中,弃置和释放可以同时发生。最终弃置逻辑134通过导线136和140提供信号。Demux 188选择是否加载缓冲器182或存储缓冲器184的其中之一将接收弃置信号。Demux 188是可选的,可由加载缓冲器182和存储缓冲器184中的使能端口替代。
F.关于线程管理逻辑和最终弃置逻辑的其它信息在一个实施例中,线程管理逻辑124用一个树结构来追踪线程顺序。按照该树结构,程序顺序(也是弃置顺序)从顶端流向底部,右边的节点按程序顺序来说早于左边的节点。根是程序顺序中的第一个。树是个抽象概念,而树结构则是实现该树的电路系统。
线程在后向转移或函数调用之后的指令位置开始。就是说,线程在假定没有采取后向转移或没有调用函数时的下一条指令的位置开始(如图4和5中的线程T2所示)。这样做时,从某个线程(节点)的角度来看,线程的子节点的程序顺序与线程被启动(创建)的顺序相反。例如在图6中,按照时间顺序,线程T2的执行在线程T3的执行之前开始,但是按照程序顺序,线程T3则先于线程T2出现。
在一个实施例中,有三种事件可导致将线程从树中去除(1)位于树的根部的线程在该线程被弃置时被去除。当根部的线程被弃置时,按程序顺序的下一个线程(节点)变成树根,并相应地重新分配各节点。(2)将按程序顺序来说的处于最后的线程从树中去除,腾出空间,让给要添加到树中的按程序顺序来说位置更高的线程。就此而言,树起着后进先出(LIFO)堆栈的作用。(3)当发现某线程的父线程的程序计数器超出起始计数值至结束计数值的范围时,该线程会被复位,由此而从树中去除。在有子线程是在后向转移的位置被创建(例如图6和29中的线程T4)的情况下,起始计数值是该后向转移的目标,结束计数值是在该后向转移指令位置的程序计数器值。在函数调用后面开始的进程也可能由于没有从该函数的返回而被复位-尽管这种情况的发生非常罕见。处理没有从函数返回的这个可能的一种方法是,不管这种可能,而是让系统在该线程变成按程序顺序来说最低的线程时最终将其从树种去除-像在事件(2)中的那样。当线程被从树中去除时,分配给该线程的资源(诸如跟踪缓冲器、存储缓冲器、加载缓冲器)就被释放。
事件(1)和(3)在图29中表示,该图包括图6的诸例线程,还增加了线程T5和T6。线程T5紧接在J点的后向转移指令之后开始,线程T6紧接在K点的后向函数调用转移指令之后开始。假设只有四个跟踪缓冲器。图30表示在时刻t1时的树结构。线程T2被添加到树中的时间早于线程T3被添加到树中的时间。线程T4在线程T3被添加到树中之后被添加到节点中。线程T2和T3是线程T1的子线程。线程T4是线程T3的子线程。按照由顶到底和自右至左的规则,程序顺序和弃置顺序是线程T1、T3、T4和T2。图31表示假定线程T4在线程T1弃置之前被复位的情况下在时刻t2时的树结构。程序和弃置顺序是T1、T3、T2和T5。图32表示假定线程T1在线程T4被复位之前弃置的情况下在时刻t2时的树结构。程序和弃置顺序是T3、T4、T2和T5。图33表示在线程T1弃置和线程T4复位后的时刻t3时的树结构。程序和弃置顺序是T3、T2、T5和T6。
图34所示的事件(2)包含嵌套的函数。按照时间顺序,线程被创建(启动)的顺序是T1、T2、T3、T4和T5。然而,程序顺序是T1、T5、T4、T3和T2。本例中只有四个跟踪缓冲器。所以,并非五个线程都是同时存在的。图35表示线程T5被启动前的时刻t1的树结构。程序和弃置顺序是T1、T4、T3和T2。线程5还不是树结构的一部分。图36表示是在线程T5已经启动后的时刻t2时的树结构。线程2是按程序顺序来说最低的,它被从树结构中去除,为线程T5腾出空间。被从树中去除的线程可以在以后某个时间重新启动。或者,另一个线程可以执行被从树中去除的线程的部分或全部指令。在一个实施例中,就复位而言,线程可寻求联接以后的下一个线程而不是被复位的线程。或者,该线程也可以一直继续,直到由于其它原因被结束。阵列198的函数可以在树的节点中执行。
子线程的线程标识符在树结构中是按照程序顺序适当定位的。(尽管由线程管理逻辑124所决定的程序顺序可能会改变。)当某线程联接或对应按程序顺序来说树中的下一个线程的程序计数时,该线程就结束。如果该线程只有一个子线程,它就是按程序顺序来说的下一个线程。例如在图33中,线程T2是按程序顺序来说的下一个线程。
最终弃置逻辑134从树结构获取信息来组装阵列198或者直接从树结构的电路获取信息。在线程管理逻辑124的树结构和其它逻辑与最终弃置逻辑134的逻辑之间可以有解码电路。阵列198可以不要。
总之,树结构提供具有至少以下意义的信息(1)树规定了弃置顺序;(2)树规定了程序顺序,为例如上述的MOB178所使用;(3)树通过指出另一个线程的起始指令而规定了线程的终结点;(4)通过指示那些资源可用和那些资源被释放,树可用于线程资源的分配。
G.一个没有多线程操作的实施例图3表示一个包含管道308的处理器100。处理器100与处理器50类似。然而,跟踪缓冲器300是唯一的跟踪缓冲器,MOB310是唯一的MOB。处理器50不是为处理多个线程而设计的。因此,线程管理逻辑对处理器100来说并不需要。例如跟踪缓冲器300可以类似于跟踪缓冲器114A,只是不需要特定于多线程的部件。例如,导线26和输出寄存器堆210就不需要。可以用各种电路来检测推测错误,包括众所周知的电路。例如MOB310可以类似于MOB178A,只是不需要特定于多线程的部件。例如,加载缓冲器中就不需要线程标识符字段。可以对处理器100的其它部件,针对它们在处理器50中的配置作一定修改,去除与多线程操作有关的特征功能。跟踪缓冲器300和MOB310可以用于推测和从推测错误的恢复。跟踪缓冲器便于在管道外部存放大量指令,用于在最终弃置之前进行可能的再执行。
处理器50可用于非多线程程序。在这种情况下,线程管理逻辑124可以按程序顺序一直保存同一个线程标识符。或者也可以将线程管理逻辑124关闭。在非多线程的情形中,只使用跟踪缓冲器114的其中之一和MOB178的其中之一。或者也可以将各跟踪缓冲器组合成更大的跟踪缓冲器,将各MOB组合成更大的MOB。
H.其它信息和实施例参看图37,处理器400是个包含多管道单元402的多处理器(MP)芯片。多管道单元400不同于图2的共享资源管道108的地方是,一个完整的管道(例如每个管道的单独的重命名/分配单元)是与多管道单元402的每个管道0、1、…W包含在一起的。(W可对于或大于或小于X。)否则的话,处理器400就会基本上与处理器50相同,或者与处理器50非常不同。其它处理器可包含多管道单元402的一些特点以及管道108的一些特点。
本文提及的每一种处理器,都能包含在各种计算机系统的一部分中。参看图38,举例来说,处理器50可以是计算机系统430的一部分。相同430也可以包含第二个处理器434。处理器50内可包含一个芯片级二级(L2)高速缓存。处理器50可通过处理器总线442与存储器控制器440通信。存储器控制器440可通过总线452和454与主存储器446和外围设备448通信。
可以在不使用寄存器重命名的处理器中使用一个类似于管道108或308(见图2和3)的管道。在这种情况下,可以修改寄存器重命名所涉及的部件(例如重命名/分配单元150),删除与重命名有关的特征功能。
本文所描述和表示的电路和元件只是示例性的。它们可以用其它各种电路和元件替代。此外,在尺寸、延迟等方面可以有各种设计上的平衡。例如,如果执行路径中的(例如保留站、寄存器堆、MOB中的)缓冲器太大,就只好降低最大操作时钟频率。本文所示的各部件可以根据各种技术来设计和构造。
在两个所示结构之间可能有中间结构(正如缓冲器)或信号。有些导线可能不是向图示中那样是连续的,而是被中间结构隔断的。附图中方框的边界是为了解释的方便。实际的设备不必包含带这种边界的部件。图示各部件的相对大小并不表示实际的相对大小。箭头表示某些实施例中的某种数据流,但没有表示每一个信号,诸如数据请求。上文中如果描述了一个逻辑高信号,该信号也可用逻辑低信号代替,反之亦然。
图示处理器中的各部件可全部位于同一个处理器芯片上。或者,例如跟踪缓冲器也可以位于执行管道以外的不同芯片上。
“连接”、“耦合”等相关的用语,并不限于直接连接或直接耦合,而是包括间接连接和间接耦合。“响应”等相关用语,只一个信号或事件在某种程度上受到另一个信号或事件的影响,这种影响未必是完全或直接的。如果本说明书述及“可以”、“能”或“最好要”包括某部件时,该特定不是必定要包括部件。
MOB可用数据匹配而不是地址匹配来检测误推测。
阅读本说明书的本领域的熟练人员将知道,在本发明的范围内可以由以上说明和附图中得出各种变通例。所以,界定本发明的是以下各权利要求-包括其补充。
权利要求
1.一种处理器,包含一个执行指令的执行管道,其中至少有些指令是推测性地执行的;和一个在执行管道外部的用于存放指令的跟踪缓冲器,其中,跟踪缓冲器中与推测错误相关的指令要在执行管道中被再执行。
2.权利要求1的处理器,其中,某些指令在它们结束在指令管道中的执行时要受到初始弃置,但这些指令一直留在跟踪缓冲器中,直到最终弃置。
3.权利要求1的处理器,进一步包含最终弃置逻辑,用于通知跟踪缓冲器释放存放要被最终弃置的指令的项。
4.权利要求1的处理器,其中,执行管道可用于共享资源多线程操作。
5.权利要求1的处理器,其中,跟踪缓冲器是第一个跟踪缓冲器,处理器进一步包含另外的跟踪缓冲器,其中,这第一个和另外的跟踪缓冲器存放来自不同线程的跟踪。
6.权利要求1的处理器,其中,执行单元包括一个寄存器重命名单元,跟踪缓冲器提供伴随被再执行指令的控制位。
7.权利要求6的处理器,其中,根据被再执行指令和控制位的状态,寄存器重命名单元旁路对该指令的相关寄存器的重命名。
8.权利要求6的处理器,其中,根据被再执行指令和控制位的状态,寄存器重命名单元(1)进行寄存器重命名;(2)旁路重命名,转而使用来自跟踪缓冲器的一个物理寄存器标识号;或者(3)把来自跟踪缓冲器的某个值作为常数使用。
9.权利要求1的处理器,其中,执行管道包括一个包含存储缓冲器和加载缓冲器的存储器顺序缓冲器(MOB)。
10.一种处理器,包含一个执行指令的执行管道,其中至少有些指令是推测性地执行的;和一个在执行管道外部的用于存放指令的跟踪缓冲器和指令执行的结果,其中,至少部分指令在管道中执行后受到初始弃置,并保留在跟踪缓冲器中直到最终弃置。
11.权利要求10的处理器,进一步包含检测指令执行中的推测错误的检测电路。
12.权利要求10的处理器,其中,至少有一部分检测电路包含在跟踪缓冲器内。
13.权利要求10的处理器,进一步包含检测指令执行中的推测错误的检测电路和触发与推测错误相关联的指令的再执行的再执行触发电路。
14.权利要求10的处理器,其中,执行管道包括一个用于存放加载和存储指令的存储器顺序缓冲器(MOB),其中,加载和存储指令不会受到初始弃置,而是一直留在存储器顺序缓冲器中,直到最终弃置。
15.权利要求10的处理器,进一步包括一个用于存放加载和存储指令的存储器顺序缓冲器,其中,可以再执行跟踪缓冲器中的指令以更正误推测,并且其中的执行管道包含一个重命名/分配单元,该单元在加载或存储指令初次通过管道时在MOB分配各项,但是当指令被再执行时不重新分配该项。
16.权利要求10的处理器,其中的跟踪缓冲器是执行管道外部的用于存放各线程的跟踪的多个跟踪缓冲器的其中之一,其中,执行管道并行执行至少一些部分的线程,其中至少一个线程从属于至少另一个线程。
17.权利要求10的处理器,进一步包含最终弃置逻辑,其中跟踪缓冲器内的指令是在最终弃置逻辑的控制下被最终弃置的,但是某些指令可在指令管道中的执行之后被初始弃置。
18.权利要求10的处理器,跟踪缓冲器包含一个指令队列阵列。
19.权利要求1的处理器,进一步包含一个解码器,其中,执行管道和跟踪缓冲器同时从解码器接收指令。
20.一种处理器,包含一个执行指令的执行管道,其中至少有些指令是推测性地执行的;和一个在执行管道外部的用于存放指令的跟踪缓冲器,其中,可以根据所检测到的误推测而再执行跟踪缓冲器中的指令,其中,指令留在跟踪缓冲器中,直到确定指令得到正确地执行。
全文摘要
在本发明的一个实施例中,处理器(10)包括一个执行指令的执行管道,其中至少有些指令是推测性地执行的。处理器也包括一个位于执行管道外部的跟踪缓冲器(114),用于保存指令,其中,与推测错误相关联的指令要在执行管道中再执行,以执行指令,其中至少有些指令是推测性地执行的。处理器也包括一个位于执行管道外部的跟踪缓冲器,用于保存指令和指令执行的结果,其中,至少有些指令在管道中执行之后要受初始弃置的处理,但是一直保留在跟踪缓冲器中,直到最终弃置(134)。
文档编号G06F9/38GK1286771SQ9881365
公开日2001年3月7日 申请日期1998年12月11日 优先权日1997年12月16日
发明者H·阿克卡利 申请人:英特尔公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1