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 周期,忽略其他停顿,则

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

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

正确性条件 ​

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

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

练习 ​

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

上次更新: