专利名称:带有并行执行指令的装置的微处理机的制作方法
技术领域:
本发明总的说来涉及计算机领域,更详细地说,本发明涉及微处理机的体系结构和提高指令执行速度的方法。
历来的计算机都是设计成使其顺序(即一个接一个)地执行指令的。尽管计算机指令的顺序执行确实使操作方法合乎逻辑、有条理,但始终存在着提高处理速率的要求。这就促使研究人员探索实现并行执行指令方案的方法。
要成功设计出能并行执行多个指令的计算机或微处理机,必须解决许多问题。例如,微处理机一般有一个含有上百个专用指令的指令集的体系结构。而计算一下某已知体系结构的各种不同编址方式下可能的操作码,其总数可能达数千个之多。将某已知指令集的全部可能的第一指令和全部可能的第二指令配对,不难得出数百万不同的组合。设计一台能执行所有这些各式各样指令组合的计算机是一项艰巨的任务。显然,设计的复杂性是如此之大以致难以处理。制造能在短时间内对执行这些指令对的并行计算机的整个指令集进行译码的译码器很困难。
制造能并行执行指令的计算机还涉及到这样一个问题,即它必须能运用为现有技术的计算机而设计的软件,即为按顺序执行程序(每一个时钟周期执行一个指令)进行操作的计算机而设计的软件。就是说,并行计算机必须看起来象在进行顺序操作一样。
稍后即将看到,本发明公开了一种能在一个时钟周期内执行两个指令的计算机系统。本发明的计算机是通过对一对选自某已知指令集的指令进行译码,然后并行执行这些指令以得出正确的结果而进行工作的。本发明一个突出的特点是,本发明的计算机系统当各成对的指令之间无寄存器相关性存在时,只并行发送出两个指令。
本发明公开了一种能在一个时钟周期内并行执行两个指令的计算机系统。该计算机系统包括一个双指令译码器,它在各指令之间无寄存器相关性存在时只发出两项指令,且该两项指令是属于计算机指令集之中的。
在一个实施例中,本发明的计算机系统包括第一和第二指令流水线装置,供执行计算机各指令之用。第一流水线装置工作时能执行整个指令集发出的任何指令,第二流水线装置则局限于执行预定的指令子集。该子集是根据通常所执行的指令而选取的。
系统中装设了一个寄存器相关性检查装置,用以识别一系列指令中的第一指令的目标寄存器。相关性检查装置还确定在执行指令序列中的第二指令的过程中是否使用目标寄存器。若不使用,则相关性检查装置指示出满足了第一种情况。此外还装设了一个用以确定该序列中的第一和第二指令是否处在预定子集内的装置。当两个指令都处在子集中时,确定装置就指示出满足了第二种情况。每当满足了第一和第二两种情况时,该对指令就可以并行发送出。
本发明的另一个特点是,每当第一或第二条件有一个得不到满足时,计算机系统就改为只发出序列中的第一指令。就是说,若第一和第二指令有寄存器相关性或者其中一个指令不是从预定子集中提取的,则计算机就改为进入在一个时钟周期内只执行第一指令的状态。在此状态下,序列中的第二指令是在下一个时钟周期期间发出的。
从下面的详细说明和本发明最佳实施例的附图可以更全面地理解本发明的内容,但这些最佳实施例和附图仅仅是为了说明和理解本发明而提出的,不应视为对本发明的限制。
图1示出了现有技术微处理机中央处理单元流水线执行机构。
图2示出了本发明的CPU流水线的执行机构。
图3是本发明所采用的双指令译码装置的原理方框图。
这里公开了一种带有在一个时钟周期内并行执行两项指令的装置的微处理机。在下面的说明中,为使读者全面理解本发明的最佳实施例,谈到了许多具体细节,例如具体的指令类型、微处理机类型等。但显然,熟悉本技术领域的人士都知道,没有这些具体细节同样还是可以实现本发明的。另一方面,为避免使本发明内容的叙述过于繁杂,这里对一些公知的电路、结构和方法就不再详述了。
本发明涉及一种在一个时钟周期内并行执行多个计算机指令的装置和方法。本发明最好在Intel公司制造的名为i 586TM的微处理机上实施。i 586TM微处理机是i 486TM微处理机的一个改进机种。i 486TM的体系结构的细节在许多出版物中有介绍。(Intel i 486TM和i 586TM都是Intel公司的商标。)虽然本发明书中经常提到的是i 586TM的体系结构且各实例是引自同类指令中的,但不言而喻本发明并不局限这些特定的计算机。
流水线技术流水线技术是将多个指令在执行过程中同时加以重叠的实用技术。现有技术方法中广泛采用流水线技术来提高中央处理单元(CPU)的效率和处理速度。在流水线结构中,各指令在一端输入,通过各级或流水线段处理之后,在另一端输出。流水线的各级完成一部分指令的处理。
参看图1,图中示出了现有技术流水线的结构,其中指令的各级用沿左栏列出的条目来表示。各指令步之间的时钟时间间隔用水平列出的数字表示。流水线中的各指令步叫做时钟周期或机器周期。
流水线的第一线为“PF”级,它表示流水线的预取部分。在该级中,各指令是从一个单片超高速缓存器中预取的。下一个流水线级以“D1”表示。在此流水线级中,各指令经译码之后发出。D2级是个地址计算级。应该指出的是,按照流水线原理,在第二时钟周期的D1级执行第一指令(例如I1)过程中,第二指令(例如I2)就开始执行其预取级。流水线的“EX”级表示执行硬件中的指令,“WB”级则表示回写(writeback)操作。应该指出的是,在图1现有技术的结构中,在任何已知的时钟周期中,流水线中只执行单个指令。
上面说过,本发明的计算机是个超级计算机(superscalermachine),能在一个时钟周期内并行执行两项指令。为达到此目的,本发明有两个整体流水线,各整体流水线能在一个时钟内执行各指令。因此CPU能在两个独立的流水线中并行发出两项指令。在目前最佳的实施例中,各流水线命名为“U”和“V”流水线。U流水线最好能执行x86体系结构中的任何指令,V流水线能执行某些简单的指令,这在本说明书稍后的章节中将进一步说明。
参看图2,图中示出了本发明的流水线结构。应该指出的是,在图2的流水线序列中,可以看出两个指令I1和I2系在一个时钟周期内在流水线的各级中执行的。这里流水线的第一级也是预取级,在该级中,各指令是从单片超高速缓存器中预取的。由于本发明微处理机的指令和数据的超高速缓存器是分开的,因而跟现有技术CPU的情况一样,各预取过程再也不会与存取超高速缓存器的数据基准有矛盾。这就是说,在预取级期间,直接从指令超高速缓存器提取指令I1和I2,然后装入U和V流水线中。在下一个流水线级(即D1),指令I1和I2经译码之后发出。
指令发送和流水线程序设计前面说过,本发明的微处理机能在一个时钟周期内发出一个或两个指令。但为同时发出两个指令,该指令对中的两个指令都必须满足某些条件。就是说,指令对的两个指令必须在预定指令子集中,且彼此互不相关(稍后即将详述本发明的这方面)。
并行发出两项指令的过程叫做“指令配对”。指令经过配对时,发送到V流水线(第二流水线)的指令总是发送到U流水线的指令的下一个顺序的指令。虽然各指令可以并行执行,但在编程员看来,这个情况完全就跟它们是顺序执行时一样(现有技术设计的情况就是这样)。各指令通过D2和EX级直到它们在WB级中的完成过程都是并行进行的。各指令通过流水线行进的过程中,不难理解可出于各种原因而停止执行各指令。当例如U流水线中的指令受到延迟时,则与其一起发送到V流水线的指令(如有的话)也在流水线的同一级中受到延迟。各相继的指令不可以往前送至任一流水线中停止执行指令的级。停止执行V流水线中的一项指令时,与其一起发送到U流水线的指令可以往前发送,而这时V流水线停止工作。
指令配对本发明的基本构思是计算机系统具有这样一种译码装置,在两个指令之间无寄存器相关性存在且两个指令都属于适宜并行执行的指令子集时,该译码装置只并行发出该两个指令。该双指令译码器首先识别程序序列中第一指令的目标寄存器。该指令就成为U流水线指令。然后本发明的装置确定在执行序列中第二指令的过程中该U流水线指令是否被按任何方式使用。若没有使用(即两个指令是独立的),则并行发出该两项指令。
前面说过,本发明的超级计算机具有两个采用整个指令集内的并行方式的并行流水线,叫做U流水线和V流水线。微处理机的指令部件总是将指令序列中的第一指令发送到U流水线,把第二指令发送到V流水线。每当U流水线的操作数不可访问、或各流水线之间的地址有矛盾时,V流水线就停止工作。配对只能在两个整数指令之间或两个浮点指令之间发生。
一般说来,成对的简单指令只要它们之间没有相关性都是可加以配对的。为了同时发出两个整数指令,按照目前最佳实施例就必须满足下列条件。首先,指令必须属于x86指令集的预定子集。下面的表1中示出了配对整数指令用的指令子集。
(注表1中,条目“alur,r”表示包括诸如“add”、“or”、“adc”、“sbb”、“and”“xor”“cmp”之类的一组指令。)分解成子集的概念是本发明中的一个重要概念,因为它从根本上减少了在并行执行过程中应加以处理的各不同指令可能有的组合数。从本发明的系统可知,指令子集是不多的(大约20个),占一般软件所能执行的全部指令的将近95%。上面的表1中列出了一批最常用的指令。分解成子集的应用意味着双指令译码器无需按整个指令集而进行操作。相反,可以通过对设计的简化以大大改进有关的定时关系。分解成子集的应用还可以加速计算机识别两个指令的过程,对它们快速译码,然后并行执行这些指令。
对指令并行执行的另一个重要限制是要求各对指令之间没有寄存器相关性存在。这就是说,第一指令的目标寄存器不能用作下一个指令的来源、目标、基础或索引。这个要求适用于寄存器对各指令的明显性的和隐含性的应用。(注在这方面,当“push”和“pop”指令进行配对的情况例外,进行该配对时,在目前最佳实施例中,在更新堆栈指示字用的分段部件中具有专用的硬件)。进行相关性检查时,采用16/32位寄存器的任何部分和采用整个寄存器都一样。若U和V流水线指令之间具有存储器相关性,即U和V流水线存储器的存取都是针对数据超高速缓存器的同一个库/地址进行的,则V流水线周期将被加以平衡,直到对U流水线的存取结束为止。
对当前i 586TM微处理机的实施的特殊限制还包括·除OFJcc外,V流水线指令不能有前缀。
·代码超高速缓存器中对应于第一指令的结束位标志必须适当地设定。(在转让给本发明的受让人的、发明名称为“指令译码用的结束位标志”的待审批的专利申请(申请号_,申请日_)中,公开了结束位标志的概念)。
·预取缓冲器中具有足够的操作码字节供译码两个指令之用。
·U或V流水线中的指令可取移位模式或直接模式,但不能两者兼取。
·V流水线中不能有ADC和SBB指令(以避免依赖于U流水线进位标记)。
现在参看图3,图中示出了说明本发明的广义概念的双指令译码器的方框图。图3中,U流水线操作码和V流水线操作码分别接到译码器12和14上。U流水线操作码除接到译码器12外还接到另一个译码器13上。译码器12、13和14含有许多普通可编程的逻辑阵列(PLA),由这些逻辑阵列进行全部指令的译码工作。举例说,译码器12产生U流水线指令微代码的第一向量,译码器14则有一个类似的PLA,用于译码V流水线指令微代码的第一向量。各微代码向量由许多字段组成,其中含有诸如源寄存器位置、目标寄存器、ALU操作信息、地址计算和移位直接等信息。
当然,本发明的主要特点是图3中所示的双译码器能在一个周期内发出一个或两个指令。由于本发明的一个目的是要使本发明的微处理机能处理所有x86的指令系列,因此图3的译码器分成两个部分或分支。其中一个分支能处理x86指令集中的所有指令,另一个分支专门并行处理第二指令。换句话说,本发明包括这样一个操作方式若不能满足超级计算机的各项条件,则每个时钟周期只执行一项指令。
继续参看图3,两个流水线非常相似,只是如不能满足超级换计机的条件时,U流水线就作为故障流水线而工作。这就是说,图3中的U流水线分支能执行全部x86指令,而V流水线则仅以全指令集中的子集为目标。举例说,译码器13和14是特为只译码整个x86指令集的子集而设计的。另一方面,当计算机不履行每个时钟周期的一个指令时,译码器12就能译码整个指令集。在任何概念性序列中,U流水线总是表示序列中的第一指令,V流水线总是表示同一个序列的第二指令。
寄存器相关性的检查由单元19进行,单元19接收来自译码器13和14的输出。译码器13和14的输出(接到单元19)包括指示当前指令的目标寄存器的信息。单元19中的普通逻辑电路通过识别U流水线的目标寄存器和保证V流水线指令中不使用该寄存器从而确定各指令的目标寄存器中是否存在相关性。在进行寄存器相关性检查的同时,单元17进行长度计算。换句话说,单元17计算指令对的长度,即U流水线加V流水线指令的和。单元15只计算U流水线指令的长度。
从根念上讲,单元15和17的输出接到多路复用器21上,该复用器输出指令的长度。多路复用器21被寄存器相关性检查单元19输出的、提供基本“发送1/发送2”(issueone/issuetwo)信息的信号ISELTWO所控制。信号ISELTWO是用以通过控制MUX22而有条件地执行V流水线指令的同一个信号。当寄存器相关性检查单元19确定只能执行一个指令时,MUX21就被控制使得指令长度等于U流水线向量当时的长度。在V流水线中,当只发出一个指令时,控制信号ISELTWO选择“无操作”(“NOP”)并供多路复用器22加以输出。在这种情况下,指令长度完全来源自U流水线。
无寄存器相关性存在时,两个指令可并行执行。在此情况下,选取MUX21输出的长度与U和V流水线一起的长度计算值(即单元17的输出)相等。在此情况下,处理机基本上把该对指令视为一个大指令。两个指令并行执行时,MUX22就让U流水线微代码通过,一直传送到MUX22的输出端。MUX21和MUX22输出端处的信息耦合到微处理机的执行机构。执行机构通常包括地址计算部件、运算逻辑部件(ALU)、数据通路、寄存器文件等。
应该强调指出的是,图3双指令译码器所进行的全部操作是在一个时钟周期内完成的。就是说,各操作码都耦合到上译码器的输入端,各矢量都由多路复用部件提供,这一切都在一个时钟周期内完成。
配对的举例为了更好地理解和领会本发明的内容,本发明提供下面的有关指令序列的一些实例。这些序列也举例说明了早先讨论过的一些配对规则。(注在所提供的格式中,目标操作数列在左侧)。
下面是成对的简单指令。
movedx,[ebx]addesi,4;
在此实例中,序列中的第一指令是“mov”,该指令由U流水线处理。U流水线指令的目标寄存器是dex。由于在V流水线“add”指令中不以任何方式使用edx,而且由于两个指令都在指令集内(见表1),因而图3的译码器能并行发出该两个指令。
在执行的过程中,第一指令操作码(即“mov”)为U流水线操作码,其中“add”为V流水线操作码。上译码器12译码“mov”指令并产生用于将目标寄存器确定为edx的U流水线向量。译码器还确定需要读出存储器,其中的地址由ebx确定。译码器12还识别地址计算的各分量,并确定那是一个向量的宏指令。同时,子集译码器13测定“mov”是否处在适宜成双发出的指令子集中。译码器13还识别将要被寄存器相关性检查单元19使用的目标寄存器dex。单元19会将edx与esi加以对比鉴定,并最后得出结论它们是不相同的。
在V流水线侧,V流水线译码器14检查addesi,并识别出esi为目标寄存器(在此实例中,esi也是源指令)。译码器14也识别直接分量(即4),接着单元17计算两个指令的长度。然后“add”指令沿V流水线往下送。这样,由于两个指令都是简单指令,且它们之间无相关性,因而这两个指令可以配对。
其次再看看下面的配对实例movedx[ebx];
addedx,4;
在此实例中,U流水线的目标寄存器为edx。由于V流水线指令中也使用这个目标寄存器,因而相关性检查逻辑电路确定两个指令不能并行发出。在此情况下,先发出U流水线指令,而V流水线通路则仍然处在未被利用的状态(即V流水线发出“NOP”)。在下一个时钟周期内,在U流水线中执行“add”指令。应该理解的是,在下一个时钟周期期间在U流水线中发出的add指令无论其在序列中后面所跟着的是什么指令都可以并行发出。两个指令并行发出时,序列中的下一个指令(“add”指令后面的指令)会在V流水线中发出。
现在看看下列实例lds[ebx];
pusheax;
在此实例中,装入指令“lds”并不在适宜并行执行的指令子集中(见表1)。因此,lds指令在U流水线中发出,“push”指令则在下一个时钟周期内在U流水线中发出。在此情况下,U流水线的上译码器13将lds指令判定为不处在适宜并行发送的子集中。尽管两个指令之间没有相关性,情况也是如此。有一点很重要,即当两个指令不能并行发出时,V流水线操作码在下一个时钟周期内就成了U流水线操作码,这时序列中的下一个指令成为V流水线操作码。
应该理解的是,本目前最佳实施例的x86指令子集特定的指令一览表在不同的另一些实施例中是不同的。同时,在各种不同的实施例中,如果存在容许两项指令并行发出和执行的专用硬件,则可以容许某些具有隐式相关性的指令配对。举例说,目前最佳的实施例中具有可并行执行下列指令的专用硬件cmpedx,o;
jnzloop在上述实例中,虽然与Z标志具有隐式相关性,但微处理机具有能使这些指令并行发出和执行的专用硬件。
配对两个浮点指令时,给整数指令配对而列出的最后三个条件并连同存储器相关性检查在目前这个实施例中不适用。原因在于,浮点指令没有紧跟着的字节。此外,U流水线指令与V流水线中的FXCH指令之间容许有寄存器相关性。由于FXCH是寄存器与寄存器间的指令,因而存储器相关性不适用。目前最佳实施例中可在两个流水线中的任一流水线中配对的浮点指令子集列于表2。它们都是一个向量的指令。
熟悉本技术领域的普通技术人员在阅读上述说明之后都知道,对本发明的上述实施例是可以作种种变更和修改的,不言而喻,上述特定实施例决不能视为对本发明的限制。举例说,尽管上述公开内容中表明必须满足一系列特定的条件和法则,但在不脱离本发明的精神实质或范围的前提下也可以依赖于其它条件。因此,涉及附图的细节并不能限制本发明权权利要求书的范围,权利要求书则只引用了本发明的实质性特点。
权利要求
1.一种可并行执行两个计算机指令的计算机系统,其特征在于包括第一和第二指令流水线装置,用于执行计算机指令,所述第一流水线装置工作时能执行预定指令集发出的任何指令,所述第二流水线装置工作时只能执行来自所述预定指令集的指令子集;相关性检查装置,用以识别指令序列中第一指令的目标寄存器,所述检查装置还确定在执行所述序列中的第二指令过程中是否使用所述目标寄存器,若不使用,所述相关性检查装置就指示第一条件得满足;用于确定所述序列中的第一和第二指令是否存在于所述子集中的装置,当该第一和第二指令都在所述子集中时,所述确定装置指示第一条件得到满足;指令配对装置,用于在每当所述第一和第二条件得到满足时将所述第一和第二指令并行发送到所述第一和第二流水线装置。
2.如权利要求1所述的计算机系统,其特征在于,每当所述第一和第二条件得到满足时,所述第一和第二指令在一个时钟周期内发出。
3.如权利要求1所述的计算机系统,其特征在于,每当所述第一或第二条件得不到满足时,所述指令配对装置只将所述序列中的所述第一指令发送到所述第一流水线装置。
4.如权利要求3所述的计算机系统,其特征在于,它还包括计算所述第一和第二指令的组合长度的装置。
5.如权利要求4所述的计算机系统,其特征在于,所述第一和第二指令各含有整数指令。
6.如权利要求4所述的计算机系统,其特征在于,所述第一和第二指令各含有浮点指令。
7.一种具有一个中央处理单元(CPU)和一个执行机构的计算机系统,该CPU用以处理由选自指令集的一序列指令所组成的程序,该执行机构用以执行所述指令,其特征在于,所述系统包括第一和第二指令流水线装置,用以执行所述指令序列,其中多个指令在执行的过程中同时重叠;译码装置,用于译码来自所述序列的一对指令,从而产生第一和第二微代码向量,以便分别在所述第一和第二指令流水线中执行;所述译码装置有一个用以确定所述第一和第二指令是否被包含在所述指令集的预定子集中的装置;计算装置,用以计算所述第一指令的长度和所述第一和第二指令的组合长度;用以确定所述一对指令之间不存在寄存器相关性的装置,所述确定装置在每当存在相关性时产生一个信号;多路复用装置,用于在每当收到所述信号且所述预定子集中含有所述第一和第二指令时,将所述第一和第二微代码向量和所述组合长度发送到所述执行机构,否则所述多路复用装置发出所述长度的所述微代码指令。
8.如权利要求7所述的系统,其特征在于,每当所述多路复用装置收到所述信号且所述预定子集中含有所述第一和第二指令时,在所述系统的一个时钟周期内执行所述第一和第二指令。
9.如权利要求8所述的系统,其特征在于,所述第一和第二指令包括整数指令。
10.如权利要求8所述的系统,其特征在于,所述第一和第二指令包括浮点指令。
全文摘要
一种计算机系统有一个双指令译码器,当两指令之间无寄存器相关性,且它们都属于整个指令集的预定子集时,该双指令译码器在一个时钟周期内并行发出该两指令。该系统有执行指令集中任何指令的第一指令流水线和只执行按局部性原理选取的预定指令子集的第二流水线。寄存器相关性检查器确定在执行指令序列中的第二指令的过程中是否使用第一指令的目标寄存器。当两个指令都在子集内且无相关性时,可在第一和第二流水线中发出第一和第二指令。
文档编号G06F9/30GK1074771SQ93101139
公开日1993年7月28日 申请日期1993年1月21日 优先权日1992年1月23日
发明者E·T·格罗乔斯基, K·D·舒梅克, A·蔡迪, D·B·阿尔珀特 申请人:英特尔公司