流水线的概念

基本定义:把一个重复的过程分解为若干个子过程,每个子过程由专门的功能部件实现。把多个处理过程在时间上错开,依次通过个功能段,每个子过程可以与其他子过程并行处理。

流水线的段(级):流水线中每个子过程及其功能部件。
流水线的深度:流水线的段数。

流水线的通过时间和排空时间

image-1655714992274

通过时间

第一个任务从开始到结束的时间。

排空时间

最后一个任务n开始到结束时间

流水线的性能指标

吞吐率TP

单位时间内流水线所完成的任务数量或输出结果的数量。
TP=n/Tk
n:任务数
Tk:处理n个任务所用时间

各段时间相等的流水线

image-1655715839281
Tk=k△t+(n-1)△t
TP=n/(k△t+(n-1)△t)
最大吞吐率为n趋近于∞时,TPmax=1/△t

各段时间不完全相等的流水线

流水线中时间最长的段被称为流水线的瓶颈段
image-1655716370952
因此对于瓶颈段,多要采用分割,分为多个子流水段,或者增加处理硬件。

加速比S

完成同一批任务,不使用流水线的时间(Ts)和使用流水线的时间(Tk)之比。
S=Ts/Tk

各段时间相等的流水线

S=nk△t/(k△t+(n-1)△t)=nk/(k+n-1)
n趋于∞时Smax=k

各段时间不完全相等的流水线

image-1655716859307

流水线的效率

流水线中设备实际使用时间:整个运行时间的比值,也就是利用率。

各段时间相等的流水线

e1=e2=…=ek=n/(k+n-1)
整条流水线效率为:E=(e1+e2+…ek)/k=n/(k+n-1)
Emax=1
在图像上,流水线效率=流水线面积/总面积

流水线设计中的三个问题:

颈问题:

机器时钟周期取决于瓶颈段的延迟时间。设计时应该使各段时间相等

流水线的额外开销:

  • 流水寄存器需要建立时间和传输延迟
  • 时钟偏移开销

冲突问题

  • 运算操作的数据准备
  • 指令操作的相互关联

五段流水线

取指令周期 IF

  • 从PC取出指令放到IR
  • PC+=4

指令译码/读寄存器周期 ID

  • 译码,读出操作数

执行/有效地址计算周期 EX

  • 计算有效地址

存储器访问/分支完成周期 MEM

  • 只有load,store和分支指令,其他类型指令不做任何操作。

写回周期 WB

  • ALU运算指令和load指令把结果数据写入通用寄存器组。

相关

两条指令之间存在某种依赖关系。

数据相关:

两条指令i和j如果存在:
- j使用i产生的结果
- 指令j与指令k数据相关,而k又和i数据相关。(传递性)
例如:
image-1655724310200

名相关

名:指令所访问的寄存器或存储器单元的名称
指令i,j之间:
反相关:指令J写的名=指令I读的名
输出相关:指令J写的名=指令I写的名
image-1655726426480

控制相关

是由分支指令引起的相关。
例如if-then语句

if p1{
	S1;
}
S;
if p2{
	S2;
}

P1与S1存在控制相关,P2与S2存在控制相关

冲突

结构冲突:

硬件资源不满足指令执行要求

数据冲突:

需要用到前面的指令执行结果
指令I和J,I在J前进入流水线。

写后读冲突RAW

i写入前j先读(数据相关)

写后写冲突WAW

i写入前j先写(输出相关)

读后写冲突WAR

i读入前j先写(反相关)

控制冲突:

遇到分支指令和其他会改变PC值的指令

解决冲突的方法

指令被暂停时,该暂停指令之后流出的所有指令都要暂停,之前的继续执行

结构冲突

访存冲突:只有一个存储器时,数据指令都要读取。
方法1:插入气泡
image-1655727386817
方法2:设置独立指令Cache和数据Cache

数据冲突

定向技术减少写后读冲突(数据相关):EX段和MEM段之间的流水寄存器保存的ALU计算结果总是回送到ALU入口,当检测到需要用前一个ALU运算结果,就用保存在流水寄存器的值运算。
需要停顿的数据冲突:当定向技术无法解决,需要暂停流水线直到冲突消失
编译器解决数据冲突:通过编译器重新组织顺序。

控制冲突

冻结或者排空流水线,优点:简单。
分支指令引起的延迟叫分支延迟。
编译器减少分支延迟。预测分支失败,预测分支成功,延迟分支(插入延迟槽)。
延迟槽调度:image-1655733199443
分支取消机制:

Q.E.D.


寄蜉蝣于天地,渺沧海之一粟