![流水线处理机及其设计精讲_第1页](http://file2.renrendoc.com/fileroot_temp3/2021-11/13/ee7c4441-ba33-445c-9b2b-f6bf4a1ebbb5/ee7c4441-ba33-445c-9b2b-f6bf4a1ebbb51.gif)
![流水线处理机及其设计精讲_第2页](http://file2.renrendoc.com/fileroot_temp3/2021-11/13/ee7c4441-ba33-445c-9b2b-f6bf4a1ebbb5/ee7c4441-ba33-445c-9b2b-f6bf4a1ebbb52.gif)
![流水线处理机及其设计精讲_第3页](http://file2.renrendoc.com/fileroot_temp3/2021-11/13/ee7c4441-ba33-445c-9b2b-f6bf4a1ebbb5/ee7c4441-ba33-445c-9b2b-f6bf4a1ebbb53.gif)
![流水线处理机及其设计精讲_第4页](http://file2.renrendoc.com/fileroot_temp3/2021-11/13/ee7c4441-ba33-445c-9b2b-f6bf4a1ebbb5/ee7c4441-ba33-445c-9b2b-f6bf4a1ebbb54.gif)
![流水线处理机及其设计精讲_第5页](http://file2.renrendoc.com/fileroot_temp3/2021-11/13/ee7c4441-ba33-445c-9b2b-f6bf4a1ebbb5/ee7c4441-ba33-445c-9b2b-f6bf4a1ebbb55.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、6. 3. 3流水线各级信号的产生至此,我们已经描述过了所有 3种指令类型的流水线操作。下面我们来总结控制信号 的产生方法。控制信号分布在流水线处理机的各级,我们当然可以在它们要被使用的流水 线级产生,例如 simm可在exe级产生。但这样,除了译码将会造成本级一些延迟之外, 还要使用流水线寄存器来传递必要的信息,例如指令操作码等。我们采用的方法是,控制 信号集中在id级由译码电路产生,并使用流水线寄存器把每一个控制信号传递到它被使用 的流水线级。我们把所有的控制信号归纳在表6. 4中。表6. 5列出了除了 aluop的各控制信号的产生表达式。表 6. 6列出了 aluop控制信号的产生表达式
2、。由以上表达式,我们可以有如图6. 29所示的控制电路。图中使用了流水线寄存器来把控制信号传递到合适的流水线级。我们可以看出,流水线控制部件的设计方法与非流水 线单周期处理机的控制部件的设计方法非常类似,而有限状态机和微程序的设计方法显得 不太适合。表6. 4 流水线各级控制信号的定义流水线级控制信号注释if级btaken转移发生id级sst选择 store(rd)exe级simmaluopwz选择立即数alu操作码写z标志mem级wmem与存何命wb级sldwreg选择load与备存顺堆表6. 5控制信号的产生表达式btaken=branch+bne z +beqzsst=storesimm
3、=andi+ori+addi+subi+load+storewz=andi+ori+addi+subi+and+or+add+subwmem=storesld=loadwreg=andi+ori+addi+subi+and+or+add+sub+load表6.6 alu控制信号的产生表达式指令aluop1aluop0操作指令aluop1aluop0操作and00与andi00与or01或ori01或add10加addi10加sub11减subi11减load1 i 0| 力口 i store i 10aluopl = add+addi+sub+subi+load+storei'a-sl
4、pzero1akegbt4ken工eku aluup图 6. 29流水线处理机的数据路径和控制部件aluopo = or+ori+sub+subi;1译科相simmaluopwmem6. 4结构相关及解决方法流水线处理机的设计存在3个非常著名的问题(hazard)。它们是11)结构相关问题(structural hazard);(2)数据相关问题(data hazard);(3)转移相关问题(branch hazard)。我们将在本节简要介绍第一个问题,下面两节分别介绍第二和第三个问题。结构相关 (structural dependence)问题指的是,由于硬件资源不充足而导致流水线不畅通。我
5、们将举3个例子来说明结构相关问题及其相应的解决方案。,第一个例子,也是最典型的例子,就是设想只为流水线处理机配备一个外部公共存储 器模块。这在现代计算机系统设计中是常见的。它的好处是程序和数据可以共享这个存储 器模块,二者之间的界限是可以动态调整的。使用分开的两个外部指令存储器模块和数据 存储器模块的计算机被称为具有哈佛(harvard)结构的计算机。依程序类型的不同,有的需要较大的程序空间和较小的数据空间;有的则需要较小的程序空间和较大的数据空间。在 这种情况下,哈佛结构的存储器不能被灵活、充分地利用。然而,如果只采用一个存储器模块而不采取任何其它的措施,则会出现结构相关问题,造成流水线堵塞
6、。图 6. 30示出了由于存储器端口资源的不充足而使取指令和load/store指令访问存储器的动作不能同时进行。if1t mj5,rst .3 tdse十da nom uaddi rer ,4 hid r£tlflo(rs) wb r4«re*i<md r7,r5ri5 siqre rs»200(r9) subi riotilorli zefko aluu*|xmkiw图6. 30单个存储器模块所造成的流水线堵塞图6. 30中的存储器模块只有一套访问端口。当load/store指令访问存储器时,必须暂停取指令操作。当然也可以让取指令优先而暂停load/st
7、ore指令的存储器访问操作。然而,不管是哪一种情况,计算机的性能将会有很大的损失。那么,采用一个外部存储器模 块的现代计算机是如何解决这个问题的呢?说起来很简单,如图6. 31所示,在处理机内部,设置两个分开指令和数据的高速缓冲存储器(cache)。把存储器中经常使用的程序段和数据分别放在指令 cache和数据cache中。访问cache命中时,处理机可直接从 cache 得到指令和数据,而不再访问外部存储器。有关 cache的原理和结构,我们将在9章详细讨论。再举第二个例子。把 alu指令的wb级提前一个周期。由以前的描述可知,alu指令在exe级结束时已把结果放在了流水线寄存器r,在mem
8、级不做任何运算,只是把它传递到流水线寄存器c,以便在wb级写入寄存器堆。我们可以把这样的数据路径加以改造, 使alu指令提前一个周期i即在通常的mem级就把结果写入寄存器堆。如果load指令仍用5个周期,则势必在有的周期有两个数据要同时写入寄存器堆;而有的周期则没有一个 数据要写入,见图6, 32(a)。由于寄存器堆只有一个写端口,势必造成有些alu写操作被延后。解决这个问题的方法有3种:第一种就是前面已经描述过的方法,即alu指令也用5个周期;第二种是设计两个写端口的寄存器堆;第三种是改造load指令的格式,消除存储器地址计算周期。办法是直接用一个寄存器操作数作为地址访问存储器,其指令格式形
9、 如loadrd , (fsl),即把由rsl指定的寄存器操作数拿来直接作为存储器的地址,把访问到的 存储器数据写入寄存器 rd,见图6. 32(b)。这样做会带来一个额外的好处,这就是 store指 令可以有store(rsl), rs2之类的格式,即把寄存器rsl的内容直接作为存储器地址i把寄存器rs2的内容写入存储器,从而可以省去寄存器堆前面的多路器以及相应的控制信号sst。ddi rl.rl * jc*d i3t100(i3> sub r4.r5,r add rfir5tr6 rtnre ra.2q0(ruj ubi 门。r10.1ifmemrldil访但指令cachemux |
10、transf.etyhk数据总麒1有博斯uj_s£2 ip+力,丁3jl.诂词数炯cacheif.rl上1 i捻令cacheadq1q2a2zero )alu图6. 31分开的指令cache和数据cache使流水线畅通第三个结构相关的例子是,如果store指令格式形如storerd, (rsl, rs2),而寄存器堆只有两个读端口。寄存器rsl和rs2的内容相加得到存储器地址,寄存器rd的内容存入存储器。这样的store指令要求同时读出 3个寄存器的内容。如果寄存器堆只有两个读端d ,肯定要堵塞流水线。办法只有一个,设计一个带有3个读端口的寄存器堆,并在流水线处理图6.32 用4个周
11、期完成alu指令(a), load指令也用4个周期完成(b)机中为它配置3个流水线寄 存器。还看很多其它类型的结构相关的例子,例如浮点除法器使用迭代的方法计算商,而 每次迭代用相同的电路等,我们在此不一一列举。addi rltfl ,4had ik, l<kitr5)sub rqrra add35尸6 fin讨 rft.ioo(r) ubi iiotiidii1frjuifrljoo+memt2if柠r4if+r7if+m£mifrlo i(i)图6.32用4个周期完成alu指令(a), load指令也用4个周期完成(b)依赖于其它指令的计算结果。 来看看下面的程序例子:11:
12、 :12:13:14:15:add sub and or addirir4r6r8r10r2 rl. r7 ririr3r5rir9100i1指令把寄存器r2和r3的内容相加,结果存入寄存器ri。它下面的4条指令均与i1相关,6. 5数据相关及解决方法6. 5. 1数据相关问题上一节给出的例子中,所有的指令都是不相关的,即任何一一条指令的源操作数都不本节讨论数据相关(datadependence及解决方法。现在让我们即使用i1的结果,见图6. 33给出的数据相关关系图。从图中可见是在每个周期结束时, 由时钟上升沿把数据打人寄存器。在数据没被打人之前,任何从该寄存器读出的数据都是 过时的。图中的
13、i2到i4的3条指令就属于这种情况,它们从r1寄存器读出的数据都是过时的,是不能使用的。15则没关系,当它读r1寄存器时,n已把结果写入。为了减少数据相关指令的条数,我们让写寄存器堆的操作提前半个周期,即由时钟的34。10ns,寄存器堆的访问只需下降沿打入。这样做是可行的,因为我们假定一个时钟周期是 要5ns。这样,数据相关的指令条数减至两条,见图 6.卜面我们讨论如何在流水线处理机中处理数据相关问题。我们将描述两种方法,一种图6.33 i1下面有3条指令不能从寄存器ri读出正确的数据fljtttj-ljtj-lj-ln_rij lit add rl .rz,r3 i2j ikih r4rrl
14、.r5 13r tnd r6,r7tr1 14 t or rstrl .r9 is iddi rlotrl«100图6.34把wb提前半个周期,i1下面还有两条指不能从寄存器ri读出正确的数据是暂停相关指令的执行(暂停流水线),直到能够正确读出寄存器操作数为止;另一种是采 用专门的数据通路,直接把结果送到 alu的输入端(内部数据前推)。在描述这两种方法时, 我们使用图6. 34的方案,即把写寄存器堆提前半个周期。这时,我们只需考虑两条相关 指令。下面以 alu指令为例,分别对两种方法加以描述,然后再讨论load指令同时使用这两种方法的情况。6. 5. 2暂停数据相关流水线暂停数据相
15、关流水线指的是当数据相关出现时,暂时停止相关指令的执行,等到相关数据能从寄存器读出,再恢复执行。暂停流水线的两种表示方法见图6. 35和图6. 36。这里涉及到两个问题:一个是如何检测出数据相关,再一个是如何暂停流水线。以下我们对这两个问题分别加以描述。首先,让我们考虑数据相关如何用硬件电路检测出来。参照本节开始给出的程序例子,i1写目的寄存器rd, i2和i3的源操作数是寄存器 rsl或rs2中的数据,且它们的 rsl或rs2与i1的目的寄存器号 rd相等时才有可能发生数据相关,因此,硬件电路中要有比较器。由于指令格式中源寄存器号rs2与立即数部分重叠,而立即数是不会出现相关的,因此,指令操
16、作码必须要参与检测 (区分是寄存器操作数还是立即数)。;另外,如例子中的i1指令,rd 一定作为目的寄存器号使用,即结果是要被写入目的寄存器时,后面的指令才有可能与之相关。由于store指令也使用rd,但它不写寄存器,因此, wreg信号也应参与检测(实 际上,wreg也是从操作码中得出的)。我们把上述规则用表达式写出如下 (它们是在id级 检测数据相关的表达式):depen =a_depen+b_depena_depen = exe_a_depen+mem_a_depenb_depen = exe_b_depen+mem_b_depenexe_a_depen = (1d_rsl = = ex
17、e_rd)(exe_wreg = 1)(1d_rsllsreg)exe_b_depen = (1d_rs2 = = exe_rd)(exe_wreg = 1)(1d_rs21sreg) +(1d_rd = = exe_rd)(exe_wreg = = 1)(store)mem_a_depen = (1d_rsl = = mem_rd)(mem_wreg = 1)(1d_nllsreg) mem_b_depen = (1d_rs2 = = mem_rd)(mem_wreg = 1)(1d_rs2isreg) 十(1d_rd = = mem_rd)(mem_wreg = = 1)(store)id
18、_rsllsreg = and 十 andi 十 or 十 ori 十 add 十 addi 十 sub 十 subi 十 load 十 store id_rs2isreg = and 十 or 十 add 十 sub由于一条指令中的两个源操作数都可能与上一条指令的目的操作数相关,因此总的数据相关 depen由a_depen和b_depen两部分组成。 a_depen指的是源寄存器 rsl数 据相关;b_depen指的是源寄存器rs2数据相关。另外,两条指令12和13都可能与u相 关。如果是在流水线id级检测数据相关,则对于 12来讲,n处在exe级;对于13来讲, n处在 mem 级;因止匕
19、,a_depen 包括 exe_a_depen 和 mem_a_depen 两部分。 exe_a_depen 的意思是处在id级的指令与处在exe级的指令数据相关。同理,mem_a_depen 的意思是处在 id级的指令与处在mem级的指令数据相关。同样,b_depen 包括 exe_b_depen 和 mem_b_depen 两音b分。exe_a_depen 为真的条件是 i2 的 rsl 与 i1 的 rd 相等(即 id_rsl = exerd)、rsl 字 段是寄存器(1d rs1isreg)并且i1的rd确实是目的寄存器(即exe_wreg =1)。后一个 条件是为排除 store指
20、令而加上的。 exe-b-depen与exe-a-depen类似,但rs2 确实是源寄存器号(1drs21sreg)所包含的指令要比id rslisreg少得多。i3与i1的数据 相关判断与此类似,只是把宇头 exe换成mem。exe代表流水线exe级;mem代表流 水线mem级。exe_rd和mem_rd分别是exe级和mem级流水线寄存器 d的输出。数据相关条件就这样得出来了。需要注意的一点是,rs2应包含store指令的rd。当条件满足时,要暂停流水线,因此下一步的任务是确定如何暂停流水线。这里要特别注意的 一个问题是,不能停止所有指令的流水线,而只是暂停相关指令及其后续的所有指令。上
21、例中,若12与n相关,只暂停12及12以下的指令,而不应把 n也暂停,否则的话,处理 机将永远暂停下去。暂停流水线要做以下 3件事情:封锁当前正在译码的指令的写控制信号;不把从 存储器取来的下一条指令打人ir;不改变当前pc值。我们使用如下的方法实现流水线的暂停:wpc= depenwir = depenid wz = depen decoderwzidwmem = depen decoderwmemidwreg = depen decoder reg图6. 37给出的是实现暂停流水线的硬件电路。 暂停条件判断电路 stall的输入包括 opcode , id rsl, id rs2, exe
22、 rd, exe wreg , memrd 和 mem wreg。输 出为depen。用depen信号来封锁本条指令及后续指令。封锁本条指令的方法是把depen 求反,再分别和译码器的输出 decoderwz , decoderwmem 和 decoder-wreg 相与,再送到id级和exe级之间的流水线寄存器的输入端。只有这些写信号才改变处理 机或存储器的状态,。因而我们不必去封锁诸如 aluop或多路器的选择信号。封锁其后续指令的方法是禁止向ir及pc写入新的数据,即把 depen的非接到ir和pc的写使能端wir和wpc。当这两个信号为 0时,禁止向ir和pc写人数据。读者不妨试着画出
23、它在 数据相关前后的时序图。mem.wrecmem图6. 37实现暂停流水线的硬件电路mema nodl效据存制”u- xst dwregwb当i2与i1相关时,流水线暂停两个周期;i3与il相关时流水线暂停一个周期。我们把被暂停掉的周期称作流水线“气泡”。暂停流水线是解决流水线处理机数据相关问题的一种方法。使用这种方法,保证处理机能够从寄存器堆读出正确的数据。但是,暂停流水线 两个或一个周期造成了处理机性能的损失。如果没有数据相关,处理机完全可以多执行两 条或一条指令。在由使用这种方法的处理机组成的计算机系统中,高级语言的编译器和汇 编器在产生最终目标机器码时,应尽量避免出现过多的数据相关指
24、令序列。编译器和汇编 器最初可以在相关指令之间插入nop指令,然后进行优化,用一些有意义的不相关的指令替换掉nop,以减少“气泡”的出现。较早的 mips处理机甚至没有数据相关的硬件检测电 路,完全依靠软件优化来保证不出现指令之间的数据相关。下一小节介绍的方法则能完全 避免由于与alu指令相关而造成的“气泡”的出现。6. 5. 3提高流水线处理机的性能内部前推流水线数据相关问题的本质在于一条指令执行时要用到上面指令的计算结果,但这个.结果尚未被写入寄存器堆。如果我们不拘泥于形式,非要alu使用从寄存器堆读出的数据不可的话,流水线“气泡”问题也可以得到解决。试想,数据相关发生在alu计算周期,而
25、所有的计算任务均由这一个alu来按顺序完成。这也就是说,alu计算时发现与上一条或两条指令的结果发生数据相关的话,这些结果实际上已由 alu计算出来了,只是还没有写入寄存器堆。那么,这时的结果在哪儿呢?当然,它们还在流水线寄存器r和c中。这就好了,把它们直接拿过来用!为此,我们在al。u的两个数据输入端各加一个多路器,使r和c中的数据能被直接送到alu的输入端,见图6. 38到图6. 40。这就是所谓的内部前推(internal forwarding)技术。| cci ccs i ccj i ct-x i i ccfi i cc7 i ccb i dc. | ri图6. 38内部前推一一cc3
26、周期,add指令在exe级见图6-38, alu输入端a的多路器有3个输入。无数据相关时,选才i 0号输入,也就 是流水线寄存器 a中的内容;相关时,选才12或3号输入,它们来自于流水线寄存器 r或。 co在本节的例子中,12与n相关时,选择2号输入;13与n相关时,选择3号输入。1 号输入没有被使用,只是标在那里,在设计多路器时可以去掉该输入以使电路简化。alu输入端b:的多路器有4个输入。无数据相关时,若是寄存器操作数, :选择0号输入:若 是立即数,选择1号输入。2号与3号输入等同于 alu的a端多路器。i cc1 i ccj i cc3 i cc4 cc5 ! cc0 cct | cc
27、f | cc9rutj-utj-u-u-u-lttj1产5 、疝_lb hd - ia.b大与防推i霜>lib r1hr| ,r5 nj | c7*t) i indi r6111afttl rf .r 71rl1ra ,bc rcgj4|ur r£ j hr3b,灿 n白41.loois华存用若eerrtifmemr mrl9and r仇格1sub rl.rlprbidd !.嘘睛jrdepenqexei 0 4 d图6. 39内部前推-cc4周期,add结果在r中,sub使用r的内容运算de ccciokoi b:alj£”£m = 20】q3ab如何产生
28、这两个多路器的选择信号是内部前推电路的关键所在。表 6. 7和表6. 8列 出了两个多路器选择信号的输出真值表。注意,表 6. 8中的rs2包含了 store指令中的rd, 参见图6. 39和图6. 40中的电路,其中的rs2来自于寄存器堆前面多路器的输出。表6. 7 alua端多路器选择信号的输出真值表输入输出exe_rs1 =exe_rs1 =输入选择mem_wreg=mem_rdwb_wreg=wb_rdadepen1adepen00x0x00a100x00a110x10mem_r0x1000a0x1111wb_c101000a111010mem_r101111wb_c111110mem
29、_r表6. 8 alub端多路器选择信号的输出真值表输入输出exe_rs2 isregmem_wregexe_rs2=mem_rdwb_wregexe-rs2=wb_rdbdepen1bdepen0输入选择0xxxx01立即数10x0x00b1100x00b1110x10mem_r10x1000b10x1111wb_c1101000b1111010mem_r1101111wb_c1111110mem_r表6. 8比表6. ?多了一项exe rs21sreg,这是因为指令中的立即数本身是不与上面指令的结果相关的。我们在表 6. 7中忽略了 exers/isreg,这是因为除了转移指令, 所有其它
30、指令的rsl的位置均是寄存器描述符,而转移指令在 exe级是不做任何操作的。两表中的最后一行需要特别说明一下。例如在表6. 8中,mem_wreg =1, exe_rs2= mem_rd ,并且 wb_wreg =1, exe_rs2=wb_rd ,说明当前指令的第二个源寄存器操 作数与它上面的两条指令都相关。也就是说,上面的两条指令向同一个目的寄存器写入结 果。这种情况一般是不会出现的。若出现,我们选择较新的结果,即mem -r,送到alu的b数据输入端。hr dd rhrjprli3i uid rd,*ii+i m r8.ilwr9cc1cc2uc3 cc«ccscc6 | bt
31、 |ccs |pcaddrira,bc reg"d | ""1 1 .ndpc 1r a.h ri亘工pc lkk|c reg| iiddi itibioo, biddlki tdi h5r1 jmfropcodrtt rt7m;史世胆ise p-sdeken -gikexememor rg .ri arfiand ""7,犷!zero alu口i qtal.'fbj hddi rlo.rldqqd memary后净存拈器adepem 2e3c regc/d工图6. 40内部前推一一cc5周期,add结果在c中,and使用c的内容运算图
32、6. 38到图6.扎以及表6. 7和表乱8演示的是在exe级alu操作时才检测数据 相关,有点临阵磨枪的味道。我们完全可以在id级完成这项工作,并把结果 (多路器的选择信号adepen两位和bdepen两位)作为控制信号打人流水线寄存器,以便轻装上阵, 在进入exe级后立即开始 alu的操作。图6. 41给出的是采用数据前推技术的流水线处 理机的数据路径和控制部件的结构图。你会发现数据相关检测电路也放在id级来做了(表6. 7。和表6. 8中所有信号的字头都用前一级的符号来代替,即 mem用exe来代替, wb用mem来代替)。wregmem jdfxe wkegzeho图6. 41采用数据前
33、推技术的流水线处理机的数据路径和控制部件的结构图jen*,£kl4uh si”:3 nsl粗裾并q锌l . l6. 5. 4处理10ad指令一一暂停与内部前推相结合以上讨论的都是与 alu指令相关的情况。alu指令在exe级结束后,结果就出现在 流水线寄存器r中,后续指令可以通过内部前推电路来直接使用它。但是,一条指令若与 1。ad指令相关,情况就不那么简单了。在exe级结束后,load指令还在忙着访问存储器呢。要在mem级结束后,结果才出现在流水线寄存器d中,见图6. 42。这时,即使使用内部前推技术也无法消除 1。ad指令与它的下一条相关指令之间的第、一个“气泡”。thmem%口
34、 卜rhga,nreg一乂-o内邮的撞*ttri rt»r7 frlor rfi.raddi rlotr' joorc rega)rc ke心图6.42 与load指令相关怎么办?办法有两个,一个是硬件方面不做任何努力,完全由软件来避免使用过时数据进行计算。当一条指令与它上面的10ad指令数据相关时,在它们中间插入两条nop指令,然后优化,用两条不相关的指令替换两条nop指令。替换一条是一条,替换不掉就那么放着。第二种办法是由硬件负责检测与10ad指令的相关性。没有办法消除的第一一个“气泡”就留着。为了保证操作结果的正确性,我们采用暂停流水线一个周期的方法。第二个“气 泡”用
35、内部前推技术加以消除。:我们给出一f面的用于实现1。ad流水线暂停的控制信号 的表达式。这个信号是在id级产生,并且使用与暂停alu流水线类似的方法。loaddepen = exe_a_depen 十 exe_b_depenexe_a_depen = (id_rs1 = exe_rd)(exe_sld = = 1)(id_rs1isreg)exe_b_depen = (id_rs2 = = exe_rd)(exe_sld = = 1)(id_s2isreg)+(id_rd = exe_rd)(exe_sld = 1)(store)id_rs11sreg = and+andi+or+ori+ad
36、di+addi+sub+subi+load+storeid_rs21sreg = and+or 十 add+sub注意,以上的表达式中没有使用wreg信号,而是用了 sld。因此在书写 sld,不能选择任意项,而应只书写 wreg = = 1处的sld。或者,一一个保险的方法是把译出的 1。ad指令打人流水线寄存器,使用它而不是exesld。l()abde;prnfxemket,exe slbdu51捻 laof-图6. 43带有内部前推及10ad相关暂停功能的流水线处理机由于流水线已经暂停了一个周期,剩下的内部前推电路可以仿照上一小节的描述加以 设计。图6. 43的电路是带有内部前推及 10
37、ad相关暂停功能的流水线处理机。所有的控制 信号士在m级产生,并使用流水线寄存器把它们传递到所需要的位置。注意,封锁控制信 号的与门已合并在 decoder中了。即使流水线处理机有了 10ad相关暂停功能,但它只保证操作结果的正确性。如果编译 器和汇编器能对程序做些优化,尽量消除与10ad指令的相关,就会提高流水线处理机的性能。图6. 44(a)中的第二条指令使用它上面的10ad指令从存储器取来的结果。这势必造成流水线“气泡”的产生(图6. 44(c)。我们把左例中的第二条与第三条指令交换。交换后的 程序列在图6. 44(b)中。交换后,“气泡”可以被消除,而且可以使用内部前推电路,把从 存储
38、器取来的数据直接从流水线寄存器d传送给交换后的第三条指令 (图6. 44(d) ohep, i qhd r3. t)add ri ”1 型idi subi r2 i r2 s t hnr in-np<4)i on p lofld r2po(r4)图6. 44消除load指令引起的“气泡”并使用内部前推6. 6转移相关及解决方法6. 6. 1转移相关问题转移指令改变程序顺序执行的特性。由于是流水线操作,在转移发生之前,若干条转移指令的后续指令已被取到流水线处理机中。这就是所谓的转移相关问题(branchhazard),有时也称之为控制相关问题(controlhazard)。这样的后续指令的
39、条数与转移指令执行完成需要多少个时钟周期有关。一般来讲,若转移指令从取指令到执行完毕需要”个周期的话, 则(n 1)奈后续指令将受到影响(图6。45)。一般比较复杂的处理机往往需要35个周期才能完成转移指令的执行。在我们的流水线处理机方案中,已经把转移指令所需的周期数减至最少,总共只需两个时钟周期,有一 条后续指令受到影响。以下我们介绍处理转移相关问题的3种技术。这3种技术是:(1)暂停流水线;(2)假定转移不发生;图6.45转移指令造成的延迟周期数(3)延迟转移。6. 6. 2暂停流水线假设转移指令从取指令到执行结束共需要n个时钟周期,实际上,编译器和汇编器只要在转移指令下面插入(” 一。1
40、)条nop指令,即使在硬件方面不采取任何措施,也可以保 证程序执行的正确性。以下我们讨论的是,假定没有插入 nop指令,处理机如何保证执行 结果正确。以我们的(" =2)的流水线处理机为例。在对指令进行译码时:若发现当前指令 是转移指令,则要废弃取来的转移指令的后续一条指令,而并不封锁pc和ir。废弃方法见图6. 46。i-lttj-lttj lj_l_rn-nifeke mehl wbipid ekeifi口 .百一文西 中国图6. 46转移指令暂停流水线一个周期转移指令包括条件转移和五条件转移两种类型。五条件转移指令只要封锁 ir的打人即可。条件转移指令还要判断 z标志是否能用。
41、若 z标志还没有准备好,则要暂停流水线。 这一点和判断数据相关极为相似。但由于转移指令只可能改变pc而不改变其它状态,因此用不着封锁 wz, wmem , wreg(对转移指令来讲,这些信号原本就为0)。如果处在译码级的是条件转移指令,而且处在exe级的是alu类型的指令(就要写z标志到流水线寄存器 z 了),则要等到alu指令写完2后,再判断转移与否,因此要暂停 一个周期。:wir wpc(id _bne id _beq)exe _instisalu )wir = wpc = -(id _bne id _beq)exe _wreg exe_sld)exe_instisalu 表示处在exe级
42、的是alu指令。我们使用 exe_wreg exe _sld来产生它:除了 10ad指令,凡是向寄存器堆写结果的指令都是alu类型的指令。图6.47给出了这部分的控制电路。fxf sld一卜_rdc/d*p£w'.tkmsldwregmem wregbtakenifmemwb图6. 47判断z标志相关并暂停流水线j:di wead7frhaluopcqdsimmn.uopexe wrkg6. 6. 3假定转移不发生条件转移指令的判断结果可能是不转移。使用废弃后续指令的方法时,总是造成一个 钟周期的浪费。假定转移不发生(猜测)的思想是把这条指令打人ir并让它执行下去。如果转移没
43、有发生,则让它继续执行;如果是转移,则终止它的执行。问题的关键是如何在猜测不成功时终止指令的执行。其实这也不难。指令执行的效果 无非就是改变处理机的状态和寄存器堆以及存储器的内容。只要我们能够在exe级结束之前,清除 wz ,在mem级结束之前清除 wmem ,以及在 wb级结束之前清除 wreg的 话,不会对处理机和存储器产生任何影响。在我们的流水线处理机中,转移成功与否,在转移指令的id级就已明子。我们可以把 这个信息(例如btaken ,转移成功时为1)打人流水线寄存器,以便在下一个周期使用。下一个周期恰好是猜测执行指令的id级,我们可以通过与门来清除前面提到的3个写信号。不转移时,bt
44、aken二0,不封锁,让其继续执行 (图6. 48)。实际上,图6. 48与图6.47 极为类似。图6. 48的封锁条件是(bnc+beq+branch),而图巳47的封锁条件是(bne z十beq z+branch)。n图6. 4s猜测不转移如果程序执行时,转移指令占20%,五条件转移,条件转移成功和条件转移不成功各占1/3,则与总是浪费一个周期的方法相比,猜测执行的方法可以节省1/3 x 20% =6. 7%的周期。其加速比为 1/(10. 067)= 1. 071,或者说,提高效率 7. 1%。6. 6. 4延迟转移延迟转移(delaybranch)总是执行转移指令的后续指令。实际上我们
45、已经熟悉了这种方法。首先我们在每一 条转移指令下面安排一一条nop指令,然后再优化,用一一条有意义的:原来处在转移指令之前被执行的指令来替换nop。若找不到这样的指令,就留着nop。在我们的流水线处理机模型中,受转移指令影响的指令只有一条,替换 nop的工作相对容 易一些。若受影响的指令条数超过两条,要想替换所有的nop很难。为了便于对延迟指令进行优化,有些处理机的指令系统中设置了两类alu指令,一类根据alu操作结果,对标志寄存器置 0或置1,另一类则单纯做计算,并不影响标志寄 存器的原来的内容。在下面的例子中,我们使用了subicc指令,它将根据减法结果设置标志寄存器z的内容为。或为1。其
46、它的alu计算指令不影响z。经过优化后,没有浪费一个时钟周期。程序的执行时序在图6. 49中给出。注意,我们也采用了内部前推技术。图6. 49采用内部前推和延迟转移技术后程序的执行时序loop : load r3, 0(r4);从存储器取数据放到,3中,;存储器地址为r4中的内容加o,subicc r2, r2, 1;计数器减1,并改变z标志,add. i r4, r4, 4 ;存储器地址加4,指向下一个存储器字,不影响 z标志,bne r2, loop ;若计数器不为 0,转移到100p处继续执行,延迟转移,addy 1, y 1丫 3 ;累加,累加和放在 r1中,延迟指令,总是被执行,st
47、ore r1 , 0(r4) ;否则,把累加和送到存储器中,;存储 atl!lii'gj r4 中的内容加0。6 7 异常事件处理我们已在第 5 章中讨论了非流水线处理机如何处理异常事件的问题。异常(exception)事件是指在程序执行过程中,由于操作非法,例如除数为0,结果上溢等,或者用户程序试图执行特权指令,或者指令码没有定义等。这时处理机应该转向特定的程序去处理异常事件。 处理的方法一般是先向用户报告哪条指令引起了异常事件以及引起了何种异常事件,然后继续用户程序的执行,或者结束用户程序的执行,返回到操作系统。除了异常事件外,还有外部i/o设备发出的中断(mterrupt)请求以
48、及陷阱(trap)指令等。 以上 3 种事件均改变处理机正常指令的执行次序,引起处理机从用户状态进入系统状态,并转到相应的处理程序去执行。陷阱指令般用来实现系统调用。 io 中断用来实现i ()设备和处理机的通信。有关外部中断的处理,我们将在第 8 章做专门的阐述。本节的点放在流水线处理机如何处理异常事件上。非流水线处理机是在一条指令执行的丑程中检测异常事件,当异常事件发生时处理机转向异常事件处理程序, 处理完毕后再返回到用户程序。例如,处理机在对指令译码阶段,可以检测当前指令是否是合法指令。在指令执行时检测操作结果是否溢出,除数是否为。等等。当这些事件发生时,处理机应该适当地保存当前处理机的状态,比如当前程序计数器 pc 的内容,处理机状态寄存器的内容,等等。 ,然后,处理机由硬件向 pc 写入特殊的值,即异常事件处理程
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025至2030年中国香草梅数据监测研究报告
- 滑雪板固定器行业行业发展趋势及投资战略研究分析报告
- 包厢出租服务合同范例
- 2025年中国高低压配电柜市场深度分析及投资战略咨询报告
- 业务信息佣金合同范例
- 传统师承合同范本
- 分销白酒合同范本
- 乐器供销合同范例
- 交工验收质量检测合同范例
- 农村小型承包设备合同范本
- 知识库管理规范大全
- 2024年赣州民晟城市运营服务有限公司招聘笔试参考题库附带答案详解
- 领导干部报告个人事项
- 9这点挫折算什么(课件)-五年级上册生命与健康
- 价格监督检查知识培训课件
- 驻场保洁方案
- 中国心理卫生协会家庭教育指导师参考试题库及答案
- 智能广告投放技术方案
- 知识产权保护执法
- 高质量社区建设的路径与探索
- 数字化时代的酒店员工培训:技能升级
评论
0/150
提交评论