具体实施方式
下面仅通过举例的方式对本发明的实施例进行说明。这些示例代表了当前申请人所知的实践本发明的最佳方式,但是这些示例不是可实现本发明的唯一方式。说明书阐述了示例的功能以及用于构造和操作示例的步骤的序列。然而,可以通过不同的示例来实现相同或等同的功能和序列。
经确证,尽可能快速地执行一些类型的指令(例如,控制转移指令、标记设定指令和地址生成指令),即使这些指令比其他就绪的指令年轻,也可以显著地提高处理器的性能。这是因为,一旦这些类型的指令已经发布,它们就释放出能够由其他指令使用的其他资源。
因此,本文所描述的实施例涉及即使一些类型的指令比其他就绪指令年轻也优先这些类型的指令的方法、保留站和处理器。特别地,在本文所描述的实施例中,基于指令类型在保留站中将指令分类到多个指令队列中的一个中。然后,保留站基于多种指令类型的相对优先级从指令队列中选择用于执行的指令。这允许一些类型的指令优先于其他指令,即使它们比其他就绪的指令更年轻。以此方式选择指令确保了优先于更低优先级的指令选择更高优先级的指令来发布,从而保障更高优先级指令功能单元资源(例如,管线)并且提高处理器的性能。
此外,以这种方式选择指令不会在处理器中引入任何额外的延迟。特别地,即使在将不同类型的指令分离到单独的指令队列之后,选择和发布过程也能够在单个周期中完成。
现在参照图1,图1示出了单线程无序处理器100,其中将为一些类型的指令赋予优于其他指令的优先级。
处理器100包括:提取级102,其配置为从如程序计数器(PC)所指示的程序(按程序的次序)提取指令;以及解码与重命名级104,其布置成解释指令并且执行寄存器重命名。如本领域技术人员所公知的,通过去除一些相关性,诸如读后写(WAR)相关性,寄存器重命名使更多的指令能够被无序地执行。
在指令通过了解码与重命名级104之后,指令被:(a)插入重排序缓冲器106(ROB)中;以及(b)分发给保留站108a、108b或108c中的一个。
重排序缓冲器106是一种能够使得指令被无序地执行但是有序地提交的缓冲器。重排序缓冲器106按程序次序保持插入其中的指令,但是ROB106内的指令能够通过功能单元110a、110b和110c不按顺序地执行。在指令由功能单元110a、110b和110c执行之后,按程序次序将指令从重排序缓冲器106a输出到提交级112。提交级112随后将指令的结果提交给寄存器/存储器。
在一些示例中,重排序缓冲器106能够形成为循环缓冲器,其具有指向ROB 106中的最老指令(头指令)的头指针,以及指向ROB 106中的最年轻指令(尾指令)的尾指针。在这些示例中,当头指令已经由功能单元110a、110b和110c执行时,这些头指令从ROB 106的头部输出,并且头指针增量而指向ROB 106中的下一指令。
每个保留站108a、108b和108c都接收来自解码与重命名级104的指令并且将指令发布到对应的功能单元110a、110b或110c以便执行。虽然图1的处理器100包括三个保留站108a、108b和108c,但其他处理器可以具有更多或更少的保留站。
此外,虽然图1分别示出了保留站108a、108b和108c与功能单元110a、110b和110c之间的一对一关系,但在其他情况下,在保留站108a、108b和108c与功能单元110a、110b和110c之间可能存在一对多关系。例如,在一些情况下,保留站108a、108b或108c中的至少一个可配置为将指令提供给多个功能单元110a、110b和/或110c。在其他情况下,可以仅存在单个保留站108a、108b或108c,其被配置为将指令提供给所有的功能单元110a、110b和110c。
在本文所描述的实施例中,各保留站108a、108b和108c配置成基于指令类型将从解码与重命名级104接收到的指令分类到多个指令队列中。在每个时钟周期,保留站108a、108b或108c试图从指令队列中选择多个指令以发布给对应的功能单元110a、110b或110c以便执行。在一些情况下,保留站108a、108b或108c配置成从指令队列中选择指令以使一些类型的指令优先于其他指令。
各功能单元110a、110b和110c负责执行指令,并且可以包括一个或多个功能单元管线。功能单元110a、110b和110c可配置成执行特定类型的操作或者它们可以是通用的功能单元。例如,一个或多个功能单元110a、110b和110c可以是装载/存储单元、整数单元、浮点单元(FPU)、数字信号处理(DSP)/单指令多数据(SIMD)单元、或乘累加(MAC)单元。装载/存储单元执行装载和存储存储器操作,整数单元执行整数运算,FPU执行浮点运算,DSP/SIMD单元具有多个处理元件,其同时对多个数据点执行相同的操作,并且MAC单元计算两个数的乘积并且将该乘积与累加器相加。功能单元110a、110b和110c以及其中的管线可具有不同的长度和/或复杂度。例如,FPU管线通常比整数执行管线长,因为其通常执行更复杂的操作。
将参照图2对示例性保留站108和关联的功能单元110进行说明。
处理器100还包括分支预测器114,其配置为预测在为已知引起可能的流程变化的指令(诸如分支指令)的情况下程序流将采取哪个方向。分支预测是有用的,因为其使得能够在分支指令的结果已知之前通过处理器100推测地执行指令。分支预测器114可与提取级102、解码与重命名级104和/或功能单元110a、110b和110c通信。例如,提取级102可以使用来自分支预测器114的信息来确定接着提取哪个指令;解码与重命名级104可以将指示哪些指令是分支指令的信息提供给分支预测器114(在其他情况下,可以在提取级102中将指令解码);并且功能单元110a、110b和110c可以为分支预测器114提供指示程序计数器的更新的信息。
当分支预测器114精确地预测出程序流时,这提高了处理器100的性能。然而,如果分支预测器114没有正确地预测出分支方向,则出现了误预测,在程序能够继续之前,需要校正误预测。为了校正误预测,送到ROB106的推测指令被抛弃,并且提取级102开始从正确的程序分支提取指令。
现在参照图2,图2示出了图1的示例性保留站108和关联的功能单元110。如上所述,保留站108以使得一些类型的指令优先于其他类型的指令的方式将指令发布给功能单元110以便执行。
保留站110包括:指令分类器202,其基于指令类型将从解码与重命名级104接收到的指令分类成多个类别中的一个;多个指令队列204-210,用于在具体类别存储指令;以及指令调度器212,用于从指令队列204-210中选择就绪指令并且将它们发布给功能单元110以便执行。
如上文简要描述的,指令分类器202从解码与重命名级104接收指令;基于指令类型将每个指令分类成多个类别中的一个;并且将每个分类的指令发送到对应于所分配类别的指令队列204-210。在一些情况下,解码与重命名级104使用指令的操作代码(“操作码”)来确定指令类型。解码与重命名级104随后在提供给保留站108的数据中提供指令类型的指示。在其他情况下,解码与重命名级104将操作码提供给保留站108,并且指令分类器202使用操作码来标识指令类型。
在一些情况下,指令分类器202使用从解码与重命名级104接收到的信息(例如,指示符或操作码)来标识以下类型指令中的至少一个:控制转移指令、地址生成指令、以及标记设定指令。控制转移指令是修改程序计数器(PC)以改变程序的控制流的指令,诸如分支指令。地址生成指令是解决装载和存储指令的存储器地址的指令。仅仅在这些指令执行之后,才能够成功地执行装载或存储操作。标记设定指令是修改存储在标记寄存器中的指示处理器状况的状态标记的指令。
在其他情况下,指令分类器202可以使用从解码与重命名级104接收到的信息(例如,指示符或操作码)来标识更多、更少或其他的指令类型。
在一些情况下,对于所标识的每个指令类型可有一个类别(例如,控制转移指令类别、地址生成指令类别、以及标记设定指令类别),而对于所有其他指令有一个总类别。在其他情况下,对于所标识的一个或多个类型的指令可有一个类别(例如,控制转移指令、地址生成指令和标记设定的指令类别;或控制转移指令的类别和地址生成与标记设定指令的类别),而对于所有其他指令有一个总类别。
虽然在本文中描述了指令分类器202执行指令的分类,但是在其他示例中,可以通过处理器100的另一部件来执行分类,诸如解码与重命名级104。在这些示例中,除了从解码与重命名级104接收指令本身之外,指令分类器202还可以接收指示指令已分类成哪个类别的信息。指令分类器202随后基于从解码与重命名级104接收到的分类信息而将接收到的指令发送到适当的指令队列。
各个指令队列204-210从指令分类器202接收特定类别的指令,并且将各指令存储在可用条目或槽中。指令可以按它们从指令分类器202接收到的次序而存储在指令队列中。因为指令分类器202通常按程序次序从解码与重命名级104接收并处理指令,所以指令可以按程序次序存储在指令队列204-210中。
通常每个类别存在一个指令队列204-210。在图2的示例性保留站108中,存在四个指令类别(例如,上述标识的每个指令类型各一个),因此存在四个指令队列204-210。例如,第一指令队列204(指令队列0)可以用于控制转移指令,第二指令队列206(指令队列1)可用于地址生成指令,第三指令队列208(指令队列2)可用于标记设定指令,而第四指令队列210(指令队列3)可用于所有其他指令。然而,在其他示例中,保留站108可以具有更多或更少的指令队列。
指令在指令队列中等待,直到其输入操作数值可用。特别地,保留站108可以监控功能单元110的输出以为指令队列中每个指令找到丢失操作数(就绪位设定为0的操作数)的匹配。一旦保留站108找到丢失操作数的匹配,其将该操作数的就绪位设定为1。在一些情况下,保留站108还将来自功能单元110输出的操作数复制到指令队列。在其他情况下,在指令已经发布到功能单元110之后,从适当的寄存器文件读取操作数值。例如,管线214-220的第一级可以配置为从适当的寄存器文件读取操作数值。相对于从功能单元110输出复制操作数值的情况,这可以减少功能单元110与保留站108之间的连接的数量。
一旦指令的所有操作数值可用,则将指令视为准备执行就绪,并且该指令的就绪位可以设定成指示该指令准备就绪发布给功能单元110。指令的操作数值可在较早的、较老的指令的操作数值之前可用,允许其在那些较早的、较老的指令之前离开指令队列。
将参照图3来描述示例性指令队列204。
图2的示例性保留站108还包括指令调度器212,其将来自指令队列204-210的就绪指令发布到功能单元110以便执行。
功能单元110包括用于执行指令的一个或多个类似管线214-220。图2的示例性功能单元110包括编号为0至3的四个管线214-220;然而,在其他示例中,功能单元110可以包括更多或更少的管线。
在每个时钟周期,指令调度器212试图为每个管线214-220提供来自指令队列204-210中的一个的指令。例如,在功能单元110包括如图2所示的四个管线214-220的情况下,指令调度器212试图从指令队列204-210中选择四个就绪指令并且将所选指令之一发布给各管线214-220。
在许多无序处理器中,保留站仅包括单个指令队列,并且选择队列中的最老的就绪指令以发布给管线214-220。尽可能快速地发布队列中的最老指令确保了重排序缓冲器106不会填满并且拖延解码与重命名级104发送指令。然而,这不能确保处理器的最优性能。特别地,已经确证,尽可能快速地执行一些类型的指令(例如,控制转移指令、标记设定指令和地址生成指令),可以显著地提高处理器的性能,即使它们比其他就绪指令更年轻。这是因为,一旦这些指令已经发布,它们就释放出可由其他指令使用的其他资源。
特别地,已经观察到,误推测(即,不正确地预测)的控制转移指令具有成本高的恢复开支,因此尽可能快速地执行控制转移指令可以使得性能显著提高,即使它们比其他就绪指令更年轻。对于标记设定指令和地址生成指令做出了类似的观察。
因此,图2的指令调度器212配置为以即使一些类型的指令比其他就绪指令年轻也优先这些指令的方式从指令队列204-210中选择就绪指令。在一些情况下,指令队列204-210从最高优先级到最低优先级优先排列,并且指令调度器212按优先级次序从指令队列中选择就绪指令。例如,如果指令队列204-210被从最高优先级到最低优先级按如下次序优先化,即,指令队列0、指令队列1、指令队列2和指令队列3,则指令调度器212可以首先从指令队列0中选择就绪指令,然后是指令队列1,然后是指令队列2,然后是指令队列3。
在一些情况下,指令队列204-210的优先级可以预先确定或固定,在其他情况下,可以动态地调节优先级。
特别地,在一些情况下,指令队列204-210的优先级可以通过离线测试和/或性能分析来确定,然后在处理器中预先确定或固定。例如,本领域技术人员已知的是,无论怎样仔细选择指令集体系结构(ISA)和微型体系结构,一些指令(例如,控制转移指令)会导致性能瓶颈。通过对所选微型体系结构对所关注的基准应用的性能的影响进行详细分析,可以按个案的基础视适合的情况来优先化指令。在一些情况下,可通过检查指示处理器在任意既定时间的状况的多个参数来确定一些指令的相对优先级。
详细分析已表明,在一些情况下,如果与控制转移指令相关联的指令队列被赋予最高优先级、与标记设定指令相关联的指令队列被赋予次高优先级、与地址生成指令相关联的指令队列被赋予第三高优先级、且与所有其他指令相关联的指令队列被赋予最低优先级,则能够实现最优性能。
在其他情况下,处理器可以包括附加的部件,诸如自动MIPS分配器(AMA),其监控处理器的整体性能,并且对指令调度器212生成规定指令队列204-210的优先级来实时优化指令执行的适当的控制信号。
在一些情况下,如果指令调度器212能够从一个或多个较高优先级队列中选择足够的就绪指令,则其甚至可以不试图从较低优先级队列中选择指令。例如,在如图2所示的关联的功能单元110中存在四个管线且指令调度器212能够从最高优先级队列(例如,指令队列0)和次高优先级队列(例如,指令队列1)中集体地获得四个就绪指令的情况下,则指令调度器甚至可以不试图从两个较低优先级指令队列(例如,指令队列2和指令队列3)中选择就绪指令。
指令调度器212通常配置成从任何特定指令队列204-210中选择最老的就绪指令,但是,在一些情况下,指令调度器212可配置成利用其他标准从特定的指令队列中选择指令。然而,如果使用规则和例外的复杂集,则利用其他标准来选择指令会使得指令调度器212放缓(并且超过单个时钟周期的时间段)。在一些情况下,指令调度器212可以利用不同的标准从不同的指令队列中选择指令(即,其可以从一个队列中选择最老的就绪指令并且利用其他标准来从另一队列中选择指令),然而,这会增加指令调度器212的复杂度和/或使其更慢。
在一些情况下,可以对在时钟周期中可从特定指令队列中选择的指令的数量进行限制。可以这样做的原因在于:(a)因为优先化某类型的多于一个的指令,存在最小性能益处;和/或(b)抢先一个或多个低优先级队列被饿死的可能性(例如,特定队列中的指令永不被发布给功能单元110)。例如,在保留站108具有专用于控制转移指令的指令队列的情况下,指令调度器212可配置成在任意时钟周期中从控制转移指令队列选择最多一个就绪指令。这是因为,经确证,由于第二控制转移指令极可能比第一控制转移指令更年轻,所以与从另一指令队列中发布更老的指令相比,优先化多于一个的控制转移指令的性能益处不大。
当选择指令以发布给功能单元时,指令调度器212评定多个指令以判定它们是否有资格发布。通常,如果指令就绪且尚未发布,则该指令就有资格发布。判定指令是否就绪且尚未发布可以包括:查看指令队列的就绪列和已发布列(如参照图3所描述的)。然而,指令调度器212通常仅能够根据处理器100的时钟频率来评定每个时钟周期内的指令的最大数量Wmax。
在一些情况下,为确保指令调度器能够在一个时钟周期内评定来自全部指令队列204-210的指令,将在任意既定指令队列中所能够评定的指令数量限制为最大数量Wi,其中i是指令队列号。例如,在第一指令队列204(指令队列0)中可以评定最多W0个指令,并且在第二指令队列206(指令队列1)中可评定最多W1个指令。对指令队列204-210施加的限制可以相同或不同。
无论最大数在各指令队列中是相同还是不同,最大数(Wi)之和不能超过在任意一个周期中指令调度器212所能够评定的指令的最大数量(Wmax)。这由显示于下面的等式(1)表示,其中X是指令队列的数量。
在对特定指令队列204-210中所能够评定的指令数量存在限值(Wi)的情况下,当指令调度器212正从特定指令队列204-210选择就绪指令时,当指令调度器212已经对该特定指令队列评定了指令的最大数量(Wi)时,指令调度器212可以停止在该特定指令队列中评定指令。一旦停止在特定队列中评定指令,指令调度器212可以移至次高优先级指令队列以查找指令以发布给功能单元110。
参照图4对可以通过指令调度器212来实现的从多个指令队列中选择指令的方法进行说明。
现在参照图3,图3示出了图2的示例性指令队列204。指令队列204可以配置为具有多个行302-332以及列334-338的表。每行或条目302-332可保持与单个指令有关的信息。在一些情况下,指令按它们被接收到的次序存储在指令队列204中。因为指令分类器202通常按程序次序从解码与重命名级104接收和处理指令,所以指令队列204可以按程序次序来接收和存储指令。因此,较老的指令将被插入到较年轻的指令之前。在图3所示的示例中,指令0是最老指令,指令15是最年轻指令。
列334-338用来为每个指令存储特定信息。在图3所示的示例中,存在三个列:指令列、就绪列和已发布列,然而在其他示例中,可存在更多、更少或不同的列。例如,在一些实施例中(例如,在指令一被发布就从指令队列中去除的情况下),指令队列可不包括已发布列。
指令列334用来保持描述由功能单元110(例如,管线)使用来执行指令的指令的信息。该信息可以包括指令代码以及用于该指令的输入和输出操作数。指令列334可以通过任何适当的方式来实现。
就绪列336用来指示指令是否就绪以发布给功能单元110。如上所述,当其全部输入操作数可用时,将指令视为准备就绪以发布给功能单元110。就绪列336可以通过任何适当的方式来实现。例如,在一些情况下,就绪列336可以实现为单一位,在其他情况下,就绪列336可以实现为布尔值。当指令最初从指令分类器202接收到时,其操作数值通常不可用。因此,就绪列可以初始地被设定(例如,设定成“0”或“假”)以指示指令未准备就绪。当输入操作数随后变得可用时,就绪列可被设定(例如,设定成“1”或“真”)以指示指令准备就绪以发布给功能单元110。
已发布列338用于指示指令是否已发布给功能单元110。已发布列338可通过任何适当的方式来实现。例如,在一些情况下,已发布列338可以实现为单一位,在其他情况下,已发布列338可以实现为布尔值。当指令最初从指令分类器202接收到时,已发布列可以被设定(例如,设定成“0”或假)以指示指令尚未发布给功能单元110。一旦指令已发布,则已发布列338可被设定(例如,设定成“1”或“真”)以指示指令已发布给功能单元110。
指令可保留在指令队列204中,直至(i)其已发布;或者(ii)直至其已发布且随后被另一指令覆写。
如果指令就绪且其尚未发布给功能单元110,则通常仅选择指令发布给功能单元110。
在一个时钟周期中可通过指令调度器212评定的指令队列204(指令队列0)中的指令数量W0受限制的情况下,可以建立窗口以限定待评定的W0个指令。该窗口可由指向头指令(也称为起始指令)的头指针和指向尾指令(也称为结束指令)的尾指针来限定。在一些情况下,头指令可以是指令队列204中尚未发布的最老指令,尾指令可以是指令队列204中的在紧接着头指令之后的第(W0-1)个指令。
第一个示例用于阐述该构思。特别地,如果在图3的指令队列204中能够评定最多四个指令(例如,W0=4),则窗口的头指针340可指向指令2(头指令),因为该指令是指令队列204中最老的未发布指令,并且窗口的尾指针342可以指向指令5(尾指令),因为其是紧接着头指令之后的第三(例如,W0-1=4-1=3)个指令。在该示例中,当指令调度器212试图从该指令队列204(例如,指令队列0)中选择指令时,指令调度器212评定指令2至5,一次评定一个,直到:(a)其已经选择了足够的就绪指令来填充管线(例如,每个管线各一个),(b)其已经从该队列选择了最大数量的指令(如果已经为该指令队列分配了最大值),或者(c)其已经评定了指令5(例如,其已经评定了该指令队列的最大编号的指令)。一旦满足这些条件之一,则指令调度器212停止在指令队列204中搜索要发布的指令。如果满足条件(a),则指令调度器212可以将已选指令发布给功能单元110。然而,如果满足条件(b)或(c),则指令调度器212可以移至下一较低优先级的指令队列(如果存在较低优先级的指令队列)以继续查找要发布给功能单元110的指令。
在其他情况下,窗口的头指令可以是指令队列204中最老的就绪而未发布指令,窗口的尾指令可以是指令队列中紧接着头指令之后的第(Wi-1)个指令。这些情况可能比窗口的头指令是指令队列204中的最老而未发布指令的情况需要更多的逻辑,但是这会使得更高效地利用指令调度器212的资源,因为指令调度器212没有浪费时间来评定尚未准备发布就绪的较老指令。
第二个示例用来阐述该构思。特别地,如果在图3的指令队列204中能够评定最多七个指令(例如W0=7),则窗口的头指针344可指向指令3(头指令),因为该指令是指令队列204中最老的准备就绪而未发布的指令,并且窗口的尾指针346可指向指令9(尾指令),因为该指令是指令队列204中紧接在头指令之后的第六(W0-1=7-1=6)个指令。在该示例中,当指令调度器212试图从该指令队列204(例如,指令队列0)中选择指令时,指令调度器212评定指令3至9,一次评定一个,直到满足以下条件之一:(a)其已经选择了足够的就绪指令来填充管线(例如,每个管线各一个),(b)其已经从该队列中选择了最大编号的指令(如果已经为该指令队列分配了最大值),或者(c)其已经评定了指令9(例如,其已经评定了该队列的最大编号的指令)。一旦这些条件之一满足,指令调度器212就停止在该指令队列中搜索待发布指令。如果满足条件(a),则指令调度器212可以将所选指令发布给功能单元110。然而,如果满足条件(b)或(c),则指令调度器212可以移至下一较低优先级的指令队列(如果存在较低优先级的指令队列)以查找要发布给功能单元110的额外指令。
现在参照图4,图4示出了通过图2的指令调度器212执行的用于从指令队列204-210中选择指令以发布给功能单元110的方法400。在图4的方法400中,指令调度器212按就绪指令的优先级次序搜索指令队列204-210以发布给功能单元110。
如果满足以下条件中任一个,则指令调度器212可停止搜索特定队列:(a)已经选择了最大数量的指令(例如,所选指令数量等于功能单元中管线的数量);(b)已经选择了特定队列的最大数量的指令(例如,指令队列可对能够从该指令队列选择的指令数量设有限制);以及(c)已经评定了该特定队列的最大数量的指令(例如,指令队列可对能够在一个时钟周期中评定的该指令队列中的指令数量设有限制)。如果满足条件(a),则指令调度器212可以将所选指令发布给功能单元110。然而,如果满足条件(b)或(c),则指令调度器212可以进行到次高优先级的指令队列以搜索准备发布就绪的指令。
条件(b)仅在将所选指令数量的限制已施加到正在搜索的特定队列上的情况下才适用。类似地,条件(c)仅在将可评定的指令数量的限制已施加到正在搜索的特定队列上的情况下才适用。
下面参照步骤402至426来更详细地描述这种情况。
在步骤402中,指令调度器212访问具有最高优先级的指令队列。利用图2作为例子,如果指令队列204-210被从最高优先级到最低优先级按以下次序优先化,即,指令队列0、指令队列1、指令队列2和指令队列3,则指令调度器212访问指令队列0。一旦指令调度器212访问了具有最高优先级的指令队列,则方法400进行到步骤404。
在步骤404中,指令调度器212评定起始指令或头指令以判定是否应当选择它来发布给功能单元110。如上文参照图3所述的,在一些情况下,头指令可以是指令队列中最老的未发布指令(例如,图3的指令2)。在其他情况下,头指令可以是指令队列中最老的就绪而未发布的指令(例如,图3的指令3)。一旦指令调度器已经评定了头指令,则方法400进行到步骤406。
在步骤406中,指令调度器212判定在步骤404中评定的指令是否就绪(例如,其是否准备就绪以发布给功能单元110以便执行)而未发布(例如,其尚未发布给功能单元110以便执行)。如果指令准备就绪而未发布,则方法进行到步骤408。然而,如果指令未准备就绪或已经发布,则方法进行到步骤420。
在步骤408中,指令调度器212选择了在步骤404中评定的指令以发布给功能单元110并且更新指令队列计数器。指令队列计数器跟踪已从当前正评定的指令队列(“当前指令队列”)中选择的指令数量。在一些情况下,更新指令队列计数器可以包括将指令队列计数器增量。一旦指令队列计数器更新,则方法400进行到步骤410。
在步骤410中,指令调度器212更新所选的指令计数器。所选的指令计数器对已经从所有指令队列中选择用来发布的指令的数量进行跟踪。在一些情况下,更新所选的指令计数器包括将所选的指令计数器增量。一旦所选的指令计数器更新,则方法400进行到步骤412。
在步骤412中,指令调度器212判定是否已从所有的指令队列中选择了最大数量的指令。在任一时钟周期中能够选择的指令的最大数量通常与关联的功能单元110中的管线(例如,管线214-220)的数量相等。这是因为,在一个时钟周期中仅一个指令能够发布给每个管线(例如,管线214-220)。因此,如果功能单元110具有如图2所示的四个管线214-220,则指令的最大数量可等于四个。
判定是否已选择了最大数量的指令可以包括:将所选指令计数器与管线数量进行比较。如果所选指令计数器等于管线的数量,则指令调度器212停止查找更多的指令并且将所选指令发布给管线。然而,如果所选指令计数器小于管线数量,则指令调度器212可以继续查找指令以发布给功能单元110。
如果判定出已经选择了最大数量的指令,则方法400进行到步骤414。然而,如果判定出尚未选择最大数量的指令,则方法400进行到步骤418。
在步骤414中,所选指令发布给功能单元110以便执行。在一些情况下,指令调度器212试图将一个所选指令发布给功能单元110的管线214-220中的每一个。例如,如果存在如图2所示的四个管线且选择了四个指令,则一个所选指令发布给每个管线。然而,如果存在四个管线且仅选择了三个指令,则一个所选指令发布给三个管线中的每一个。
哪个指令发布给哪个管线通常无关紧要。然而,在一些情况下,将需要额外或特殊资源的指令发布给特定的管线或管线组是有益的。
例如,在一些情况下,有益的是,将诸如分支指令的控制转移指令发布给特定的管线或管线组以降低簿记(book-keeping)和可用管线之间的同步的成本。特别地,控制转移指令可以发布给特定管线,从而最小化和/或消除簿记以及管线之间跟踪控制转移指令的‘挤入’(在此情况下,在执行时这些指令的输入操作数实际上未准备就绪)所需的同步;并且防止较年轻的控制转移指令超过较老的控制转移指令。
在步骤416中,所选的指令计数器被复位(例如,归零)。一旦指令计数器已经复位,则方法400结束。
在步骤418中,在已选择指令以进行发布且已经判定出尚未选择来自所有指令队列的最大数量的指令之后,指令调度器212判定是否已从当前正评定的指令队列中选择了最大数量的指令。
判定是否已选择了当前正评定的指令队列的最大数量的指令可以包括:将指令队列计数器与可从当前指令队列中选择的指令的最大数量进行比较。如果指令队列计数器等于指令的最大数量,则指令调度器212可停止从该指令队列中查找更多的指令。然而,如果指令队列计数器小于指令的最大数量,则指令调度器212可以继续从该指令队列中查找指令以发布给功能单元110。
如果判定出已经从该指令队列中选择了最大数量的指令,则方法400进行到步骤424,在该步骤中指令调度器212可以继续从另一指令队列中查找指令。然而,如果判定出尚未从该指令队列中选择最大数量的指令,则方法400进行到步骤420,在该步骤中指令调度器212可以继续从当前指令队列中搜索指令。
步骤418是任选的。特别地,该步骤仅适用于在特定时钟周期中可从该指令队列选择的指令数量受限制的指令队列。如果可从当前指令队列中选择的指令数量未受限制,则步骤418可以不执行,并且方法400可直接进行到步骤420。
在步骤420中,在已经选择了指令以进行发布且已经判定出尚未选择来自所有指令的最大数量的指令、且尚未选择来自当前指令队列的最大数量的指令之后,或者,在已经评定了指令而未选择之后,指令调度器212判定最近期评定的指令是否是尾指令。如上文所描述的,尾指令是继头指令之后的第(Wi-1)个指令,其中Wi是在一个时钟周期中在第i指令队列中能够评定的指令的最大数量。如果最近期评定的指令是尾指令,则已经达到了可在当前指令队列中评定的指令的最大数量。
如果判定出已经评定了最大数量的指令,则方法400进行到步骤424,在该步骤中指令调度器212可以继续从另一指令队列中搜索指令。然而,如果判定出尚未评定最大数量的指令,则方法400进行到步骤422,在该步骤中指令调度器212继续从该指令队列中查找指令。
步骤420是任选的。特别地,该步骤仅适用于已对在一个时钟周期中可评定的指令的数量施加了限制的那些指令队列。如果未对可在当前指令队列中评定的指令数量进行限制,则步骤420可不执行,并且方法可直接进行到步骤422。
在步骤422中,对当前指令队列中的下一指令进行评定。在一些情况下,下一指令是当前指令队列中紧接在最近期评定的指令之后的指令。一旦已经评定了下一指令,则方法返回到步骤406。
在步骤424中,(a)在已经选择了指令以进行发布且已经判定出尚未选择来自所有指令队列的最大数量的指令、但是已经选择了用于当前指令队列的最大数量的指令之后,或者(b)在已经评定了当前指令队列的最大数量的指令之后,指令调度器212判定是否存在优先级比当前指令队列低的任何指令队列。
如果存在优先级比当前指令队列低的至少一个指令队列,则方法400进行到步骤426,在该步骤中指令调度器212在次高优先级的指令队列中查找指令。然而,如果不存在优先级比当前指令队列低的更多的指令队列,则方法400进行到步骤414,在该步骤中,所选的指令发布给功能单元110。
在步骤426中,指令调度器212访问相对于当前指令队列的次高优先级的指令队列。一旦指令调度器212已经访问了次高优先级的指令队列,则方法进行到步骤404,在该步骤中,评定指令队列中的指令以判定它们是否适合发布到功能单元110。
在每个时钟周期,可以重复方法400。
虽然方法400描述了指令调度器212基于优先级顺序地访问队列并且顺序地评定特定队列中的指令,但是在其他示例中,指令调度器可以包括如下硬件:(i)通过允许指令调度器212在评定当前指令的同时确定关于队列中下一指令的信息,加速特定队列中的指令的评定;(ii)允许其并行地评定队列中的多个指令;和/或(iii)允许其并行地访问且评定多个队列中的指令。
在其他示例中,指令调度器212可以使用标准选择逻辑(例如,如Yamaguchi等人的‘Delay Evaluation of Issue Queue in Superscalar Processors with Banking TagRAM and Correct Critical Patch Identification’所描述的,该文献于2012年9月公开于IEICE TRANS.INF.&SYST.第E95-D卷第9期)来从每个队列内选择指令,使得每个周期选择共N个指令(每个管线各一个)。虽然上面描述的示例涉及到单线程无序处理器,但是本文所描述的方法和原理可同等地应用于多线程无序处理器。
现在参照图5,图5示出了多线程无序处理器500的示意图。处理器500包括两个线程502和504,这两个线程在本文分别称为线程0和线程1。每个线程502和504都包括提取级506或508、解码与重命名级510或512、重排序缓冲器514或516、提交级518或520、以及分支预测器522或524,如上文参照图1所描述的。线程502和504共享如上文参照图1所述的保留站526a、526b和526c,以及功能单元528a、528b和528c。而且,如上所述,每个功能单元528a、528b和528c可以包括用于执行发布给功能单元528a、528b或528c的指令的一个或多个管线(未示出)。
每个解码与重命名级510和512分析每个提取的指令,然后将指令分发到适合的保留站526a、526b或526c。依照上文参照图2至图4所描述的原理和方法,每个保留站510和512基于指令类型将接收到的指令分类成多个类别;将每个类别的指令存储到单独的指令队列中;以即使一些类型的指令比其他指令更年轻也使得该类型的指令优先于其他指令的方式从指令队列中选择指令;以及将所选指令发布给关联的功能单元528a、528b或528c。
在一些情况下,每个线程可具有单独的一组类别和关联的指令队列,但是对于每个线程类别组可相同(例如,控制转移指令类别、地址生成指令类别、标记设定指令类别、以及通用指令类别)。这些不同队列的示例显示在图6中的上方示意图601中。在该示例中,存在两个线程,即线程0和线程1,以及对于每个线程有三个队列602a-606a、602b-606b,一个队列用于分支指令(队列602a、602b),一个队列用于地址生成指令(队列604a、604b),一个用于通用(GP)指令(队列606a、606b)。在这些情况中,对于每个线程可存在一个依照上面参照图2至图4描述的原理从其关联的指令队列中选择指令的指令调度器。在这些情况中,保留站526a、526b和526c还可以包括仲裁单元(未示出),其依照一组规则从两个线程中选择指令。例如,该仲裁单元可以基于推测性的每个线程的指令如何如递交于2013年1月21日的、Jackson等人的共同未决英国专利申请“ALLOCATING RESOURCES TO THREADS BASED ONSPECULATION METRIC”中所描述的那样来从两个线程中选择指令。
在多线程处理器(或处理器核)的示例方案中,可存在两个线程(线程0和线程1)以及用于线程0的四个队列和用于线程1的4个队列(例如,四个类别中的每一个各一个队列:控制转移指令、地址生成指令、标记设定指令、以及通用指令)。在该示例中,存在四个管线,它们在线程0和线程1之间共享,因此通常2个管线可用于线程0,2个管线可用于线程1。
以线程0开始,来自每个队列的一个指令可发布到可用于线程0的2个管线中的每一个中,或者如果在更高优先级的队列中存在额外的就绪指令,则可以存在从该队列发布的多于一个的指令,使得不从一个或多个最低优先级队列发布任何指令(例如,来自最高优先级队列的1个指令、来自次高优先级队列的1个指令,以及没有来自其余两个较低优先级队列的指令)。类似地,基于这些队列的相对优先级,从用于线程1的4个队列中的一个或多个中发布用于线程1的指令。如果任一线程都不具有充足的就绪指令,则另一线程占据其管线(例如,如果线程0仅具有1个就绪指令,则线程1可以发布3个指令)。
虽然这是从按优先级次序从单独的队列中发布就绪指令的方面来描述的,但是这在构思上等同于将对于线程而言所有有资格的指令组合到一个队列中,指令按其类别的优先级次序布置并且从该队列中发布。该过程对于每个线程来进行并且在图6中的下方示意图610中通过图形方式表征。在该下方图中,用于每个线程的每个合并队列611a、611b包括来自单独的队列602a-606a、602b-606b(在上方图601中)的每个的就绪指令,指令基于单独的队列的相对优先级定序,例如,就绪的分支指令612a、612b(来自队列602a、602b),之后是就绪的地址生成指令614a、614b(来自队列604a、604b),之后是就绪的通用指令616a、616b(来自队列606a、606b)。
一般地,哪个指令发布给哪个管线无关紧要。然而,在一些情况下,来自特定线程的指令可按预定次序发布给管线。例如,如果存在编号为0至3的四个管线,则从第一线程(例如,线程0)选出的任意指令可首先发布给第一管线(例如,管线0),然后按升序发布给后续管线(例如,管线1);并且从第二线程(例如,线程1)选出的任意指令可首先发布给最后一个管线(例如,管线3),然后按降序发布给后续的管线(例如,管线2)。
因为功能单元528a、528b和528c中的每个管线能够以来自多于一个线程的指令告终,所以当指令调度器将指令发布给管线时,其还可以为管线提供指令与哪个线程相关联的指示。然后,如果不正确预测的指令出现而需要管线反绕,则管线能够反绕或清除仅那些与具有不正确预测的指令的线程相关联的指令而不是反绕全部的指令。在一些情况下,可允许不正确预测的指令在管线中继续,直到所有指令上行,直到不正确预测的指令已经执行。在该点上,来自特定线程的管线和保留站526a、526b或526c中的所有指令已经出现在不正确预测的指令之后并且需要反绕或清除。
在上面所描述且针对多线程处理器(或处理器核)的方法的变型例中,相同类别但是用于不同线程的指令可组合以通过将来自每个类别的单独队列的指令交错而形成用于该类别的单个队列。这可以参照图7来描述。在图6的上方图601(上面已说明)中,每个线程以及每个类别存在一个队列;然而,如图7的上方图701所示,对于所有线程对于每个类别存在一个队列:一个队列用于分支指令602c,一个队列用于地址生成指令604c,一个队列用于通用指令606c。如图7中的每个队列602c、604c、606c上的横线所指示,这些队列包括来自两个线程即线程0和线程1的交错指令。
通过以此方式组合线程的队列(即,通过交错),可以将特定类别的指令(来自线程0和线程1)优先于来自任一线程的所有其他指令。当选择指令进行调度时,指令调度器按优先级减小次序评定交错的队列并且利用上述方法来选择用于发布的指令。
这能够利用与上文相同的示例方案来进一步描述,2个线程(线程0和线程1),4个管线,线程0有4个队列,线程1有4个队列。4个管线在线程0与线程1之间共享,但是线程0的2个管线以及线程1的2个管线没有保留。
在判定要发布哪些指令时,按优先级减小次序评定交错的队列,因此,例如,如果来自线程0的1个分支指令和来自线程1的3个分支指令准备发布,则该周期将发布全部4个分支指令。相反,不通过交错,将从线程0发布1个分支指令,然后从线程0发布地址生成指令,并将从线程1发布2个分支指令。
通过将来自每个线程的指令交错,两个线程具有同等的优先级,并且基于队列的相对优先级(或者限定队列的类别)来发布指令。
以与之前的示例类似的方式,虽然这是从按优先级次序从单独的队列(602a、604c、606c)发布就绪指令这方面来描述的,但这在构思上等同于将所有线程的所有有资格的指令组合到一个队列中,指令按其类别的优先级次序布置且交错(对于每个类别内的不同线程)并且从该队列发布。该过程在图7的下方示意图710中以图形方式表示。在该下方图中,每个合并的队列包括来自每个单独的队列602c-606c的就绪指令(在上方图701中),基于单独队列的相对优先级来对指令定序,例如,交错的就绪分支指令702(来自队列602c),之后是交错的就绪地址生成指令704(来自队列604c),之后是交错的就绪通用指令706(来自队列606c)。
利用如上所述的来自各线程的指令的交错,资源可以是专用的并且基于指令类型(例如,基于类别)来优先化指令;同时仍赋予每个线程在类别内的同等优先级。否则,如果不使用交错,则来自一个线程的不太重要的指令可在来自另一线程的较高优先级的指令之前发布,因为指令调度器试图在线程之间同等地共享资源,除非就绪指令不充足。如参照图6和图7所描述的,交错因此可以使得处理器性能提高。
将理解的是,当实现上述方法时,在硬件中可能不存在真实的交错队列;然而,交错队列在构思上描述了指令调度器选择用于发布的就绪指令的方式。
本文给出的任何范围或设备值可扩大或改变,而不失去所追求的效果,这对本领域技术人员是显而易见的。
将理解的是,上述的益处和优点可涉及到一个实施例或者可以涉及到多个实施例。实施例不限于那些解决了任意或全部所陈述问题的实施例或者那些具有任意或全部的所陈述益处和优点的实施例。
对“一”项的任何提及是指那些项中的一个或多个。术语“包括”在此处用来表示包含所标识出的方法框或要素,但是这样的框或要素不包括排他列表,装置可以包含额外的框或要素,并且方法可以包含额外的框或操作。
对“逻辑”的特定指代是指执行一项或多项功能的结构。逻辑的示例包括布置成执行那些功能的电路。例如,这样的电路可以包括在制造过程中可用的晶体管和/或其他硬件元件。这种晶体管和/或其他元件可以用来形成实现和/或包含存储器的电路或结构,例如是寄存器、触发器、锁存器,逻辑运算器,诸如布尔运算、数学运算器,诸如加法器、乘法器或移位器,并且互连,这仅是举例说明。这些元件可提供作为定制电路或标准单元库、宏或其他抽象级。这些元件可以在具体布置中相互连接。逻辑可以包括为固定功能的电路,并且电路可被编程以执行一项或多项功能;这些编程可从固件或软件更新或控制机制来提供。标识为执行一项功能的逻辑还可以包括实现构成功能或子过程的逻辑。在示例中,硬件逻辑具有实现固定功能操作、或多个操作、状态机或过程的电路。
本文所描述的方法的步骤可以按任何适合的次序来执行,或者在适当情况下同时执行。另外,单个的框可以从任意方法中删除,而不偏离本文所描述的主题的精神和范围。上述任何示例的方案可以与被描述为形成其另外的示例的其他任意示例的方案相结合,而不丧失所追求的效果。在图中的要素显示通过箭头连接的情况下,将理解的是这些箭头仅显示了要素之间的一个示例的通信流(包括数据和控制消息)。要素之间的流可以沿任一方向或沿两个方向。
将理解的是,仅通过举例的方式给出了优选实施例的上述说明,本领域技术人员可以得到各种变型例。虽然上面已经在一定的特殊程度上描述了各个实施例,或者是参照了一个或多个单个的实施例,但本领域技术人员可以对所公开的实施例进行多方面改动,而不偏离本发明的精神或范围。