跳转至

指令流水线

常见问题解答部分

  1. 无条件转移(如跳转指令、调用指令等)是否可以避免发生控制冒险?

答:可能会发生控制冒险。如果不把取指令操作和译码操作合成一个阶段,就会引起控制冒险。因为要等到译码阶段才知道是转移指令,而此时流水线中正在取下条顺序执行的指令,即使译码阶段能够得到转移目标地址,也已经有一条不该执行的指令在流水线中,也即流水线被阻塞了一个时钟周期。在下个时钟周期到达时,应把已经取出的下条指令清零,并把转移目标地址送 PC,重新从转移目标地址处取指令执行。

情况1:若按照袁书MIPS流水线数据通路,在MEM阶段将目标转移地址写回PC,那么J指令后面需要阻塞3条指令或插入3个nop指令,如图所示

1717425659289-5de66862-e68c-45ec-9217-07b6d6bfd76d.png

相应的数据通路为

1717425981881-43f9136e-2142-43cd-bc40-1bc9e61b0562.png

情况2:如果ID阶段译码,并将目标转移地址送回PC,那么J指令后面需要阻塞1条指令或插入1个nop指令,如图所示

1717426140734-3576673a-4506-4ba8-be28-8614ef30b22d.png

情况3:如果采用如图所示的流水线数据通路,则不会发生控制冒险

1717426754159-aef28e93-20a4-4037-a816-f8d6ce6a97f1.png

1717426247833-61244354-2259-429e-a759-b6a32ff80ec3.png

部件送地址的具体解释

这条指令目标地址的计算方法是这样的。首先这条指令的编码当中,带有一个26位的立即数。这个数就是要转移的目标地址的主体部分,但是我们的目标地址应该是32位的。所以,还差6位,在差的6位当中,低两位我们用0补上,因为目标地址肯定是四字节对齐的,地址的低两位肯定是0。然后还缺4位,我们通过当前的PC寄存器计算而得,先将PC寄存器的内容加4,得到的这个32位数,取其高4位,和26位地址以及最低的两位的0连接起来,构成了一个32位的数,这就是转移的目标地址。

我们可以看到,在这个目标地址的计算方法只与两个内容有关:

  1. 当前PC的值;
  2. 这条指令本身的编码。

那我们结合处理器的结构图进行分析。当这条j指令处在取指阶段的时候,指令存储器会送出指令的编码,如果我们增加一些简单的电路,就能判断出这是一条j指令。同时我们将这条指令编码当中的低26位取出来,在低位加2个0,然后在这个PC更新的部件当中,已经会完成PC加4的工作,那我们再将这个PC加4的高4位取出,然后拼接而得到一个32位的数,这就是我们要更新的PC的值,也就是这条转移指令的目标地址。那这些工作都可以在一个时钟周期内完成,并将这个要更新的PC值送到PC寄存器的输入端,在下一个时钟上升沿到来的时候,PC寄存器就可以采样到这个要更新的PC的值。在下一个时钟周期,PC寄存器送出的就是这条转移指令的目标地址了。这样对这条j指令来说,它所需要的转移目标地址在取指阶段就可以获得,流水线不用停顿。

Note

由上面3个例子可知,越早将无条件跳转指令的目标转移地址送回PC,所引起的延迟就越小,或者说,需要插入的nop指令越少;例如像Core i7是4发射16级流水,我们可以简单地认为,流水线在充满的时候,可能会有4乘以16,总共64条指令在流水线中。而再看智能手机当中经常使用的ARM Contex-A15处理器,这是一个3发射15级流水线的处理器,我们也可以简单地认为在流水线中,总共有3乘以15,45条指令在同时执行。一旦出现转移指令,就有可能导致其后的几十条指令都是不应该被执行的。所以说,流水线越深,超标量数越多,转移指令带来的影响就越大。


  1. 采用流水线方式能使一条指令的执行时间更短吗?
answer

不能。采用流水线方式使得指令吞吐率提高了,即在给定的时间内完成指令执行的条数增加了,但每条指令的执行过程没有减少,因此不会缩短一条指令的执行时间,相反,流水线方式还会延长一条指令的执行时间。

  1. 为什么流水线方式会延长一条指令的执行时间?
answer

因为在确定一条流水线的流水段个数时,是以最复杂指令执行过程所需的流水段个数为标准设计的;在确定每个流水段的宽度时,也以最复杂流水段所需的宽度来设计。因而,所有指令都需要花费最慢指令所需的执行时间才能完成执行。此外,每个流水段之间要有信息的缓存和传递等,这也增加了额外的执行时间开销。

  1. 二阶段流水线能成倍提高指令执行效率吗?
answer

答:不能。二阶段流水线把一个指令周期分成取指令和执行指令两个阶段,是最简单的流水线,它不能成倍提高指令执行效率。有很多原因,主要如下:

  • ①因为每条指令的执行阶段所花时间不同,流水线要求以最慢指令为标准来设计,所以,执行阶段时间可能会很长;
  • ②虽然每条指令的取指令过程可能一样,但是流水线中要求每个流水段的时间相同,所以,取指令阶段时间也要和最慢指令的执行时间一样;
  • ③流水段寄存器的读写会增加一定的延迟;
  • ④各种流水线冒险会破坏流水线,造成流水线的停顿,影响指令执行效率。
  1. 流水线深度越深,时钟频率就越高,对吗?
answer

答:一般来说,在指令执行时间一定的情况下,流水线深度越深,时钟频率就越高。增加流水段个数,使得每个流水段内的操作变得非常简单,因而,每个阶段的延时就很小,也就缩短了时钟周期,提高了时钟频率。但是,流水线深度不能无限制地提高,随着流水段个数的增加,流水段之间的流水段寄存器增多,加大了流水段之间缓冲的额外开销,当额外开销的比例达到 50%时,再增加流水线的深度就没有意义了。此外,用于流水线优化和存储器(或寄存器)冲突处理的控制逻辑将随流水线深度的加深而大量增多,可能导致用于流水段之间控制的逻辑比流水段本身的控制逻辑更复杂。

  1. 流水线方式执行指令时,总能在一个时钟周期内完成一条指令的执行吗?
answer

不能。理想情况下,经过若干周期后,能在每个时钟周期内执行完一条指令,即CPI=1。但是,当程序中出现以下情况时,流水线被破坏,因而,不能达到 CPI=1。

①当有多条指令的不同阶段都要用到同一个功能部件时,发生资源冲突,后面指令要延时执行;

②当程序的执行流程发生改变时,发生控制相关,原来按顺序取出的指令无效;

③当后面指令的操作数是前面指令的运行结果时,发生数据相关,后面指令要延时执行。

此外,还有cache 缺失、TLB 缺失、异常和中断等的发生都会阻塞流水线的执行。

  1. 如何解决结构冒险?
answer

通过以下两种规整流水线结构的方式可以解决部分结构冒险。

①规定每个功能部件在每条指令执行过程中只能被使用一次,例如,每条指令只能用一次“寄存器写口”;

②每个功能部件只能在一个特定的流水段内被使用。例如,“寄存器写口”只能在第5 个流水阶段被使用。

另外,指令和数据分别存放在不同的存储器中,使得同时访问指令和数据不会引起存储器资源的结构冒险。这在大多数处理器中都是这样的,因为在 L1 cache 的 data cache 和code cache是分开的。

  1. 什么是控制冒险?哪些情况下会发生控制冒险?
answer

正常情况下 PC 的值按顺序增量,但在执行转移类指令或发生异常和中断时,PC 的值由指令或异常/中断处理部件给出。流水线方式下,如果在取下一条指令时,正确的下条指令地址还没有送到 PC 中,那么所取的下条指令就不是正确的,因而发生控制冒险。可以看出,如果确定下条指令地址所用时间较长,就会因为来不及在一个时钟周期内得到正确的PC值而发生控制冒险。通常,转移类指令会发生控制冒险,例如,分支指令(条件转移指令)要根据条件测试结果来确定 PC 的值,因而会发生控制冒险;返回指令需要从存储器中读取返回地址送 PC,因而也会发生控制冒险。

  1. 流水线中如何控制在同一时钟内各流水段中执行不同的指令?
answer

答:对于每条指令来说,流水线中前面的取指令流水段和指令译码流水段都是一样的,所以这两个流水段中的操作没有必要和哪个指令对应。但是,指令译码以后,每个流水段中执行的动作一定要和特定的指令对应,也就是说,特定指令对应的控制信号一定要送到对应

的流水段中,以控制该流水段中的执行部件完成正确的动作。这样也就可以控制在同一时钟内各流水段执行不同的指令。要做到特定指令对应的控制信号送到对应的流水段中,只要将译码阶段得到的控制信号也以流水线的方式传送,每来一个时钟周期,控制信号就往后面一个流水段传送一次,这样使得控制信号和所控制的操作同步。

  1. 指令译码前控制信号还没有产生,那么如何控制译码前指令的动作呢?
answer

答:对于每条指令来说,流水线中前面的取指令流水段和指令译码流水段都是一样的,所以这两个流水段中的操作没有必要和哪个指令对应。但是,指令译码以后,每个流水段中执行的动作一定要和特定的指令对应,也就是说,特定指令对应的控制信号一定要送到对应的流水段中,以控制该流水段中的执行部件完成正确的动作。这样也就可以控制在同一时钟内各流水段执行不同的指令。要做到特定指令对应的控制信号送到对应的流水段中,只要将译码阶段得到的控制信号也以流水线的方式传送,每来一个时钟周期,控制信号就往后面一个流水段传送一次,这样使得控制信号和所控制的操作同步。

选择

  1. 以下关于指令流水线和指令执行效率关系的叙述中,错误的是()

A. 加倍增加流水段个数不能成倍提高指令执行效率

B. 为了提高指令吞吐率,流水段个数可以无限制地增多

C. 加深流水线深度,可以提高处理器的时钟频率

D. 随着流水段个数的增加,流水段之间缓存开销的比例增大

answer

B

  1. 对于五段流水线CPU,以下有关其控制信号的描述中,错误的是( )。

A. 所有控制信号都在取数/译码阶段生成

B. 流水线CPU中控制器的功能可采用有限状态机描述

C. 控制信号与指令执行中间结果都通过流水段寄存器传递

D.在一条指令执行过程中每个控制信号的值一直保持不变

A

  1. 假定执行最复杂的指令需要完成6个子功能,分别由对应的功能部件A~F来完成,每个功能部件所花的时间分别为80ps、40ps、50ps、70ps、20ps、30ps,流水段寄存器延时为20ps,现把最后两个功能部件E和F合并,以产生一个五段流水线。该五段流水线的时钟周期至少是( )ps。

A. 70

B. 80

C. 90

D.100

D

  1. 以下给定的情况中,不会引起指令流水线阻塞的是( )

A. TLB缺失

B. 条件转移

C. 外部中断

D. 数据旁路(转发)

D

  1. 以下给定的情况中,不会引起指令流水线阻塞的是( )

A. 访存冲突

B. 指令数据相关

C. 执行空操作指令

D. cache缺失

C

  1. 以下关于指令流水线设计的叙述中,错误的是( )。

A. 指令执行过程中的各个子功能都须包含在某个流水段中

B. 所有子功能都必须按一定的顺序经过流水段

C. 虽然各子功能所用实际时间可能不同,但经过每个流水段的时间都一样

任何时候各个流水段的功能部件都不可能执行空(nop)操作

D

  1. 对于五段流水线CPU,以下有关流水段功能部件的描述中,错误的是( )。

A. 所有功能部件都是用组合逻辑实现

B. 每个功能部件在每条指令中都只能被使用一次

C. 寄存器读口和寄存器写口都在译码/取数阶段被使用

D. 执行阶段的功能部件包括ALU、加法器、扩展器等

C

以下关于流水段寄存器的叙述中,正确的是( )。

A. 每个流水段执行的结果可通过流水段寄存器传递

B. 每个流水段之间的流水段寄存器位数一定相同

C. 每个流水段之间的流水段寄存器存放的信息一定相同

D. 用户程序可以通过指令指定访问哪个流水段寄存器

A

  1. 以下是一段MIPS指令序列:

1717515815504-d1809bc4-f3fa-4724-814f-b3b3b51541ec.png

以上指令序列中,第()行指令产生了一个分支控制冒险

A. 2

B. 4

C. 5

D.7

B

  1. 单选|(4分)一个五级流水线的处理器,时钟频率为2GHz。指定运行一段8条指令的代

(4分)

码,在流水线不停顿的情况下,需要多长时间?

A. 10ns

B.6ns

C.2ns

D.8ns

B

  1. 单选(4分)在流水线处理器设计时,如果划分出五个相对独立的阶段,延迟分别为:

(4分)

450ps,350ps,300ps,400ps,350ps。而还需要加入的流水线寄存器延迟为50ps。那时钟

频率应该为:

A.3.3GHz

B.2.8GHz

C.2GHz

D.50Ops

正确答案:C 你没选择任何选项

  1. 千UWT

单选

(4分)有一个五级流水线的处理器设计,每一级的延迟分别为:450ps,650ps,

45Ops,45Ops,45Ops。其中包含流水线寄存器延迟50ps。如果将第二级(65Ops)均匀拆

分为两级,从而形成六级流水线。那新处理器的主频应该是:

A. 450ps

B.2.22GHz

C.500ps

D.3.07GHz

E确答案:B 你没选择任何选项

  1. 单选(4分)有一个五级流水线的处理器设计,每一级的延迟分别为:450ps,950ps

450ps,450ps,450ps。其中包含流水线寄存器延迟50ps。如果将第二级(950ps)均匀拆

分为两级,从而形成六级流水线。那在新处理器上,一条指令的执行时间是:

A. 500ps

B.2700ps

C.3000ps

D.250Ops

E确答案:C 你没选择任何选项

  1. 单选(4分)对于典型的MIPS五级流水线处理器,如果将指令和数据放在同一个存储器

中,则会直接导致哪种冒险?

A.指令冒险

B.结构冒险

C.控制冒险

D.运算冒险

E确答案:B 你没选择任何选项

  1. 单选(4分)以下哪个方法,可以解决所有的冒险?

A.增加流水线深度

B.提高时钟频率

C.让流水线停顿

D.扩大存储器

E确答案:C 你没选择任何选项

  1. 单选(4分)对于典型的MIPS五级流水线处理器,即使已经通过前递对数据冒险进行了处

理,下面这段代码中,哪条指令进入流水线后,还是会发生流水线停顿?

add $s0, $t0, $t1

sub $t2, $s0, $t3

lw $t3, 40($t2)

or $t4, $t3, $t2

and $t3, $t4, $t2

A.lw

B. add

C. and

D.or

D

  1. 11 多选(4分)以下哪些是处理器采用流水线技术带来的影响?

A.提高时钟频率

B.简化硬件电路

C.提高指令的吞吐率

D.增加指令的执行时间

正确答案:A、C、D 你没选择任何选项

  1. 12 多选(4分)以下关于超标量的说法,哪些是正确的?

A.超标量和流水线是两种独立的技术

B.现代的多核CPU通常都是超标量处理器

C.超标量是一种利用空间并行性的优化

D.超标量是一种利用时间并行性的优化

正确答案:A、B、C 你没选择任何选项

  1. 14 多选(4分)对于典型的MIPS五级流水线处理器(不前递),下面这段代码中,存在哪些

冒险?

Iw $1, 40($6)

beq $2, $1, Label;

add $6, $6, $2

add $6 $6, $1

Label: add $2, $6, $6

A.指令冒险

B.数据冒险

C.控制冒险

D.运算冒险

正确答案:B、C 你没选择任何选项

  1. 15 多选(4分)对于典型的MIPS五级流水线处理器(不前递),下面这段代码中,哪条指令

会遇到数据冒险?

instruction 1: add $1, $2, $3

instruction 2: sw $2, 0($1)

instruction 3: lw $1, 4($2)

instruction 4: add

$2, $2, $1

A. instruction 4

B. instruction 2

C.instruction 3

D. instruction 1

正确答案:A、B你没选择任何选项

判断

  1. 对于基本流水线处理器,每个时钟都有一条指令进入流水线,每个时钟周期都有一条指令完成,即基本流水线处理器的CPI为1。错
  2. 采用半同步定时方式的总线中没有时钟信号线。错
  3. MIPS流水线数据通路中,beq指令的“执行”功能段将在ALU中进行“减”运算。对
  4. RISC风格指令系统更适合采用流水线方式执行指令。对

名词解释:指令预取(Instruction prefetch)

参考答案:

在指令执行前,预先把指令取到CPU的指令缓冲器中。这样,在指令执行时,不需要再去取指令,可以很快地直接执行指令。流水线指令执行方式中通常采用指令预取。

名词解释:分支条件满足(Branch taken)

对于条件转移指令(即分支指令Branch),其执行结果总有两种可能性:一种是条件满足(称为“Branch taken”),此时转到转移目的地址处继续执行;另一种是条件不满足(称为“Branch not taken”),此时则继续取下条指令执行。