第 2 课|流水线:吞吐量、延迟与数据冒险

阅读提示:这是从聊天授课内容重构的课程讲义,不是原消息的逐字拷贝。建议先阅读概念动画,再跟随推导、数值算例和练习巩固知识。

学习问题

流水线把不同指令的执行阶段重叠起来,改善吞吐量而非一定减少单条指令延迟。

[[diagram:pipeline]]

核心公式

\[T_pipe(N)=(N+k-1)×T_clock\]

数值例题

五级流水线,各阶段组合逻辑 2ns、寄存器额外开销 0.2ns:时钟周期 2.2ns,单条指令 11ns。100 条无相关指令需 104×2.2=228.8ns,而单周期非流水线每条 10.2ns,总计 1020ns。

推导、假设与边界

在无停顿单发射流水线,稳态 IPC=1。存在 Load-use 相关和分支误预测时,可在互不重叠的简化模型下写 CPI≈1+r_L s_L+b p d。更深的流水线虽提升频率,却可能增大停顿惩罚。

执行过程详解:Load-use 为什么还会停顿?

考虑如下简化指令序列:

lw   x5, 0(x6)
add  x7, x5, x8
sub  x9, x10, x11

在经典五级顺序流水线中,Load 数据在 MEM 阶段结束时才可用。紧随其后的 add 如果按常规节奏进入 EX,正好在数据尚未到达时需要 x5。即使有 Forwarding,也无法在数据尚未产生之前提前转发。

因此在这种具体时序设计里,通常插入一个 Bubble。此时实际表现由三件事共同决定:生产者结果何时 ready、消费者何时需要操作数、是否存在旁路网络。把 RAW 依赖与必然停顿画等号是不准确的:ALU→ALU 依赖在典型前递网络下可能无需停顿。

更深流水线的临界判据

针对相同机器指令数,CPU B 比 A 快的充要条件是:

\[CPI_B T_{clk,B}<CPI_A T_{clk,A}.\]

这意味着频率提高并不是独立收益。若增加级数导致分支预测恢复代价从 2 周期变成 8 周期,那么高分支密度、高错误率的程序可能因此比短流水线运行得更慢。

注意模型的边界

\[CPI\approx1+r_Ls_L+bpd\]

只有在单发射、长指令流、两类 Stall 互不重叠且近似确定的模型中才是合理估计。对于乱序多发射 CPU,平均 CPI 可以小于 1,不同 Miss 的等待时间也可能被乱序计算隐藏。

阅读微架构论文时要问的三个问题

  1. 报告的是关键路径时钟周期、单条操作 Latency,还是执行吞吐率?
  2. 测试工作负载是否有足够的独立操作填满流水线?
  3. 更改频率的同时是否也改变了 CPI、功耗约束和错误恢复开销?

课后练习(暂不提供答案)

练习:A/B 时钟周期为 2.0/1.2ns,Load-use 比例 10%,罚时为 1/2 周期;分支占 25%,错误罚时为 2/8 周期。设预测错误率为 p,求使 B 快于 A 的 p 范围。

后续学习

沿各门课 12 周知识树继续递进,必要时回顾本课基本概念。