用来在信息处理系统中从发出队列发出指令的方法和设备转让专利

申请号 : CN200610153894.3

文献号 : CN1940862B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 乔纳森·詹姆斯·德门特克里斯托弗·迈克尔·阿伯内西库尔特·艾伦·费斯特戴维·希派

申请人 : 国际商业机器公司

摘要 :

一种信息处理系统包括不按程序顺序发出指令的处理器。处理器包括发出队列,即使在队列中的某些指令不准备发出,该发出队列也可以使指令向发出前进。发出队列包括以行和列配置的存储单元的矩阵,包括耦合到多个执行单元上的第一行。当未被占据存储单元出现时,指令逐行向发出前进。当指令向第一行前进时并且在发出时,未被占据单元出现。当特定行包括不准备发出的指令时,对于该指令停住情况出现。然而,为了防止整个发出队列和处理器停住,在另一行中的准备发出指令可以旁路包括停住的或不准备发出指令的行。到执行单元的指令的乱序发出因而继续。

权利要求 :

1.一种操作处理器的方法,包括:

由指令提取器从存储器提取指令,因而提供所提取的指令;

由译码器对所提取的指令进行译码,该译码器把所译码的指令提供给发出队列;

由发出队列把译码的指令存储在存储单元行和列的矩阵中,用于乱序发出到执行单元;以及由发出队列确定该发出队列是否被第一指令停住,该第一指令在该发出队列的行之一中,并且不准备发出,该发出队列查找发出队列的其他行,以定位准备发出的第二指令。

2.根据权利要求1所述的方法,还包括在该第一指令保持在发出队列中的同时,通过发出队列把该第二指令转发到执行单元而旁路该第一指令。

3.根据权利要求1所述的方法,其中存储单元行包括相对于彼此递归配置的第一和第二行,第一行耦合到执行单元上,该方法还包括当未占据的存储单元在第一行中出现时,由发出队列通过把在第二行中的指令首先传送到第一行而使在第二行中的指令前进到执行单元。

4.根据权利要求3所述的方法,其中由发出队列把译码的指令存储在存储单元行和列的矩阵中还包括存储用于在发出队列中的每个指令的年龄信息,该年龄信息指示在其中存储指令的行中特定指令相对于其他指令的年龄。

5.根据权利要求4所述的方法,其中从第二行前进到第一行的指令呈现比在第二行中的另一个指令更老的年龄。

6.根据权利要求3所述的方法,其中较接近第二行的一端的指令接收比在第二行中的其他指令更高的关于前进到第一行的优先权。

7.根据权利要求1所述的方法,其中确定步骤还包括检查在发出队列中的每个指令的依赖性,以确定每个指令是准备发出还是不准备发出。

8.根据权利要求1所述的方法,其中该发出队列的存储单元的矩阵包括耦合到执行单元上的第一行,该发出队列的每个剩余行经该发出队列的其他行耦合到第一行上,该方法还包括在当指令发出以便执行时存储单元成为未被占据时,使指令逐行向第一行前进。

9.一种处理器,包括:

提取级,适于从存储器提取指令,以提供提取的指令;

译码器,耦合到提取级上,该译码器对所提取的指令进行译码;

多个执行单元;及

发出队列,耦合在译码器与多个执行单元之间,包括存储用于乱序发出到多个执行单元的译码的指令的存储单元行和列的矩阵,该发出队列确定是否存在由在行之一中的不准备发出的第一指令引起的停住,该发出队列更深地查找发出队列的其他行,以定位准备发出的第二指令。

10.根据权利要求9所述的处理器,其中在该第一指令保持在发出队列中的同时,通过把该第二指令转发到执行单元,发出队列旁路该第一指令。

11.根据权利要求9所述的处理器,其中存储单元行包括相对于彼此递归配置的第一和第二行,该第一行的存储单元耦合到多个执行单元上,该发出队列配置成,在该第二行中的存储单元中的指令通过首先传送到在该第一行中成为未被占据的存储单元,而向发出前进。

12.根据权利要求11所述的处理器,其中该发出队列存储用于该在发出队列中的每个指令的年龄信息,该年龄信息指示在其中存储指令的行中特定指令相对于其他指令的年龄。

13.根据权利要求12所述的处理器,其中从该第二行向发出前进到该第一行的指令呈现比在该第二行中的另一个指令更老的年龄。

14.根据权利要求9所述的处理器,还包括耦合到该发出队列上的依赖性检查器,该检查器检查每个译码的指令的依赖性,以确定每个译码的指令是否准备发出。

15.根据权利要求9所述的处理器,其中该发出队列的存储单元的矩阵包括耦合到多个执行单元上的第一行,该发出队列的每个剩余行经发出队列的其他行耦合到该第一行上,该处理器还在当指令发出以便执行时存储单元成为未占据时,使指令逐行向第一行前进。

16.一种信息处理系统HIS,包括:

一种处理器,包括:

提取级,适于从存储器提取指令,以提供所提取的指令;

译码器,耦合到提取级上,该译码器译码提取的指令;

多个执行单元;

发出队列,耦合在译码器与多个执行单元之间,包括存储用于乱序发出到多个执行单元的译码的指令的存储单元行和列的矩阵,该发出队列确定是否存在由在行之一中的不准备发出的第一指令引起的停住,该发出队列更深地查找发出队列的其他行,以定位准备发出的第二指令;以及存储器,耦合到处理器上。

17.根据权利要求16所述的IHS,其中在该第一指令保持在该发出队列中的同时,通过把该第二指令转发到执行单元,该发出队列旁路该第一指令。

18.根据权利要求16所述的IHS,其中存储单元行包括相对于彼此递归配置的第一和第二行,该第一行的存储单元耦合到多个执行单元上,该发出队列配置成,在该第二行中的存储单元中的指令通过首先传送到在第一行中成为未被占据的存储单元,而向发出前进。

19.根据权利要求18所述的IHS,其中该发出队列存储用于在该发出队列中的每个指令的年龄信息,该年龄信息指示在其中存储指令的行中特定指令相对于其他指令的年龄。

20.根据权利要求19所述的IHS,其中从该第二行向发出前进到该第一行的指令呈现比在该第二行中的另一个指令老的年龄。

说明书 :

用来在信息处理系统中从发出队列发出指令的方法和设备

技术领域

[0001] 本公开在此涉及一种信息处理系统,并且更具体地说,涉及在信息处理系统的处理器中发出指令。

背景技术

[0002] 在信息处理系统中的常规处理器可以包括几个流水线级,以增加处理器的有效吞吐量。例如,处理器可以包括从存储器提取指令的提取级、把指令译码成操作码和操作数的译码器级、以及具有执行译码的指令的各种执行单元的执行级。流水线化使处理器能够通过并行地执行这些处理器操作而得到更大的效率。例如,在提取级提取下一个指令的同时,译码器级可以对所提取的指令进行译码。类似地,在译码器级译码另一个指令的同时,在执行级中的执行单元可以执行已译码的指令。
[0003] 最简单的处理器按程序顺序,即处理器在程序中遇到指令的顺序,处理指令。处理器设计人员通过设计乱序(OOO)执行指令的处理器提高了处理器效率。设计人员发现,如果处理的指令不取决于还未得到的结果,如来自较早指令的结果,则处理器可不按程序顺序处理指令。换句话说,如果指令不呈现依赖性,则处理器可乱序(OOO)执行指令。
[0004] 为了使处理器能够乱序(OOO)执行指令,处理器可以在译码器级与执行级之间包括发出队列。发出队列起有效地消除译码器级与形成处理器的执行级的执行单元间耦合的缓冲器的作用。发出队列包括确定哪些指令发送到各种执行单元和这些指令发送到执行单元的顺序的逻辑。
[0005] 当队列遇到对于其他指令呈现依赖性的一个或多个指令时,处理器的发出队列可能停住。换句话说,发出队列等待处理器解除这些依赖性。一旦处理器解除这些依赖性,发出队列就可以继续发出指令到执行单元并且执行继续。不幸的是,当发出队列呈现停住直到处理器解除引起停住的依赖性时,处理器损失宝贵的时间。一些现代处理器可以允许多个指令停住;然而,它们一般不调节到高频操作或调节到大发出队列。
[0006] 所需要的是一种以可扩展方式解决上述处理器无效率问题的方法和设备。

发明内容

[0007] 因而,在一个实施例中,公开了一种用来操作处理器的方法,其中由指令提取器从存储器提取指令,因而提供所提取的指令。该方法也包括由译码器对所提取的指令进行译码,以把所译码的指令提供给发出队列。该方法还包括由发出队列把译码的指令存储在存储单元行和列的矩阵中,用于乱序发出到执行单元。该方法还进一步包括由发出队列确定发出队列是否被第一指令停住,该第一指令在发出队列的行之一中,并且不准备发出。发出队列查找发出队列的其他行,以定位准备发出的第二指令。在一个实施例中,该方法也包括,在第一指令保持在发出队列中的同时,通过发出队列把第二指令转发到执行单元而旁路第一指令。
[0008] 在另一个实施例中,公开了一种处理器,该处理器包括提取级,该提取器适于从存储器提取指令,以提供提取的指令。处理器也包括耦合到提取级上的译码器,该译码器对所提取的指令进行译码。处理器还包括多个执行单元。处理器还进一步包括在译码器与多个执行单元之间耦合的发出队列。发出队列包括存储用于乱序发出到多个执行单元的所译码的指令的存储单元行和列的矩阵。发出队列确定是否存在由在行之一中的不准备发出的第一指令引起的停住。在这种情况下,发出队列更深地查找发出队列的其他行,以定位准备发出的第二指令。在一个实施例中,发出队列配置成,在第一指令保持在发出队列中的同时,通过把第二指令转发到执行单元而使第二指令旁路第一指令。

附图说明

[0009] 附图仅表明本发明的示例性实施例,并因此不限制其范围,因为发明概念适于其他同样有效的实施例。
[0010] 图1表示公开的处理器的一个实施例的方块图。
[0011] 图2表示图1的处理器的发出队列的方块图。
[0012] 图3表示在公开的处理器中的发出控制状态机的方块图。
[0013] 图4A是流程图,描绘了在公开的处理器的优先权状态机中的处理流程。
[0014] 图4B是包括年龄控制信息的发出队列的方块图。
[0015] 图5是流程图,描绘了在公开的处理器的插入控制状态机中的处理流程。
[0016] 图6是流程图,描绘了在公开的处理器的底部行发出控制状态机中的处理流程。
[0017] 图7是流程图,描绘了在公开的处理器的上部行压缩和副发出状态机中的处理流程。
[0018] 图8是流程图,描绘了在公开的处理器的准备状态机中的处理流程。
[0019] 图9是标记为来表示指令插入、压缩和发出的公开的处理器的发出队列的方块图。
[0020] 图10是采用公开的处理器的信息处理系统的方块图。

具体实施方式

[0021] 公开的处理器从存储器存储提取指令,并且译码这些指令。译码的指令归为两类,即“准备发出”指令和“不准备发出”指令。特定指令可能不是准备发出的原因包括:1)指令呈现依赖性,即指令在执行以前要求先前发出的指令的结果,2)指令是“上下文同步指令”,即,指令必须等待所有先前指令来结束执行,3)“流水线忙”情况存在,即指令必须等待,因为处理器先前执行了非流水线指令,及4)资源忙情况存在,即指令要求了不可用的资源,如在满的执行单元中的加载或存储队列。
[0022] 发出队列保持还未准备发出到执行单元的已译码的指令。当指令在等待依赖性解除的同时,或者由于其他原因,在发出队列中停住时,队列逻辑利用这个时间在发出队列中更深地查找,以定位可以乱序发出(OOO)的任何非依赖性指令。以这种方式,在停住的指令等待依赖性解除或等待阻止发出的其他原因的解决的同时,有用的处理器活动继续。
[0023] 处理器的发出队列包括按行和列排列的指令存储位置的阵列。发出队列包括行R1、行R2、...、行RN,其中N是发出队列的深度。发出队列把指令发出到适当的执行单元用于执行。发出队列的输出包括发出点,准备发出指令从该发出点发出到能够执行由该指令规定的功能的执行单元。如果行R1包括不准备发出的指令,如呈现依赖性的指令,那么行R1不能前进超过发出点。这种情况停住发出队列的行R1。然而,当发出队列以这种方式停住时,发出队列逻辑可更深地进入行R(1+1),即行R2,中查找可以发出的非依赖性指令。如果发出队列逻辑在行R2中找到这样一个非依赖性指令,那么该非依赖性指令旁路在该非依赖性指令之前的停住的行R1。以这种方式,在较老的依赖性指令停住的同时,处理器可执行有用的工作。
[0024] 在一个实施例中,处理器从行R1、行R2、...、行RN递归地重复上述结构,其中N代表发出队列的深度。换句话说,处理器递归地相对于彼此配置行。如果行RN包括一个不包括依赖性的指令,即准备发出的指令,则发出队列逻辑使该指令前进到以前的行R(N-1)。以这种方式,当其他停住发生导致发出队列的更深地查找时,指令可以逐行向行R前进。当前进的指令到达行R1时,发出队列逻辑使指令发出到适当的执行单元。
[0025] 图1表示耦合到存储器105上的处理器100的方块图。处理器100包括L2接口110,该L2接口110耦合到存储器105上,以从其接收指令和数据。存储器105存储按程序顺序组织的指令。提取级115耦合到L2接口110上,以使处理器100能够从存储器105提取指令。更具体地说,提取级115包括耦合到L2接口110上的提取单元120、和L1指令高速缓冲存储器125。预译码单元130把L2接口110耦合到L1指令高速缓冲存储器125上,以对来自存储器105的通过提取单元120的指令进行预译码。L1指令高速缓冲存储器125如所示的那样耦合预译码单元130和分发单元135。
[0026] 分发单元135如所示的那样直接经多路复用器(MUX)145或可选择地经微码单元150和MUX 145耦合到译码器140上。以这种方式,分发单元135把要求不分解成较小指令的指令通过MUX 145传输到译码器140。可选择地,呈现要求分解成较小指令的大小的所分发的指令通过微码单元150。微码单元150把这些指令分解成较小指令,MUX 145把这些较小指令传输到译码器140用于译码。
[0027] 译码器140对由提取级115向其提供的指令进行译码。译码器140耦合到依赖性检查器155上,该依赖性检查器155检查每个译码的指令,以确定译码的指令是否呈现对于该译码的指令以后的指令、或当前不可用的操作数或结果的依赖性。依赖性检查器155耦合到发出级200上,该发出级200包括发出控制状态机202和发出队列204。发出级200把它接收的每个译码的指令传递到在定点单元170和/或向量/浮点单元180中的适当执行单元。发出级200高效地确定那些准备发出的指令,并且把那些指令迅速发出到适当执行单元。
[0028] 定点单元170包括如图1中所示耦合在一起的加载/存储执行单元171、定点执行单元172、分支执行单元173及完成/清除单元174。向量/浮点单元180包括如图1中所示耦合在一起的向量加载/存储单元181、向量算术逻辑单元(ALU)182、浮点单元(FPU)算术逻辑单元(ALU)183、FPU加载/存储单元184、向量完成单元185及FPU完成单元186。向量/浮点单元180的向量完成单元185和FPU完成单元186耦合到定点单元170的完成/清除单元174上。完成单元174、185及186按顺序执行诸如退出指令之类的任务,并且处理在相关执行单元中可能出现的异常情况。
[0029] 译码器140经发出队列204把译码的指令分发到适当的执行单元。当对于诸如在下面更详细讨论的这样的指令解除了依赖性时,发出队列204把排队的指令发出到适当的执行单元。如图2中所示,发出队列204包括按行和列排列的存储单元或锁存器212的主发出队列阵列210。每个锁存器212存储由译码器140提供的指令。更具体地说,主发出队列阵列210包括行R1、R2、...、RN,其中N是在主发出队列阵列210中的总行数。在这个具体例子中,N=4,从而主发出队列阵列包括4行。也在这个具体例子中,主发出队列阵列210包括4列。主发出队列阵列210可以依据具体应用采用更大或更小数目的行和列。
[0030] 在这个具体实施例中,当完全填充有指令时,主发出队列阵列210可以存储16个指令,即4行的每一行有4个指令。主发出队列阵列210把这些指令分组成8组,其每一组包括2个指令。因而,当完全填充时,主发出队列阵列210包括8组,其中每组2个指令,即在行R1中的指令组1和2、在行R2中的指令组3和4、在行R3中的指令组5和6、以及在行R4中的指令组7和8。
[0031] 发出队列204也包括提供到执行单元的可选择路径的辅助队列或副队列215。在这个具体实施例中,针对主发出队列阵列210的每行,副队列215都包括两个存储单元。与组1和组2指令相对应的行R1存储单元,耦合到两个副队列存储单元221和222上。副队列存储单元221和222形成发出行,指令从该发出行发出到执行单元。如图2中所示每个副队列存储单元包括多路复用器和存储单元。例如,副队列存储单元221包括耦合到锁存器或存储单元221B上的MUX 221A。为了说明便利,图2示出了与存储单元221B接合在一起的MUX 221A。副队列存储单元222包括耦合到锁存器或存储单元222B上的MUX 222A。一旦指令传送到存储单元221B和222B,这些指令就发出到适当的执行单元用于执行。
[0032] 在其中针对主发出队列阵列210的每行,副队列215包括两个存储单元的这个具体实施例中,每处理器时钟周期副队列215可以发出两个指令。因而,假定主发出队列阵列210的行R1包括在组1和组2中的总共4个有效指令,这四个指令的两个可以分别移动到副队列存储单元221和222,条件是指令满足下面讨论的一定标准。
[0033] 如所示的那样,副队列215也包括耦合到行R2的存储单元212上的副队列存储单元231和232。副队列存储单元231和232一起形成在副队列215内的行。副队列215还包括耦合到行R3的存储单元212上的副队列存储单元241和242。副队列存储单元241和242一起形成在副队列215内的另一个行。副队列215还进一步包括耦合到行R4的存储单元212上的副队列存储单元251和252。副队列存储单元251和252一起形成在副队列
215内的另一个行。当在行R1、R2、R3或R4中的存储单元212之一存储指令时,则发出队列204把该单元看作存储有效输入。然而,如果单元没有存储指令,那么发出队列204把这样一个未占据单元看作呈现无效输入。
[0034] 在图1和图3中表示的发出控制状态机202可以把从译码器140接收的指令存储到可用的行R1至R4的任何存储单元中。当处理器100初始化时,主发出队列阵列210的所有存储单元都是空的。类似地,当处理器100初始化时,副队列215的所有存储单元都是空的。当处理器操作开始时,发出控制状态机首先填充在阵列210中的最高优先权存储单元212。在一个实施例中,处理器100把底部行,即行R1,定义为阵列210的最高优先权行,该行最接近发出。这意味着在行R1的存储单元中存储的指令比主发出队列阵列210的其他行更接近发出。行R2呈现在行R1之后的次最高优先权。行R3呈现在行R2之后的次最高优先权,并且在阵列中如此向上。较高优先权意味着,在行R1中的指令比在行R2和以上中的指令更接近发出,如在下面更详细解释的那样。按照惯例,在主发出队列阵列210的每行中,较接近主发出队列阵列的每行的左端的指令比每行中的右边的指令呈现较高优先权。其中颠倒这种惯例的可选择实施例是可能的。
[0035] 作为组1或组2存储在行R1中的指令可以经副队列存储单元221或副队列存储单元222发出到执行单元。如图2中所示,执行单元耦合到副队列存储单元221和222的输出上。在一个处理器周期中,发出控制状态机202可以指令多路复用器221A选择在行R1中存储的组1和组2指令的任一个并把选择的指令存储在存储单元221B中。在同一处理器周期中,发出控制状态机202也可以指令多路复用器222A选择在行R1中还未选择的组1和组2指令的任一个并把选择的指令存储在存储单元222B中。副队列215以这种方式选择和存储来自行R1的两个指令。在一个实施例中,副队列215选择来自同一组的指令。例如,组1提供两个指令,或者组2提供两个指令,用来存储在存储单元221B或222B中。这样的其他实施例是可能的,其中副队列215从组1选择一个指令并且从组2选择一个指令,用来存储在存储单元221B和222B中。在随后的处理器周期中,在副队列存储单元221和副队列存储单元222中存储的指令发出到适当执行单元。
[0036] 以类似方式,发出控制状态机202可以指令副队列存储单元231和232存储来自在行R2中的组3和组4的指令。发出控制状态机202也可以指令副队列存储单元241和242存储来自在行R3中的组5和组6的指令。发出控制状态机202还可以指令副队列存储单元251和252存储来自在行R4中的组7和组8的指令。通过接着图2的连接图案作为模板,主发出队列阵列210和副队列215可扩展成包括辅助行。更具体地说,主发出队列阵列210和副队列215呈现递归拓扑,因为行R2和相关副队列存储单元231-232重复,并且接着下面的行R1和相关副队列存储单元221-222的连接图案。类似地,行R3和相关副队列存储单元241-242相对于下面的行呈现递归拓扑,并且对于行R4和更高的行(未表示)也是如此。在一个实施例中,发出控制状态机202把准备发出指令传送到副队列215。
[0037] 副队列存储单元231的输出耦合到副队列存储单元221和222的相应输入上。副队列存储单元232的输出耦合到副队列存储单元221和222的相应输入上。因而,在副队列存储单元231和232中存储的指令可以经副队列存储单元221和222发出到适当执行单元。
[0038] 副队列存储单元241的输出耦合到副队列存储单元231和232的相应输入上。副队列存储单元242的输出耦合到副队列存储单元231和232的相应输入上。因而,在副队列存储单元241和242中存储的指令可以经与行R2相关的副队列存储单元231和232、及经与行R1相关的副队列存储单元221和222发出到适当执行单元。
[0039] 最后,副队列存储单元251的输出耦合到副队列存储单元241和242的相应输入上。副队列存储单元252的输出耦合到副队列存储单元241和242的相应输入上。因而,在副队列存储单元251和252中存储的指令可以经与行R3相关的副队列存储单元241和242、与行R2相关的副队列存储单元231和232及经与行R1相关的副队列存储单元221和
222发出到适当执行单元。准备发出的指令可通过副队列(每处理器周期副队列的一行)向执行前进,如下面更详细解释的那样。
[0040] 指令可以取通过发出队列204的两条路径到达与其耦合的执行单元。主发出队列阵列210提供一条用于指令通过发出队列204前进的路径,而副队列215提供另一条通过发出队列204的路径。在实际中,指令在发出到适当执行单元用于执行之前可以通过主发出队列阵列210的部分和副队列215的部分。有可能的是,在主发出队列阵列210中的具体行可能填充有由于依赖性或其他原因不能发出的指令。这样的一行成为停住点,因为它可能阻止在该停住的行以上的行中的指令前进到下部行和发出到执行单元。当一行呈现这样一种停住点时,如由发出控制状态机202所命令的那样,停住的行以上的行可以通过把其指令传送到副队列215而旁路该停住的行。一旦在副队列215中,传送的指令就在随后的处理器周期中在副队列中逐行前进,越来越靠下,直到将它们发出到耦合到最下部的副队列存储单元221和222上的执行单元。
[0041] 下面的一系列例子解释在不同操作情况下发出队列204的操作。在一个例子中,发出控制状态机202在一个处理器周期期间把2个有效指令插入在行R1的组1中。这些指令准备发出。换句话说,这些指令没有呈现它们为什么不能立即发出到执行单元的原因。可能阻止在乱序(OOO)发出队列中指令的立即执行的原因是,该指令呈现对于其他指令的结果的依赖性。换句话说,由该指令要求的需要的操作数当前不可用。然而,由于在当前例子中,行1的组1包括没有依赖性的两个有效指令,所以行1分别把这两个准备发出的指令供给到副队列215的存储单元221和222,这些指令可以从该存储单元221和222发出到耦合到其上的执行单元。在发出控制状态机202把没有依赖性的2个有效指令插入在行1的组1中之后的下个处理器周期中,状态机202把没有依赖性的2个有效指令插入在行1的组2中。在下个处理器周期中,主发出队列阵列210把在行1的组2中的两个指令传送到存储单元221和222以便执行,因为不存在延迟执行的原因。在行1的组2把其两个指令发送到存储单元221和222以便传输到执行单元的同一处理器周期中,状态机202把另外两个指令发送到空的组1存储单元。因而,我们观察到“乒乓”效应,其中1)在第一处理器周期期间,两个行1组1指令传送到存储单元221和222以便传送到执行单元;2)在第二处理器周期期间,两个行1组2指令传送到单元221和222以便执行;及3)在第三处理器周期期间,两个行1组1指令再次传送到单元221和222以便执行;等等。因而,发出队列
204的拓扑为没有依赖性的指令提供最佳指令吞吐量。以另一种方式说,当行1接收到没有依赖性的指令供给时,这些指令立即发出到副队列215的最下部单元,它们从最下部单元传送到适当执行单元用于执行。换句话说,组1填充,并且然后在组2填充时组1发出;当组1重新填充时,组2发出;当组2重新填充时,组1发出,等等,并且如此类推。
[0042] 在以上讨论的例子中,发出队列204在同一处理器周期中既接收两个指令又发出两个指令,以提供良好的吞吐量。换句话说,当译码器140经依赖性检查器155向发出级200和发出队列204提供没有依赖性的一系列译码的指令时,发出队列204不阻止指令发出。以上讨论的例子假定发出队列204当它开始接收没有依赖性的一系列指令时是空的。在这种情形下,发出队列204实现100%的吞吐量,而没有等待解除任何依赖性的空闲时间。
[0043] 在如下例子中,底部行即行1填充有四个呈现依赖性的指令。在行R1中的所有四个存储单元212或输入现在是有效的,因为指令占据这些存储单元。然而,由于呈现依赖性的指令现在填充整个行R1,所以来自行R1的指令当前不可以发出到执行单元用于执行。换句话说,在行R1中的组1和组2指令呈现依赖性,并且直到这些依赖性解除,这些指令才可能发出。由于行R1当前不可能经存储单元221和222发出到执行单元,所以行R1停住,并且在行R1以上的行开始填充有来自译码器140的指令。
[0044] 假定行R2填充有不呈现依赖性的组3和组4指令并且行R1因为它呈现依赖性而不能发出,行R2通过传送或发出到副队列215而有效地旁路行1。按照惯例,较接近行的左侧的指令比较接近行的右侧的指令呈现较高优先权。因而,如果在行R2中的所有4个指令不呈现依赖性,那么组3指令在发出控制状态机202的控制下发出到副队列215。更具体地说,在组3中的最左指令传送到存储单元231,并且在组3中的剩余指令传送到存储单元232。注意,每个副队列存储单元对221-222、231-232、241-242、及251-252耦合到相应行R1、行R2、行R3及行R4上,并且可以从这些行接收指令。在这个实施例中,每个处理器周期,两个指令可以传送到副队列215。在随后的处理器周期中,组3指令经副队列215的存储单元221和222发出到适当执行单元,条件是在行R1中的指令仍然呈现依赖性。以这种方式,发出到在副队列215中的较高存储单元对的没有依赖性的指令向下向的存储单元对221-222传送,该存储单元对221-222最终把该指令对发出到适当执行单元用于执行。因而,即使行R1包括具有依赖性的指令,行R2也通过经副队列215发出而旁路停住的行R1。
[0045] 以类似方式,如果行R1和行R2完全填充有不准备发出的依赖指令,则在行R3中的没有依赖性的指令可以通过流经副队列存储单元对241-242、231-232及221-222而发出到适当执行单元。在一个实施例中,两个指令在副队列215中从存储单元对到存储单元对流向执行单元占一个处理器周期。而且,如果行R1、行R2及行R3完全填充有不可能立即发出的依赖指令,则在行R4中没有依赖性的指令可以通过流经副队列存储单元对251-252、241-242、231-232及221-222而发出到适当执行单元。
[0046] 在另一种操作情形下,假定行R1、行R2、行R3及行R4完全填充有呈现依赖性的指令。在这种情形下,主发出队列阵列210在一个处理器周期中不包括准备发出指令。然而,在下个处理器周期中,在行R1中的组1指令的依赖性解除。响应这种解除,现在准备发出组1指令传送或流到副队列存储单元221和222。假定组3指令现在解除。在随后的处理器周期中,在存储单元221和222中的组1指令发出到适当执行单元,并且来自行R2的组3指令流入由先前已移动到副队列215的组1指令所留下的在行R1中的未占据的存储单元中。以这种方式,在较高行中的指令向下流到或向下滴入到由移动到副队列的指令所留下的在下部行中的空缺中。这种下滴动作也适用于行R3和行R4。
[0047] 如果发出控制状态机202具有把指令从上部行移动到在主发出队列阵列210的下部行中的空缺或把该指令移动到副队列215的选择,则状态机202把指令移动到在主发出队列阵列210中的下部行。
[0048] 在图2中表示的发出队列204因为设计效率原因是递归结构。我们用递归指,行R1结构和其相关存储单元对221-222向上重复3次,以形成在图2中描绘的完全发出队列204。换句话说,行R2和其相关存储单元对231-232在结构上是行R1和存储单元对221-222的重复。类似地,行R3和其存储单元对241-242、及行R4和其存储单元对251-252同样重复行R1和其存储单元对221-222的结构。使用这种递归拓扑,发出队列204可以包括更多或更少的行和相关副队列存储单元对,如对于具体应用希望的那样。
[0049] 在另一种情形下,行R1完全填充有不准备发出的指令。例如,组1和组2指令都呈现依赖性,并因而行R1停住。然而,行R2包括具有准备发出指令的组3。发出控制状态机202在一个处理器周期期间把准备发出组3指令放置在副队列215的存储单元231和232中。在下个存储器周期中,在行R1中的依赖性都解除。因而,在行R1中的所有4个指令,即组1指令和组2指令,都准备发出。而且,存储单元231和232包括来自行R2的组3的两个准备发出指令。因而,六个指令现在准备发出,即在行R1中的4个和在副队列存储单元231-232中的2个。
[0050] 由于行R1在行R2之前填充有指令,所以行R1按定义包含比现在在副队列存储单元231-232中的组3指令要老的指令。发出控制状态机202现在进行关于这六个指令的哪两个可以经底部存储单元221-222发出的6路决定。如下面更详细讨论的那样,发出控制状态机202把年龄位与在发出队列204中的每个指令相关联。以这种方式,发出控制状态机202监视在发出队列204中的每个指令相对于在发出队列204中的其他指令的年龄。按照惯例,在主发出队列阵列210的任一行中的最左指令比这一行的最右指令老。因而,在行R1中,与组2指令相比,组1指令呈现较大年龄。发出控制状态机202当考虑哪些指令发出到执行单元时,给予呈现较大年龄的这些指令较高优先权。因而,在六个准备发出的指令中,发出控制状态机202把行R1的组1指令发送到副队列存储单元221-222,用来发出到耦合到其上的执行单元。行R1的组2指令比现在在副队列存储单元231-232中存储的组3指令呈现较大年龄。因此,发出控制状态机202在下个处理器周期中,把组2指令发送到副队列存储单元221-222,用来发出到执行单元。发出控制状态机202监视与现在在副队列存储单元231-232中的组3指令相关的年龄位,并且确定这些指令比流到或下滴到行1的较新组3或组4指令呈现较大年龄。因而,在新填充的行R1指令发出之前,发出控制状态机
202把在存储单元231-232中的组3指令发送到底部副队列存储单元221-222,用来发出到执行单元。
[0051] 如果发出控制状态机202发现在主发出队列阵列210中的指令不准备发出,那么发出控制状态机202可以把该指令发送到在阵列210中包括空缺或未占据存储单元的下部行。这个动作代表竖直压缩。换一种方式说,发出控制状态机202可以把不准备发出指令在发出队列阵列210中从较高行压缩或传送到较低行,条件是这样的较低行包含空缺或未占据单元。然而,在这个实施例中,发出控制状态机202可能不把不准备发出指令发出到副队列215或发出到执行单元。在一个实施例中,主发出队列阵列210也可以以上述方式压缩准备发出指令。
[0052] 在另一个实施例中,发出控制状态机202包括几个状态机,以控制发出级200的发出队列204。更明确地说,如在图3中看到的那样,发出控制状态机202包括用于指令年龄控制的优先权状态机400、插入控制状态机500、底部行发出控制状态机600、上部行压缩和副发出状态机700及准备状态机800。这些状态机一起工作,并且合作以提高发出队列204的吞吐量。
[0053] 图4A表示流程图,描绘了管理在发出队列204中的指令年龄的优先权状态机400的操作。年龄是指由软件编译器(未表示)所确定的在软件程序中的指令的程序顺序。非易失性存储装置(未表示)耦合到处理器100上,从而存储所编译的软件程序。软件编译器确定处理器100最终执行的软件程序的程序顺序。就指令年龄而论,处理器100将第一指令(软件编译器设置成在第二指令之前执行该第一指令)定义为较老指令。类似地,就指令年龄而论,处理器100将第三指令(软件编译器设置成在第四指令之后执行该第三指令)定义为较年轻指令。在一个实施例中,处理器100给在发出队列204中的较老指令先于较年轻指令的优先权。这种手段往往提高性能,并且减小发出队列204的复杂性。
[0054] 图4B表示填充有来自译码器140的指令的发出队列204。发出控制状态机202确定哪些指令到在发出队列204中的哪些存储单元212或指令位置。如在图4B中看到的那样,存储指令的每个存储单元也存储年龄位。在逐行基础上,0的年龄位指示较老指令,而1的年龄位指示较年轻指令。发出控制状态机202配置在发出队列204的存储单元中存储的指令,从而当从左向右前进时,列变得更年轻。换句话说,按照该惯例,发出队列204的最左列存储特定行的最老指令,并且最右列存储该特定行的最年轻指令。如果希望,则其他实施例可以颠倒这种惯例。
[0055] 如上所述,来自上部行的指令可以压缩或向下流到在低部行中的空缺存储单元。当优先权状态机400把年龄位设置到1(较年轻)时,这在特定行内指示该特定指令从该行以上压缩。因此,该特定压缩的指令在该特定行中呈现比所有其他非压缩的指令或输入年轻的年龄。同样,就特定行而论,在呈现准备发出状态的该行中的所有指令中,相对于到下部行的进一步压缩或到副队列215的发出,较老指令接收先于较年轻指令的优先权。在特定行中具有相同年龄位的指令中,优先权状态机400从左到右给以较高优先权。
[0056] 返回图4A的流程图,当发出控制状态机202首先把每个指令插入在主发出队列阵列210的行中的空缺存储单元中时,优先权状态机400按照块405把这样初始插入的指令的年龄位设置为零。然而,当指令从上部行压缩或流到在下部行中的存储单元中的空缺时,优先权状态机400按照块410把该压缩的指令的年龄位设置为1。这把新压缩的指令与该压缩的指令所到达的同一行中所存在的其他较老指令区分开。并且按照块410,当指令从在主发出队列阵列210中的行流到或传送到与该行相对应的存储单元对的副队列存储单元时,优先权状态机400把该指令的年龄位设置到1。在块415处,优先权状态机400进行测试,以确定在特定行中的所有指令是否都呈现年龄位=1。如果不是,则优先权状态机400继续进行测试,直到在特定行中的所有指令都呈现年龄位=1。一旦优先权状态机400确定在特定行中存储的所有指令都呈现年龄位=1,状态机400就按照块420对于在该行中的所有指令复位年龄位=0。处理流程然后继续回到块410,该块410对于在特定行中的每个压缩的或副发出的指令设置年龄位=1。
[0057] 返回图4B的填充的发出队列204,这个例子示出在发出队列204的存储单元中与每个指令一起存储的年龄位的操作。主发出队列阵列210的行R1-R4的每一个包括在相应存储单元中的4个指令,即指令INSTR 1、INSTR 2、INSTR 3及INSTR 4。副队列存储单元221-222与行R1存储单元相对应,因为副队列存储单元221-222耦合到R1存储单元上,以接收发出到执行单元的指令。图4B把存储单元221-222标为ISSUE INST,因为这些单元的每一个可存储发出到执行单元的下个指令。副队列存储单元231-232与行R2存储单元相对应,因为副队列存储单元231-232耦合到R2存储单元上,以接收前进到执行单元的指令。图4B把存储单元231-232标为INSTR 5和INSTR 6,因为这些单元的每一个可从行R2或上方的副队列存储单元241-242接收指令。副队列存储单元241-242与行R3存储单元相对应,因为副队列存储单元241-242耦合到R3存储单元上,以接收前进到执行单元的指令。图4B把存储单元241-242标为INSTR 5和INSTR 6,因为这些单元的每一个可从行R3或上方的副队列存储单元251-252接收指令。副队列存储单元251-252与行R4存储单元相对应,因为副队列存储单元251-252耦合到R4存储单元上,以接收前进到执行单元的指令。图4B把存储单元251-252标为INSTR 5和INSTR 6,因为这些单元的每一个可从行R4接收指令。
[0058] 现在参照在行R1中的指令INSTR 1-INSTR 4,发出优先权是都呈现年龄=0的INSTR 1、INSTR 3、INSTR 4。由于INSTR 1的位置作为在行R1中的最左指令,INSTR 1首先经存储单元对221-222发出。在行R1中从左到右移动,INSTR 3其次发出,接着是INSTR 4。现在在行R1中具有年龄=1的任何剩余指令发出,并因而INSTR 2经存储单元对221-222发出。在如以上讨论的那样在行R1指令的发出之后,指令INSTR 5和INSTR 6经副队列存储单元对221-222发出。来自存储单元对231-232的指令INSTR 5和INSTR 6每个呈现年龄位=1。由于在特定行中的主发出队列阵列指令在从该特定行以上的行接收的副队列指令之前发出,所以在存储单元对231-232中的指令INSTR 5和INSTR 6经存储单元对
221-222的发出在第一行R1指令INSTR 1、INSTR 3、INSTR 4及INSTR 2的发出之后。
[0059] 现在参照在行R2中的指令INSTR 1-INSTR 4,在这个行中的所有指令都呈现年龄=1。而且,在相邻副队列存储单元对241-242中的指令INSTR 5-INSTR 6每个也呈现年龄=1。因而,按照图4A的流程图的决定块415和复位块420,在决定块415探测到这种情况之后的处理器周期中,所有年龄位复位到年龄=0。
[0060] 现在参照在行R3和相邻副队列存储单元251-252中的指令,在行R3中的指令INSTR 2从行R4压缩或向下流到行R3。因而,在行R3中的指令INSTR 2呈现较年轻的年龄位=1。在副队列存储单元251-252中的指令INSTR 5和INSTR 6从以上的行R4发出到存储单元251-252。因而,在副队列存储单元251-252中的指令INSTR 5和INSTR 6呈现较年轻的年龄位=1。当行R1-R3填充有指令时,发出控制状态机202开始用提取的译码的指令填充行R4。发出控制状态机202用呈现年龄位=0的具有从左到右优先权的指令填充行R4。
[0061] 图5是流程图,描绘了在插入控制状态机500中的处理流程。插入控制状态机500与在发出控制状态机202中的其他状态机合作,以控制在发出队列204的存储单元中的指令(也叫做输入)的插入。在决定块505处,插入控制状态机500进行测试,以确定发出队列204是否是充满的。如果发出队列204是充满的,则上部流水线按照块510停住。上部流水线包括分发单元135、微码单元150、MUX 145、译码器140、及依赖性检查器155。决定块505继续测试,直到未占据的存储单元出现在发出队列204中,因而使发出队列204不再充满。发出队列204可能包括多个未占据的存储单元。插入控制状态机500找到当前不可压缩的最高优先权存储单元。如果在该指令下面的行是充满的,则存储单元输入或指令不可能是可压缩的。按照块520,插入控制状态机500把进来指令插入在块515中找到的最高优先权未占据的存储单元。插入控制状态机500用年龄位=0把如此存储的指令标记为有效。插入控制状态机500然后在决定块525处进行另一种测试,以确定发出队列204是否再次是充满的。如果状态机500发现发出队列204是充满的,那么上部流水线按照块530停住。测试在决定块525处继续,直到发出队列204又包含至少一个未占据的存储单元。在这种情况下,处理流程继续到块535,在该块535处,状态机500确定在发出队列204中的次最高优先权未占据的存储单元。在一个实施例中,插入控制状态机500把指令插入在主发出队列阵列210的存储单元中。在另一个实施例中,如果指令是准备发出,则插入控制状态机500可以把指令插入在最高优先权副队列存储单元中。按照块540,状态机500然后把下个进入指令插入在块535中找到的次最高优先权未占据的单元中。在完成这个任务之后,上部流水线按照块545前进,并且处理流程继续回到决定块505,该块505再次测试发出队列204,以确定队列204是否是充满的。
[0062] 图6表示流程图,描绘了在底部行发出控制状态机600中的处理流程,该底部行发出控制状态机600控制来自主发出队列阵列210的底部行R1的指令的发出。状态机600与准备状态机800合作,以确定在底部行R1中的指令是否准备发出。状态机600按照块605穿过主发出队列阵列210的底部行R1以年龄从左到右查找。决定块610测试在底部行R1中的指令,以确定这些指令中的任意一个是否准备发出。如果决定块610发现特定底部行指令不准备发出,那么查找按照块605继续,直到决定块610找到准备发出的指令。如果决定块610在查找所有底部行指令之后没有找到准备发出指令,那么状态机600等待一个处理器周期,并且在块605处查找再次开始。然而,一旦决定块610在底部行R1中找到准备发出,状态机600就按照块615把该指令移动到两个发出存储单元221-222之一,即第一发出槽。发出存储单元221-222也可以叫做发出槽。这些存储单元或槽耦合到、并且把指令发出到最终执行发出的指令的执行单元。决定块620执行测试,以确定在底部行R1中的第二指令是否准备发出。如果决定块620未能找到这样的第二指令准备发出,那么处理流程为了另外查找继续回到块605。然而,如果决定块620找到这样一个第二指令准备发出,那么决定块625进行测试,以确定这个第二指令是否与以前第一指令冲突。冲突是指,第二准备发出指令要求与第一准备发出指令相同的执行单元,并因此,这种第二准备发出指令不能在与第一准备发出指令相同的处理器周期中发出。如果决定块625找到这种冲突,那么处理流程为了在底部行R1中进行更多查找继续回到块605。然而,如果决定块625没有找到这样的冲突,那么状态机600按照块630把第二指令移动到第二发出槽,即存储单元222。然后处理流程继续回到块605,该块605在底部行R1中进行对于准备发出指令的另外查找。
在一个实施例中,在发出决定610和620之前,发生压缩、插入和年龄更新。
[0063] 图7是流程图,描绘了在上部行压缩和副发出状态机700中的处理流程。上部行包括在主发出队列阵列210中除行R1之外的那些行。对于在特定上部行中的每个指令或输入,状态机700在紧接的下部行中查找未占据的单元。如果状态机700在紧接的下部行中找到这样一个未占据的单元,则状态机700按照块705指令主发出队列阵列210把位于上方的输入压缩到该未占据的单元中。状态机700也按照块705把如此压缩的所有输入设置到年龄位=1,即较年轻。状态机700然后在决定块710处执行测试,以确定这个下部行是否是充满的。如果这个下部行不是充满的,那么处理流程为了另外压缩是否可能继续回到块705。然而,如果决定块710发现这个下部行是充满的,那么状态机700按照块715并行地从右到左以年龄查找所有行,以定位准备发出指令。换句话说,状态机700对于所有行同时进行相同查找。如果这种查找没有找到这样的准备发出指令,那么决定块720为了压缩活动是否可能把处理流程送回到块705。然而,如果查找发现准备发出指令,那么决定块720把处理流程送到块725。块725把准备发出的指令移动到副队列215,它以后从该副队列215发出。发出控制状态机202在上述压缩和发出决定之前,执行到发出队列204中的插入和指令年龄位更新。
[0064] 图8表示流程图,描绘了确定特定指令是否是准备发出的准备状态机800的处理流程。首先,准备状态机800按照块805检查当前指令,以确定该指令是否呈现依赖性。如果决定块805确定当前指令不呈现依赖性,那么状态机800按照块810把当前指令指定为准备发出。然而,如果状态机800确定当前指令呈现依赖性,那么状态机800按照块815执行依赖性更新。决定块820然后进行测试,以确定依赖性是否仍然存在。如果依赖性已不存在,那么状态机800按照块810把指令指定为准备发出。然而,如果依赖性仍然存在,则状态机800按照块825把指令指定为不准备发出。在等待一个处理器周期之后,状态机800为了另外的依赖性测试把处理流程送回到决定块805。
[0065] 图9是为了清楚起见在除去了在主发出队列阵列210与副发出队列215之间的连接的情况下的发出队列204的简化表示。这种发出队列表示提供了在队列中的指令插入、在队列内的压缩和从队列发出的例子。注意,行R4与副队列存储单元对251-252相关。行R3与副队列存储单元对241-242相关。行R2与副队列存储单元对231-232相关。主发出队列阵列210的底部行与发出指令存储单元对221-222相关。当发出控制状态机202把指令放置在存储单元对221-222中,这样的指令直接转到或发出到执行这些指令的执行单元。图9把未被指令占据的所有存储单元指示为VLD=0,即意味着在这个单元中的无效/无指令存在。包含指令的存储单元(例如如在行R1的最左指令中看到那样)包括指令号INSTR、年龄位AGE、准备发出位RDY、及指令有效位VLD。指令在其RDY位=1时是准备发出的。
[0066] 如下讨论在发出队列204内的代表性指令,以表明队列的操作。行R1的指令INSTR3呈现准备位RDY位=1,并因而准备发出。由于INSTR 3也呈现年龄位=0,所以它在行R1中呈现最高优先权,作为在行R1中的最老的准备发出的指令。因而,如虚线905指示的那样,INSTR 3发出流到存储单元221,它从该存储单元221发出到适当执行单元。在行1中的剩余指令都呈现准备位RDY位=0,指示它们还未准备发出。因而,这些剩余指令在行R1中停住。在副队列存储单元232中的指令INSTR 6呈现准备位RDY位=1,并因而准备发出。由于这个INSTR 6不与现在在存储单元221中的指令相冲突,所以如虚线910指示的那样,INSTR 6传送到存储单元222,它从该存储单元222发出。
[0067] 在主发出队列阵列210的行R2中,所有指令呈现RDY位=0,因而指示没有准备发出。由于在行R2中的INSTR 1、INSTR 2、INSTR3及INSTR 4不准备发出,那么这些存储单元保持被占据,因而阻止来自以上行,即行R3,的任何指令压缩到行R2中。在副队列215中,在存储单元241中的INSTR 5呈现RDY位=1,并因而准备发出。由于在单元241下面的单元231未被占据(VLD=0),所以来自存储单元241的指令INSTR 5压缩或流到存储单元231中,如由虚线915指示的那样。
[0068] 现在参照主发出队列阵列210的行R3,在行R3的首先的两个最左存储单元保持未被占据,因为对于这些单元的每一个VLD=0。然而,指令INSTR 3和INSTR 4占据行R3的两个最右单元。这两个指令的每一个呈现准备位RDY位=1,并因而准备发出。然而,由于在行R2中的4个指令阻止行R3指令压缩到行R2中,所以行R3的INSTR 3和INSTR 4指令取而代之分别发出到副队列215的存储单元241和242中,如由虚线920和925指示的那样。由于指令现在占据两个副队列存储单元241和242,所以在两个副队列存储单元251和252中的准备发出指令INSTR 5和INSTR 6停住,并且因此不立即流入存储单元241和242中。
[0069] 现在参照主发出队列阵列210的最上方的行R4,指令INSTR 1和INSTR 2每一个呈现RDY位=1。因而,这些指令的每一个准备发出。由于行R3包括其中VLD=0的两个未被占据的存储单元,所以来自行R4的准备发出指令INSTR 1和INSTR 2压缩或流到在行R3中的两个未被占据存储单元中,如由虚线930和935指示的那样。发出控制状态机202把发出队列204接收的下两个指令插入在行R4中的两个未被占据存储单元中,其中VLD=0,如由虚线940和945所指示。
[0070] 图10表示包括处理器100的信息处理系统(IHS)1000。IHS 1000还包括把处理器100耦合到系统存储器1015和视频图形控制器1020上的总线1010。显示器1025耦合到视频图形控制器1020上。非易失性存储器1030,如硬盘驱动器、CD驱动器、DVD驱动器、或其他非易失性存储器,耦合到总线1010上,为IHS 1000提供信息的永久存储。操作系统1035加载在存储器1015中,以管理IHS 1000的操作。I/O装置1040,如键盘和鼠标点击装置,耦合到总线1010上。一根或多根扩展总线1045,如USB、IEEE 1394总线、ATA、SATA、PCI、PCIE及其他总线,可以耦合到总线1010上,以利于外围和装置连接到IHS 1000上。网络适配器1050耦合到总线1010上,以使IHS 1000能够通过有线或无线地连接到网络和其他信息处理系统上。尽管图10表示一个采用处理器100的HIS,但HIS可以采取多种形式。
例如,IHS 1000可以采取桌面、服务器、可携带、膝上型、笔记本、或其他形式因素计算机或数据处理系统的形式。IHS
[0071] 1000也可以采取其他形式因素,如个人数字助手(PDA)、游戏装置、可携带电话装置、通信装置或包括处理器和存储器的其他装置。
[0072] 以上公开了一种可以在处理器发出队列中提供提高的吞吐量的处理器。
[0073] 基于本发明的这种描述,本发明的修改和可选择实施例对于本领域的技术人员将是显然的。因而,这种描述向本领域的技术人员讲授了实现本发明的方式,并且应当理解成仅是说明性的。表示和描述的本发明的形式构成当前实施例。本领域的技术人员可以在部分的配置、形状和尺寸方面进行各种变更。例如,本领域的技术人员可以用等效元件代替这里说明和描述的元件。而且,本领域的技术人员在具有本发明的这种描述的好处之后,可以独立于其他特征的使用而使用本发明的特定特征,而不脱离本发明的范围。