Skip to content

第3章:数据通路与流水线

分阶段执行

一个简化处理器把指令分为取指 IF、译码 ID、执行 EX、访存 MEM、写回 WB。流水寄存器保存阶段间的信息,使不同指令同时占据不同阶段。

若每阶段耗时一个周期,无停顿执行 nn 条指令需要 n+4n+4 周期。第一条仍需五个周期才完成;流水线提高的是连续指令的吞吐率,不会把单条指令的五个阶段消掉。

时钟周期由最慢阶段及寄存器开销约束。把流水线划得更深可能提高频率,却会增加流水寄存器、分支恢复和旁路成本。

结构、数据与控制冒险

结构冒险来自资源冲突,例如取指和数据访存争用同一端口。数据冒险来自生产者尚未提供消费者需要的值。控制冒险来自下一条应执行哪个地址尚未确定。

考虑:

asm
add t0, a0, a1
sub t1, t0, a2
ld  t2, 0(t1)
add t3, t2, a3

旁路可把第一条在 EX 末产生的结果直接交给下一条 EX,不必等到 WB 再读寄存器。但 load 的数据通常到 MEM 末才可用,在上述五级、常见旁路时序下,紧随其后的使用需要插入一个停顿。

停顿不是重复执行上一条的副作用,而是冻结部分流水状态并在适当位置注入空操作,直到依赖能够满足。

分支与冲刷

分支条件尚未确定时,机器可以停等,也可以预测下一 PC。预测错误后,错误路径上尚未提交的工作必须取消,恢复到正确路径。

若理想 CPI 为 1,分支占比 20%,预测错误率 10%,每次错误代价 3 周期,忽略其他停顿,则

CPI1+0.2×0.1×3=1.06.CPI\approx1+0.2\times0.1\times3=1.06.

不能把所有分支都算成错误,也不能忽略不同冒险可能重叠,使简单相加偏离真实机器。

正确性条件

流水化不改变程序要求的结果。读操作必须获得语义上正确的版本,存储和异常不能被错误路径提前变成不可撤销的架构效果。

较复杂机器用更严格的提交机制处理这些问题;即使简单顺序流水线,也必须处理分支冲刷、异常和存储副作用之间的先后关系。

练习

  1. 画出上述四条指令在指定旁路条件下的周期表,标出 load-use 停顿。图只需表达阶段占用。
  2. 若缓存访问需要两个阶段,哪些依赖的等待会改变?
  3. 分支更深才确定,可能对频率与 CPI 产生什么相反影响?

上次更新: