计算机指令流水线
流水线方式的洗衣房可以以并行的方式提高性能
计算机执行指令,同样可以以流水线的方式并行
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,需要额外一个周期。