首页/计算机组成原理/中央处理器/流水线执行过程手算详解 🔗 在 Obsidian 中打开
计算机组成原理 · 中央处理器

流水线执行过程手算详解

重要度 ⭐⭐流水线CPU性能计算408
速查
时空图画法:横轴时间、纵轴指令,每格一个时钟周期。冒险处理只有两招——插入气泡(stall)前递(forwarding)。一切计算都从 $T_k = (k+n-1)\Delta t$ 出发。

速查

项目
画法横轴时间,纵轴指令,每格一个时钟周期
冒险处理插入气泡(stall)或前递(forwarding)

核心概念

经典五级流水线

IF(取指) → ID(译码) → EX(执行) → MEM(访存) → WB(写回)

四个性能指标

指标公式说明
吞吐率 $TP$$n / T_k$指令条数 / 流水线总时间
最大吞吐率 $TP_{\max}$$1 / \Delta t$流水线周期的倒数
加速比 $S$$T_s / T_k$非流水线时间 / 流水线时间
效率 $E$$S / k$加速比 / 段数

时间计算

无冲突时的流水线时间:

$$T_k = k\,\Delta t + (n-1)\,\Delta t = (k + n - 1)\,\Delta t$$

其中 $k =$ 流水线段数,$n =$ 指令条数,$\Delta t =$ 流水线周期。

非流水线时间:

$$T_s = n \times k \times \Delta t$$
公式的物理含义$k\,\Delta t$ 是第一条指令流过全部 $k$ 段的时间(装入期);$(n-1)\,\Delta t$ 是其余 $n-1$ 条指令每拍流出一条的时间。

三类流水线冲突

冲突类型原因解决方法
结构冲突资源争用(如同时访存)资源复制(哈佛结构)、停顿
数据冲突数据依赖(RAW / WAR / WAW)转发 / 旁路、停顿、编译优化
控制冲突分支指令改变 PC延迟分支、分支预测、停顿

手算示例

例题 1 · 基本性能计算

题目:五级流水线,每段 2 ns,执行 100 条指令。求 $T_k$、$T_s$、$TP$、$S$、$E$。

已知 $k = 5$,$\Delta t = 2\ \text{ns}$,$n = 100$。
  • 流水线时间:$T_k = (5 + 100 - 1)\times 2 = 104 \times 2 = \mathbf{208\ \text{ns}}$
  • 非流水线时间:$T_s = 100 \times 5 \times 2 = \mathbf{1000\ \text{ns}}$
  • 吞吐率:$TP = 100 / 208 \approx \mathbf{0.48}$ 条 / ns
  • 最大吞吐率:$TP_{\max} = 1/2 = \mathbf{0.5}$ 条 / ns
  • 加速比:$S = 1000 / 208 \approx \mathbf{4.81}$
  • 效率:$E = 4.81 / 5 \approx \mathbf{96.2\%}$

例题 2 · 画时空图

题目:四级流水线(IF / ID / EX / WB),每段 1 个时钟周期,执行 4 条指令,画出时空图并求 $S$、$E$。

四级流水线 · 4 条指令 · 共 (4+4-1)=7 个周期 123 4567 I1I2I3I4 IF ID EX WB IF ID EX WB IF ID EX WB IF ID EX WB
图:标准时空图 —— 呈"阶梯"排列,每下移一行右移一格
$T_k = (4 + 4 - 1)\times 1 = 7$ 个周期;$T_s = 4 \times 4 = 16$ 个周期; $S = \dfrac{16}{7} \approx \mathbf{2.29}$;$E = \dfrac{S}{k} = \dfrac{2.29}{4} \approx \mathbf{57.1\%}$。 指令数少,装入 / 排空开销占比大,效率明显偏低

例题 3 · 数据冲突与停顿(无转发)

ADD R1, R2, R3    ; R1 = R2 + R3
SUB R4, R1, R5    ; RAW:依赖 R1
AND R6, R1, R7    ; RAW:依赖 R1
OR  R8, R1, R9    ; RAW:依赖 R1

ADD 要到第 5 周期(WB)才写回 R1。按"寄存器在 ID 段读、WB 段写,且支持同周期先写后读"的常规约定:

指令本应读 R1 的周期最早可读周期单独看需等待
SUB第 3 周期(ID)第 5 周期2 拍
AND第 4 周期(ID)第 5 周期1 拍
OR第 5 周期(ID)第 5 周期0 拍
别把等待数直接相加SUB 被卡住时,后面的 AND、OR 也被一起堵在前面的段里——它们共享同一批气泡。因此总停顿是 $\max = \mathbf{2}$ 拍,而不是 $2+1+0=3$ 拍。总周期由理想的 8 拍变为 10 拍。下方交互动画给出了完整时序。

例题 4 · 有转发机制

LW   R1, 0(R2)    ; R1 = M[R2+0]
ADD  R3, R1, R4   ; R3 = R1 + R4
SUB  R5, R3, R6   ; R5 = R3 - R6
  • LW 到 MEM 段末尾才拿到数据,无法赶上 ADD 的 EX 段 → Load-Use 冲突,停 1 拍,再靠 MEM→EX 转发。
  • ADD 在 EX 段末尾得到结果,可经 EX→EX 转发给 SUB → 无停顿
  • 总时间 $= \mathbf{8}$ 个周期(比无冲突的 7 拍多 1 个停顿周期)。

例题 5 · 不同段数对比

题目:比较 4 段与 5 段流水线执行 200 条指令的性能(各段时间均为 $\Delta t$)。

参数4 段5 段
$T_k$$(4+200-1)\Delta t = 203\Delta t$$(5+200-1)\Delta t = 204\Delta t$
$T_s$$200\times 4 \times \Delta t = 800\Delta t$$200\times 5 \times \Delta t = 1000\Delta t$
$S$$800/203 \approx 3.94$$1000/204 \approx 4.90$
$E$$3.94/4 \approx 98.5\%$$4.90/5 \approx 98.0\%$
结论段数越多,理论加速比越高,但单条指令的总延迟也更长、效率略降。当 $n$ 足够大时两者的效率都趋近 100%。

分支指令对流水线的影响

条件分支在 ID 段判断是否跳转;若跳转,已进入 IF 段的下一条指令作废 → 流水线冲刷

假设条件取值
分支结果确定的段ID 段
分支指令占比50%
分支中实际跳转的比例50%
每次冲刷浪费1 个周期
$$\text{平均额外开销} = 0.5 \times 0.5 \times 1 = 0.25\ \text{周期 / 条指令}$$
套路此类题一律用期望值算:$\text{额外 CPI} = P(\text{分支}) \times P(\text{预测错}) \times \text{冲刷代价}$,再把它加到基础 CPI 上求实际 CPI。

408 考试要点

  1. 画时空图:给定指令序列与流水线段数,画出完整执行过程(含气泡)。
  2. 计算性能指标:$T_k$、$TP$、$S$、$E$ 一套算下来。
  3. 识别数据冲突:判断 RAW / WAR / WAW 类型。
  4. 计算停顿周期:区分有 / 无转发机制两种情形。
  5. 吞吐率与指令数的关系:$n$ 越大效率越高,趋近 100%。

易错点

必记
  1. $T_k = (k+n-1)\Delta t$ 里是 $k+n-1$,不是 $k+n$,别多算一拍。
  2. 多条指令依赖同一个寄存器时,气泡是共享的,不能把各自的等待数相加。
  3. $E = S/k$,效率的分母是段数不是指令数。
  4. Load-Use 冲突即使有转发也要停 1 拍,这是最常考的判断点。
  5. 非流水线时间 $T_s$ 在各段不等长时应按各段时间之和算,不能直接用 $k\Delta t$。
  6. 时空图中气泡也要占格子,数总周期时不能漏掉。

核心结论

  1. 一切手算从 $T_k = (k+n-1)\Delta t$ 出发,其余三个指标由它推出。
  2. 时空图的画法:横轴时间、纵轴指令,逐行右移一格呈阶梯状。
  3. 三类冲突分别用资源复制、转发、分支预测来化解。
  4. 转发能消除大多数 RAW 停顿,但消除不了 Load-Use。
  5. 段数越多理论加速比越高,但单条指令延迟更长。
  6. 指令数 $n$ 越大,装入 / 排空开销被摊得越薄,效率越接近 100%。

记忆卡片

流水线执行时间公式?
$T_k = (k+n-1)\Delta t$。前 $k-1$ 拍在填充流水线,之后每拍完成一条指令。
三种流水线冲突及解法?
结构冲突→资源复制;数据冲突→转发 / 插入气泡;控制冲突→延迟分支 / 分支预测。
什么是转发(forwarding / bypassing)?
把 ALU 结果直接送到下一条指令的 ALU 输入端,不等写回寄存器,可解决大部分 RAW。
LW 为什么会产生 Load-Use 冲突?
LW 在 MEM 段末尾才取到数据,即使转发也赶不上紧邻下一条的 EX 段,必须停 1 拍。
效率公式?为何指令少时效率低?
$E = S/k$。指令少时填充 / 排空开销占比大,有效工作格子少;$n \to \infty$ 时 $E \to 1$。
最大吞吐率是多少?
$TP_{\max} = 1/\Delta t$,即每个流水线周期流出一条指令。

交互动画 · 停顿时序图对照

无转发 · ADD/SUB/AND/OR 均依赖 R1 · 共 10 拍(气泡 2 拍) 12345 678910 ADDSUBANDOR IF ID EX MEM WB IF 气泡 气泡 ID EX MEM WB IF 气泡 气泡 ID EX MEM WB IF ID EX MEM WB SUB 被卡住 2 拍,AND / OR 一并被堵住 —— 气泡是共享的

★ 演示级:两级流水线(取指 → 执行)逐步手算。题目:$k=2$ 段、$n=6$ 条指令、每段时间 $\Delta t = 20\,\mathrm{ns}$,求 $T_k$、$T_s$、$S$、$E$、$TP$。

1234 567 时空图(阶梯对角) 非流水:每条指令 2 段串行 T_k = (k+n−1)·Δt 装入期 k·Δt = 2×20 = 40 ns 稳态 (n−1)·Δt = 5×20 = 100 ns T_s = n·k·Δt = 6×2×20 = 240 ns S = T_s/T_k ≈ 1.71 · E = S/k ≈ 85.7% TP = n/T_k ≈ 0.043 条/ns · TPmax=0.05
1 / 8

相关知识点

源笔记未声明 related 条目;可通过页脚「上一篇 / 下一篇」在本章内顺序浏览。

本页右上「在 Obsidian 中打开」跳回源笔记。