计算机指令的流水线执行与流水线冒险

计算机指令流水线 

流水线方式的洗衣房可以以并行的方式提高性能

 计算机执行指令,同样可以以流水线的方式并行

MIPS 流水化的数据通路

流水线冒险

下一周期不能按时执行下一条指令

结构冒险

数据冒险

一条指令依赖于前面某条执行的计算结果

add  s0, t0, t1 sub  t2, s0, t3

下一条指令需要气泡停顿等待前面计算出结果 

前推/旁路(forwarding/bypassing)

不要等待计算结果保存到目的寄存器,增加一条额外数据通路,将计算的结果直接传给下一条指令计算的输入

前推+阻塞 

 但是并非所有冒险都能通过前推来避免气泡停顿

lw  s0, 20(t1) sub  t2, s0,

在需要使用前一个指令的结果时,前一个指令还没有拿到结果,此时需要停顿一下 

还可以通过调整指令的顺序来避免阻塞等待

控制冒险 

分支预测

更有效的分析预测

在遇到跳转语句的时候,我们往往需要等到MEM阶段才能确定这条指令是否跳转(通过硬件的优化,可以极大的缩短分支的延迟,将分支执行提前到ID阶段,这样就能够将分支预测错误代价减小到只有一条指令),这种为了确保预取正确指令而导致的延迟叫控制冒险(分支冒险)。

为了降低控制冒险所带来的性能损失,一般采用分支预测技术。分支预测技术包含编译时进行的静态分支预测,和执行时进行的动态分支预测。

BTB(Branch Target Buffer)

动态分支预测中的BTB(Branch Target Buffer)技术。

BTB即为分支目标缓冲器,它将分支指令(对应的指令地址)放到一个缓冲区中保存起来,当下次再遇到相同的指令(跳转判定)时,它将执行和上次一样的跳转(分支或不分支)预测。

一种可行的BTB结构示意图如下:

在采用了BTB之后,在流水线各个阶段所进行的相关操作如下:

注意,为了填写BTB,需要额外一个周期。