指令流水线技术研究.docx
《指令流水线技术研究.docx》由会员分享,可在线阅读,更多相关《指令流水线技术研究.docx(15页珍藏版)》请在冰豆网上搜索。
指令流水线技术研究
指令流水线技术研究
摘要:
流水线技术是当前指令集处理器设计中广泛采用的技术。
首先介绍了有关流水线的基础知识,包括概念、特点、分类及其主要性能指标。
然后提出了三条流水线理想假设,并由此得出了指令流水线设计的三大挑战,从而指出了在指令流水线设计时应重点解决的三大问题和设计方法。
最后是对该技术的总结与展望。
关键字:
指令流水线;概念;性能指标;理想假设;处理器设计;
前言
流水线技术是提高系统吞吐率的一项强大的实现技术,并且不需要大量重复设置硬件。
20世界60年代早期的一些高端机器中第一次采用了流水线技术。
第一个采用指令流水线的机器是IBM7030(又称作Stretch计算机)。
后来的CDC6600同时采用了流水线和多功能部件。
到了20世纪80年代,流水线技术成为RISC处理器设计方法中最基本的技术之一。
RISC设计方法的大部分技术都直接或者间接以提高流水线性能为目标。
从此以后,流水线技术也被有效地应用到CISC处理器的设计中。
Inteli486是IA32体系结构中的第一个流水线实现。
Digital的VAX和Motorola的M68K的流水线版本在商业上也取得了成功。
流水线技术是当前指令集处理器设计中广泛采用的技术。
在这里我们将重点放在(标量)流水线处理器的设计。
流水线处理器设计中的许多方法和技术,例如用于检测和化解相关的流水线互锁机制,都是标量处理器设计的基本方法。
1流水线基础
加快机器语言的解释过程提高机器的运算速度是设计计算机的基本任务之一。
这可以通过两个途径来实现。
一个途径是提高器件的速度,采用更好的算法,增加指令内各微操作的并行程度,减少解释过程所需要的拍数等多项措施来加快机器指令的解释。
另一个途径则是采用重叠和流水方法,同时解释两条、多条以至整段程序,从而加快整个机器语言程序的解释。
流水线技术是目前广泛应用于微处理芯片中的一项关键技术,Intel公司更是这项技术在微处理器中应用的首先实现者。
1.1流水线概念
指令的三种控制方法:
顺序方法、重叠方式、流水方式。
顺序方法是指各条机器指令之间顺序串行地执行,而且每条机器指令内部的各个微指令也是串行执行。
这种方法虽然控制简单但速度上不去,机器各部件的利用率低。
重叠方式是指在解释第K条指令的操作完成之前就开始解释第K+1条指令。
通常都是采用一次重叠,即在任何时候,指令分析部件和指令执行部件都只有相邻两条指令在重叠解释。
这种方式使指令的解释速度有所提高,控制也不太复杂但会出现冲突、转移、相关等问题,这些都需要在设计时想办法解决。
流水方式就是把并行性或并发性镶嵌到计算机系统里的一中形式。
它是把重叠的顺序处理过程分解为若干过程,每个过程能在专用的独立模块上有效地并发工作的技术。
在概念上“流水”可以看成“重叠”的延伸。
不同的是“一次重叠”只是把一条指令的解释分解成两个子过程,而“流水”则是分解为更多的子过程。
1.1.1指令重叠
一条指令的执行过程可分为取指令、分析与执行三个过程(如图1.1)。
取指令,取出该指令送到指令寄存器。
指令的分析指的是对指令的操作码进行译码,按寻址方式合地址字段形成操作数真地址,并用此真地址去取操作数,还要为准备取下一条指令提前形成下一条指令的地址等。
指令的执行则是指对操作数进行运算、处理,或存储运算结果。
指令的重叠解释方式指的是,在解释第k条指令的操作完成之前,就开始解释第k+1条指令。
假设这三个过程分别在3个不同的硬件(指令控制器、分析器和执行部件)上进行,则当第k条指令处于分析阶段的时候,控制器就处于空闲状态,这个时候可以对第k+1条指令进行取指令操作,当第k条指令处于执行状态时,分析器就处于空闲状态,这时可以进行对第k+1条指令的分析(图1.2)。
很显然,重叠解释的方式并不能加快一条指令的实现,但是可以加快两条相邻指令以至一段程序的解释。
图1.1机器指令的顺序执行方式
图1.2指令的重叠解释方式
1.1.2流水线
流水其实就是重叠的引申,上面谈到的重叠模型实际上就是一个简单的3级流水模型。
如果将分析与执行阶段再细分为指令解码、取操作数、执行运算和存储结果,当第k+1条指令在第k条指令执行去操作数的时候就可以开始解码,而不必等到分析k完全结束。
这样子在一个指令周期内就可以同时执行5条指令。
流水线工作方式是把一个重复的过程分解为若干个子过程,每个子过程可以与其他子过程同时进行。
由于这种工作方式与工程中的生产流水线十分相似,因此,把他成为流水线工作方式。
在处理机的各个部分几乎都可以采用流水线工作方式。
指令的执行过程可以采用流水线,称为指令流水线。
运算中的操作部件,如浮点加法器,浮点乘法器等可以采用流水线,成为操作部件流水线。
访问主存储器部件也可以采用流水线。
甚至在处理机之间,机器之间也可以采用流水线。
图1.3指令流水线
1.1.3流水线的特点
从上面的分析中可以看到,在处理机中采用流水线方式与采用传统的串行方式相比,具有一下特点:
1.在流水线中处理的必须是连续任务,只有连续不断的提供任务才能充分发挥流水线的效率。
例如。
要是浮点加法器充分发挥作用,需要连续提供浮点加法运算。
然而,由于程序本身的原因和程序设计过程中人为造成的一些原因,入数据相关等,不可能为浮点加法器连续的提供同一种操作。
因此,在采用流水线工作方式的处理器中,特别是当流水线的级数较多时,要在软件和硬件等多方面为流水线提供连续的任务,以提高流水线的效率。
2.把一个任务分解成几个有联系的子任务,每个任务由一个专门的功能部件来实现。
因此,流水线实际上是把一个大的功能部件分解为多个独立的功能部件,并依靠多个功能部件并行工作来缩短程序的执行时间。
在流水线中,一个子任务通常称为一个子过程,或者一个功能段。
3.在流水线每一个功能部件后面都要有一个缓冲寄存器,或称为锁存器等,用于保存本段执行的结果。
这是因为流水线中每一段的延迟一般都不可能相等,因此,在段与段之间传递子任务时,必须要通过缓冲寄存器。
当某一个功能段的时间变化范围比较大的时候,要设置多个缓冲寄存器。
4.流水线中各个段要尽量匀称,即时间要求尽量相等,否则将容易引起“阻塞”、“断流”等问题。
执行时间最长的段将成为整个流水线的“瓶颈”,这时,流水线中各段将受到限制而不能充分发挥作用。
只有当整个流水线完全充满时,整个流水线的效率才能得到充分的发挥。
为了设计出高效率的流水线,要充分注意上述问题。
1.1.4流水线的分类
从不同的角度,按照不同的观点,可以把流水线分成多种不同的类型。
平时所说的某种流水线,往往是按照某种观点,或者从某一个特定的角度对流水线进行分类的结果。
因此,从名称上只能反应出这种流水线在某一个方面的特点或者功能。
按照流水线的各功能段之间是否有反馈信号,可以把流水线分为线性流水线和非线性流水线。
线性流水线是将流水线各个功能段逐个串联起来,输入数据从流水线的一段进入,从另外一段流出。
数据在流水线中经过时,没一个功能段都流过一次,且仅仅流过一次。
一条线性流水线通常只完成固定的一种功能,在现代计算机系统中,线性流水线已经被广泛的应用于指令执行过程、各种算术运算操作、存储器访问操作等。
图1.4非线性流水线
非线性流水线经常用于递归调用,或者构成多功能流水线。
按照流水线使用的不同级别,可以把流水线分为功能部件级、处理器级以及处理机之间等多种类型。
处理机级流水线即指令流水线,他把一条指令执行过程分解为多个子过程,每一个子过程在一个独立的功能部件中完成。
功能部件级流水线也称为运算操作流水线,如浮点加法器流水线、浮点乘法器流水线等。
处理机间流水线又称为宏流水线,一般是两台以上处理机通过存储器串行连接起来,每一个处理机对一个数据流的不同部分分别进行处理。
图1.5指令流水线
流水线又可分为单功能流水线和多功能流水线。
顾名思义,单功能流水线只能完成固定的单一功能,多流水线通过各个段间进行不同的连接,在不同的时间内或者统一时间内通过不同的连接方式完成不同的功能。
在多功能流水线中,根据同一时间内是否可以连接成多种方式,同时执行多种任务,可以把多功能流水线分为静态流水线合动态流水线。
所谓静态流水线指的是在同一时间段内,多功能流水线各段只能按照一定固定的方式连接,实现一种固定的功能。
只有当按照这种连接方式工作的所有任务都流出流水线之后,才能重新进行连接,完成其他功能。
动态流水线则在同一时间段内,可以按照不同的连接方式,完成多种不同的功能。
这个时候要求流水线中个功能部件之间不能发生冲突。
除了以上几种分类方法外,还可以根据其他标准,从不同角度对流水线进行分类。
1.2流水线的主要性能
衡量流水线主要性能的指标主要有吞吐率,加速比和效率。
1.2.1吞吐率
吞吐率是指在单位时间内流水线所完成的任务数量或者输出的结果数量。
即:
式(2.1)中,n为任务数,
是处理完成n个任务做用的时间。
本式为计算吞吐率最基本的公式。
有的时候我们还需要求一条流水线的最大吞吐率:
式(2.2)中
为第k个子过程所花费的时间。
最大吞吐率受限于流水线中最慢子过程即瓶颈子过程所需要的时间。
为了提高流水线的最大吞吐率,首先要找出瓶颈,然后设法消除此瓶颈。
消除瓶颈有两种办法,一是将瓶颈子过程再细分,另一种办法是通过重复设置多套瓶颈段并联,让他们交叉进行。
后一种方法需要解决好在各并行子过程之间的任务分配合同步控制,比起瓶颈子过程再细分控制要复杂、设备量要多一些。
1.2.2加速比和效率
完成一批任务,不使用流水线所花的时间与使用流水线所用时间直比即为流水线的加速比。
如果不使用流水线,即顺序执行所用时间为
,使用流水线的执行时间为
则流水线的加速比为:
这是计算流水线加速比的基本公式。
流水线的效率是指流水线的设备利用率。
在时空图上,流水线的效率定义为n个任务所占的时空区域与k个功能区域所占时空区域之比。
因此,流水线的效率包含有时间和空间两方面的因素。
实际上,n个任务所占的时空区域就是顺序执行n个任务所用的总的时间
。
而一条k段流水线完成n个任务总的时空区域为k
,其中
是流水线完成n个任务所用的总时间。
则一条k段流水线的效率可表示为:
此式是计算流水线效率的一般公式。
如果流水线各段执行时间均相等,且输入的n个任务是连续的,则一条k段流水线的效率为:
从流水线的时空图上来看,上式分母部分是完成n个任务所用时间与k个功能段所围成的总面积,而分子部分则是k个功能段实际所占有的面积。
因此,利用时空图来计算流水线的效率十分方便。
2指令流水线设计
我们做任何事情,都希望能够达到理想状态,但这往往是不现实的,我们研究理想状态的意义就在于给出一个衡量的标准,并且努力向这个标准靠近,这在指令流水线的设计过程中也不例外。
2.1流水线理想假设
对于指令流水线的目的,我们是希望能最大限度的提高系统的性能。
然而在实际中却往往做不到,因为只有在理想状态下,k级流水线的设计才能将提高k倍的吞吐率,理想状况主要基于3条假设,我们称之为“流水线理想假设”,他是正确评估流水线设计的关键。
设计各种方案解决实际流水线与流水线理想假设之间的矛盾,这就组成了流水线设计的主要技术。
流水线理想假设包括:
1.一致的运算分量:
要完成的整个运算量可以均匀的分成延迟一只的若干分量。
2.重复的运算:
输入数据有大量相同的、重复的运算。
3.独立的运算:
所有相同的重复运算之间没有相关性。
2.1.1一致的运算分量
第一条流水线的理想假设说明,将要进行流水化的运算分量均匀的分成k个延迟相同的分量。
这意味着以前的设计可以均匀的分成k个均衡的流水段。
如果以前总的运算延迟,也就是非流水设计的式中周期为T,那么k级流水线的设计式中周期就是T/k,也就是流水段中每一段的延迟。
基于这个理想假设,时钟频率能够提高k倍,并且吞吐率也提高了k倍。
在实际的流水线设计中,这个理想假设可能并不成立。
将总的运算分量完全均匀的分成若干分量是不可能的。
在一个具有3级流水线的浮点加法器的例子中,设总的延迟为500ns,流水线分3段,每一段的延迟分别为200ns,100ns,200ns.显然,总的延迟并没有均匀的分布到流水线的三段当中。
由于流水线的时钟周期决定于延迟最长的那一段,因此延迟较短的段会有一些无效或者失效的时间。
比如浮点加法器的第二段,它就有100ns的无效时间,我们可以把它称之为“内部碎片”。
由于内部碎片的存在,完成同样的运算的延迟将会增加。
还有一个内在的假设,即流水段之间引入的缓冲不会带来额外的延迟,并且流水线的时钟信号也不会引入额外的延迟。
同样,这一假设在实际当中也是不能成立的。
在相应的例子中,为了保证信号的时钟信号的准确建立,设置了暂存器,因此总的时钟周期又延长了,从而导致了实际性能不可能提高3倍。
第一条流水线理想假设主要包含了以下两种观点:
在将以前的运算分量分成若干分量是时,没有引入无效时间;段间缓冲的引入及时钟没有带来额外的延迟。
在芯片级的设计中,可以采用一些锁存器,比如Earle锁存器可以使流水线时钟产生的延迟尽可能地小。
因此如何将总的运算量均匀的分到各流水段中构成了流水线设计的第一个挑战。
我们的目标是,尽可能使各个流水段保持均衡,以减少内部碎片。
由于各个流水段不能完全均衡内部碎片是不满足第一条流水线理想假设的主要原因,这将成为一种开销,并导致k级流水线设计的吞吐率提高达不到理想的k倍。
2.1.2重复的运算
第二条流水线理想假设说明,流水线不断地重复执行相同的运算。
这意味着在多组输入数据中,有些运算是相同的并且这些运算要反复执行。
每次执行时,流水线提供的分量执行顺序都是一样的。
对于浮点加法器的例子,将包含大量的浮点数对要进行相加,每一对操作数都要通过相同的3级流水线。
这以一设说明,每一次的重复运算都会使用流水线中的所有段。
对于我们的例子这显然是成立的。
浮点加法器满足这条假设,是因为该流水线只完成了一个功能,即浮点加法运算。
如果你要设计的流水线要完成多个功能,这一假设就不满足了。
例如,设计一条既可以计算加法又可以计算乘法的算术流水线。
在多功能流水线中,单独一项功能可能并不需要所有的流水段,而可能由流水段的不同子集来完成不同功能。
由于输入数据以同步方式通过流水线,有些数据可能不需要某些流水段,当他们通过这些段的时候,将什么也不执行。
这种没有使用或者空闲的流水段带来了另一种形式的流水线失效,可以称之为“外部碎片”。
与内部碎片相似,外部碎片也是一种流水线开销,应该尽量减小。
第二条流水线理想假设认为所有的流水段总是被充分利用。
除了说明不存在外部碎片之外,这条假设还说明要处理的数据是大量的。
第一个数据达到流水线的最后一个段需要k个周期,这k个周期称为流水线的“填充时间”。
最后一个数据进入流水线的第一个段后,还需要k个周期排空流水线。
在填充合排空过程中,不是所有的流水段都处于工作状态。
如果有大量的输入数据要进行处理,可以使流水线的填充和排空时间只占总时间的很小一部分。
因此,多有流水段都可以认为总是处于工作状态的。
2.1.3独立的运算
第三条流水线假设说明,流水线要处理的运算是彼此独立的。
这意味着,所有同时间驻留在流水线中的运算是不相关的,也就是说,任何两个运算之间不存在数据或者是控制相关。
这一假设保证流水线处于“流动”的工作方式,即后面的运算不会因为存在相关性而等待前面运算的完成。
对于浮点加法器的例子中,这一假设是成立的。
如果有多对操作数要进行相加,一对操作数的相加不会以来另一个加法的结果。
这些操作数可以按照“流动”的方式进行处理。
这一条假设对于一些流水线可能不成立。
后面的运算可能需要前面的结果,而这两条运算可能同时驻留流水线中。
如果后面的运算已经进入到需要结果的流水段,而这时候前面的运算还没有到达产生结果的流水段,哪么后面的运算必须在那一段等待。
这种等待称为“流水线停顿”。
如果某一运算停顿在流水线的某一段,所有后续的运算可能都要被迫停顿。
流水线停顿不可避免地导致某些段处于空闲状态,这可以看作是一种动态的外部碎片,因此会导致流水线吞吐率降低。
如果相关是不可避免的,那么再设计流水线的时候,就要尽量减少流水线的停顿次数。
3指令流水线
前面三条流水线是流水线的理想假设。
在大多数情况下,算术流水线的实际情况与理想假设相差不是太大。
然而,对于指令流水线,实际情况与理想假设之间的差距就要大一些。
而连接这一差距的桥梁正式指令流水线设计的趣味性合挑战性所在。
在设计流水线处理器时,这三条假设成为三个主要的挑战。
这三大挑战同时也提供了一条探索流水线处理器设计技术的思路。
3.1指令流水线设计
在设计指令流水线时,三条流水线假设成为设计的目标。
一条指令的处理过程就是要流水化的运算,它必须被划分成多个尽量一致的子运算,以获得尽量均衡的流水线。
处理一条指令的时间延迟成为“指令周期”,每一段的时间延迟决定了“机器周期”。
指令周期是一个逻辑概念,它是指指令的执行周期。
一个程序包含多条指令,程序的执行相当于相应运算的反复执行。
机器周期是一个物理的概念,它包含数字逻辑电路中存储单元的时钟等,同时它也是流水线的时钟周期。
指令流水线设计的主要任务可以看作是将逻辑指令周期映射到物理机器周期。
换句话说,就是将指令周期所对应的运算分成一个子运算的序列,由流水线的各段运行。
要有效的进行这种分割或者映射,必须考虑三条流水线的理想假设。
一致的运算分量我们将指令周期分解成多个机器周期的过程称为“量化流水段”。
在进行量化流水段时,要尽量减少内部碎片。
如果在量化流水段时考虑不充分,就会引入内部碎片,从而影响流水线的利用率。
第一条流水线理想假设带来了指令流水线设计的第一个挑战,称之为流水线的均衡。
流水线越均衡,内部碎片越少。
重复的运算与单一功能的算术流水线不一样的是,指令流水线天生就是多功能流水线,即它必须能处理多种不同的指令类型。
不同的指令类型需要子运算序列稍微不同,所对应的硬件资源也有所不同。
指令流水线设计的第二个挑战就是,连接或者整合不同指令类型对不同资源的需求。
流水线应能够支持所有的指令类型;同时应该尽量减少每种指令类型的无效或者空闲的机器周期,也就是减少外部碎片。
独立的运算算术流水线处理的是数组数据,他们一般都不相关。
与算术流水线不同的是,指令流水线所处理的指令彼此不是完全独立的。
因此,指令流水线必须要有一套内部机制,用来检测指令间发生的相关并保证指令相关不会导致错误。
指令相关可能会导致流水线停顿,从而引起失效。
前面提到过,流水线停顿是是一种动态的外部碎片,它会降低流水线的吞吐率。
因此,指令流水线设计的第三个挑战就是尽量减少流水线停顿。
3.2指令集体系结构的影响
在正式讨论指令流水线设计的三个主要挑战之前,简单的考虑一下指令集体系结构对于指令流水线的影响,将很有启发意义。
下面将一次考虑三条流水线理想假设。
一致的运算分量使流水段保持均衡的第一个挑战说明,必须保证分量的延迟是一致的。
考察一条指令处理过程中的所有运算分量,其中一定有一个分量的延迟最长,并且这个分量不容易再分解成细的运算分量。
在流水线处理器设计中,这样的关键分量是对存储器的访问。
由于处理器和存储器的速度差异,存储器访问将成为关键的运算分量。
为了尽量使指令流水线效率更高,应该对寻址模式进行优化,并且应该采用能够跟上处理器速度的快速cache。
重复的运算第一个挑战是将不同的指令类型对资源的要求统一起来,这是RISC体系结构的主要目的之一。
降低指令类型的复杂性和多样性可以降低整合不同指令类型任务的难度。
复杂的寻址模式不仅需要额外的访存,而且增加了资源需求的多样性。
将所有这些资源需求整合到一条指令流水线当中是一件相当困难的事情,并且所得到的流水线对于很多指令其效率很低。
这些指令将会产生外部碎片,从而降低了流水线的利用率。
对于一个RISC体系结构的流水线而言,资源整合要简单一些并且得到的流水线效率更高,外部碎片更少。
独立的运算第三个挑战是尽量减少由于指令的相关而引起的流水线停顿,这可能是流水线处理器设计中最吸引人的地方。
要正确地完成操作,指令流水线必须检测并化解指令相关。
复杂寻址模式,尤其是与存储器访问有关的模式,会因为存储器地址标识符的问题而导致相关检测非常困难。
一般来说,寄存器相关比较容易检测,因为寄存器在指令中是明确指出来的。
简单而且堆成的指令合适便于进行译码和相关检测。
相关的检测和化解可以由编译器静态完成,也可以在运行时由硬件动态完成。
在编译和运行时分别进行怎样的处理决定于动态静态界面(DSI)的定义。
DSI的定义将导致许多有趣而微妙的权衡。
在进行权衡时,必须将编译器、(微)体系结构和微处理器设计紧密结合起来。
3.3流水线分级的考虑
理想流水化设计所获得的性能与流水线的深度(即流水线的段数)是成正比的,因此似乎最好的设计就是尽量增加流水线的段数。
但是,由于时钟的限制,流水线划分的段数总是有一个物理局限的。
流水线的每一个段可以看作一个组合逻辑F加上一个锁存器L,信号通过F之后在L出锁存。
定义
为通过F的最大传输延迟,即通过最长信号路径的延迟;
为通过F的最小传输延迟,即通过最短信号路径的延迟;
为正确建立时钟信号所需要的额外时间,包括必要的建立和保持时间,以保证正确的锁存,同时还包括可能的时钟扭曲,即达到不同锁存器的时钟沿的最大时间差。
假设第一组信号
在
时刻作用在某一级的输入端,那么F的输出最迟将在
时刻有效。
当第二组信号
在
时刻作用的F的输入端时,最快只要
时刻就能传到锁存器L。
要保证第二组信号不覆盖第一组信号,必须满足:
该公式说明,信号
可能到达的最早时刻不能早于信号
正确锁存的时刻。
该不等式可以重写为:
其中
就是最短时钟周期T。
因此,时钟周期T必须比
大,而最大时钟频率不能超过1/T。
由此我们可以看到,时钟限制最终决定了流水线的深度,除了这一限制外,如果考虑价格,即流水线的费用开销,最佳设计通常也不会采用最大的流水线深度。
在流水线系统的硬件设计中,必须考虑价格和性能的权衡。
一般来说,流水线的价格相对于流水线的深度成线性增长。
流水线深度一直是影响处理器效率的重要因素,流水线深度的增加可以让处理器时钟频率进一步提高,但随着流水线深度的增长带来的处理器的单周期执行效率降低、发热量上升,同时容易产生分支预测等问题反面影响也会加剧,因此流水线长度的尺度把握一直是处理器设计中的一个重要核心问题。
在设计流水线,要综合各方面的因素,根据最佳性价比的要求来选择流水线的最佳段数。
3.4流水线处理器设计
流水线处理器设计中的主要问题就是缩小实际情况与理想假设之间的差异。
所有关于流水线处理器的设计技术,都可以看作是为解决这三个挑战而进行的努力。
3.4.1保持流水段均衡
要流水化的运算就是每个指令周期所要进行的工作。
一个典型的指令周期可以根据功能划分成以下5个基本分量:
1.取指(IF,Instructionfetch)
2.译码(ID,Instructiondecode)
3.取操作数(OF,Operand(ds)fetch)
4.执行(EX,Instructionexecution)
5.存储(OS,Operandstore)
典型的指令周期从指令的取指开始,然后进行译码,以决定这条指令完成什么操作。
一条指令通常带有一个或者多个操作数,这些操作数存放在寄存器或者存储器中,这取决于所使用的寻址方式。
一旦所需要的操作数已准备好,就可以执行这条指令所规定的操作。
将执行所产生的结果存储起来之后,指令周期就算结束了。
分割指令周期的一种很自然的方法就是按照5个基本运算分量来划分,即将每一个运算分量对应到一个流水段,从而得到一个5级指令流水线,我们称这条流水线为基本指令流水线,简称GNR流水线。
在GNR流水线中,逻辑指令周期将映射到5个物理机器周期中。
机器周期与指令周期之比为5,这个值反应了流水化的程度以