流水线
面积换性能
- 流水线
- 一个周期执行多条指令
- 需要额外寄存器
- 每级流水线内部有各自的组合逻辑数据通路,硬件资源无复用。
- 状态机
- 几个周期执行一条指令
- 硬件资源可以复用
流水线深度
流水线越深
吞吐率高,性能高
面积开销大
反压
?
分支预测失败/流水线冲刷(Pipeline Flush)
取值阶段无法得知结果是否跳转,只能进行预测。
若预测失败,需要将预取的错误指令流全部丢弃,重新取正确的指令流。
流水线越深,则预取了更多的错误指令,性能的损失、功耗的浪费越严重。
流水线越浅
- 面积开销小,功耗低
- 性能弱
反压
?
- 取消握手
- 乒乓缓存
- 前向旁路缓存
流水线冲突
资源冲突
最常见的是运算单元的冲突
例:除法运算需要多个周期,若前序除法指令完成运算之前,后序除法指令也需要除法器,则存在资源冲突
解决方法:复制硬件资源、流水线停顿等
数据冲突
WAR相关性(先读后写相关性)
后序指令不能比和它有WAR相关性的前序指令先执行。
否则后序指令先写回结果到通用寄存器组,导致前序指令读取错误的操作数。
WAW相关性(先写后写相关性)
后序指令不能比和它有WAW相关性的前序指令先执行。
否则后序指令先写回结果,导致前序指令再写回结果,导致结果被覆盖。
RAW相关性(先写后读相关性)
后序指令不能比和它有RAW相关性的前序指令先执行。
否则前序指令未写回结果,导致后序指令读取错误的操作数。
解决方法
WAR、WAW
寄存器重命名 (Register_renaming)
1
RAW:真数据相关
动态调度 (Tomasulo_algorithm)
采用数据旁路传播,尽可能让前序指令的计算结果更快地旁路传播给后序指令的操作数。
尽可能让后序指令在等待过程中不阻塞流水线,让其他无关的指令继续执行。
在每个运算单元前配置乱序发射队列。
发射队列仅追踪RAW相关性,并不存放操作上,因此可以做到很深。
在发射队列中的指令一旦解除相关性,再从发射队列中发射出来读取物理寄存器组,然后再发送给运算单元开始计算。