| 项目 | 值 |
|---|---|
| 画法 | 横轴时间,纵轴指令,每格一个时钟周期 |
| 冒险处理 | 插入气泡(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$$| 冲突类型 | 原因 | 解决方法 |
|---|---|---|
| 结构冲突 | 资源争用(如同时访存) | 资源复制(哈佛结构)、停顿 |
| 数据冲突 | 数据依赖(RAW / WAR / WAW) | 转发 / 旁路、停顿、编译优化 |
| 控制冲突 | 分支指令改变 PC | 延迟分支、分支预测、停顿 |
题目:五级流水线,每段 2 ns,执行 100 条指令。求 $T_k$、$T_s$、$TP$、$S$、$E$。
题目:四级流水线(IF / ID / EX / WB),每段 1 个时钟周期,执行 4 条指令,画出时空图并求 $S$、$E$。
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 拍 |
LW R1, 0(R2) ; R1 = M[R2+0]
ADD R3, R1, R4 ; R3 = R1 + R4
SUB R5, R3, R6 ; R5 = R3 - R6
题目:比较 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\%$ |
条件分支在 ID 段判断是否跳转;若跳转,已进入 IF 段的下一条指令作废 → 流水线冲刷。
| 假设条件 | 取值 |
|---|---|
| 分支结果确定的段 | ID 段 |
| 分支指令占比 | 50% |
| 分支中实际跳转的比例 | 50% |
| 每次冲刷浪费 | 1 个周期 |
★ 演示级:两级流水线(取指 → 执行)逐步手算。题目:$k=2$ 段、$n=6$ 条指令、每段时间 $\Delta t = 20\,\mathrm{ns}$,求 $T_k$、$T_s$、$S$、$E$、$TP$。
源笔记未声明 related 条目;可通过页脚「上一篇 / 下一篇」在本章内顺序浏览。
本页右上「在 Obsidian 中打开」跳回源笔记。