| 项目 | 值 |
|---|---|
| 阶段 | 取指 IF → 译码 ID → 执行 EX → 访存 MEM → 写回 WB |
| 加速比 | $S = \dfrac{n \times k}{n+k-1}$,$n$ 为指令数,$k$ 为段数 |
| 吞吐率 | $TP = \dfrac{n}{T}$ |
| 方式 | 推进规则 | 3 条指令(5 级)耗时 |
|---|---|---|
| 非流水线 | 上一条全部完成后下一条才开始 | $3\times5 = 15$ 个周期 |
| 流水线 | 每拍错开一级并行推进 | $5+3-1 = 7$ 个周期 |
| 阶段 | 全称 | 主要工作 | 使用部件 |
|---|---|---|---|
| IF | Instruction Fetch | 按 PC 取指令,PC + 4 | 指令存储器、PC、加法器 |
| ID | Instruction Decode | 译码,读寄存器堆,立即数扩展 | 译码器、寄存器堆 |
| EX | Execute | ALU 运算 / 计算有效地址 / 判分支 | ALU |
| MEM | Memory Access | 访问数据存储器(仅 Load/Store) | 数据存储器 |
| WB | Write Back | 结果写回寄存器堆 | 寄存器堆写口 |
单位时间内流水线完成的指令数:
$$TP = \frac{n}{T_{\text{流}}} = \frac{n}{(k+n-1)\,\Delta t}$$当 $n \to \infty$ 时,$TP \to \dfrac{1}{\Delta t}$,即最大吞吐率——每个时钟周期流出一条指令。
当 $n \to \infty$ 时,$S \to k$,最大加速比等于流水线级数。
时空图中"有效时空区"占"总时空区"的比例:
$$E = \frac{\text{有效时空区}}{\text{总时空区}} = \frac{S}{k} = \frac{n}{k+n-1}$$当 $n \to \infty$ 时,$E \to 1$(100%)。
题目:5 级流水线,每级 100 ns,连续执行 100 条指令(无冒险),求非流水线时间、流水线时间、加速比、吞吐率、效率。
| 类型 | 根因 | 主要对策 |
|---|---|---|
| 结构冒险 | 硬件资源冲突 | 哈佛结构 / 多端口 / 暂停 |
| 数据冒险 | 指令间数据相关 | 前递 / 暂停 / 编译调度 |
| 控制冒险 | PC 改变导致预取无效 | 分支预测 / 延迟槽 / 提前判断 |
两条指令在同一周期争用同一部件。典型场景:单端口存储器——指令 I1 处于 MEM 阶段访存,同时 I4 正在 IF 阶段取指,二者都要访问存储器。
解决方法:
1. 哈佛结构(指令 Cache 与数据 Cache 分开) ← 最常用
2. 多端口存储器
3. 流水线暂停一拍(插入气泡)
| 类型 | 全称 | 示例 | 说明 |
|---|---|---|---|
| RAW | 写后读 | ADD R1,R2,R3 → SUB R4,R1,R5 | 真相关,顺序流水线中唯一会真实发生的冒险 |
| WAR | 读后写 | ADD R1,R2,R3 → SUB R2,R4,R5 | 反相关,仅乱序执行时出现 |
| WAW | 写后写 | ADD R1,R2,R3 → SUB R1,R4,R5 | 输出相关,仅乱序执行时出现 |
ADD 要到 WB 阶段才把结果写入 R1,而 SUB 在 ID 阶段就要读 R1——此时 R1 还是旧值。LW R1,0(R2) 紧接 ADD R3,R1,R4。数据要到 MEM 结束才拿到,而下一条 EX 已经开始,即使前递也必须再停 1 拍。分支 / 跳转指令改变 PC,流水线中已经预取的后续指令可能作废。
$$\text{分支代价(延迟损失)} = \text{分支结果确定的阶段序号} - 1$$| 方法 | 做法 | 代价 |
|---|---|---|
| 暂停 | 等分支结果确定后再取指 | 最简单也最慢 |
| 预测不跳转 | 继续顺序取指 | 猜对 0 代价,猜错清空流水线 |
| 预测跳转 | 直接取目标地址指令 | 需先算出目标地址 |
| 延迟槽 | 分支后一条指令总是执行 | 靠编译器填有用指令,否则填 NOP |
| 动态分支预测 | 用历史记录预测 | 需 BHT / BTB 硬件开销 |
00/01 预测不跳,10/11 预测跳;需要连续错两次才改变预测方向,抗抖动能力更强。循环 $n$ 次时的预测准确率近似:
| 技术 | 并行由谁负责 | 核心特征 | CPI |
|---|---|---|---|
| 超标量(Superscalar) | 硬件 | 每拍取 / 发射多条指令,配多套功能部件 | 可 < 1 |
| 超长指令字(VLIW) | 编译器 | 把多条指令打包成一条超长指令,硬件按包并行执行 | 可 < 1 |
| 超流水线(Superpipeline) | 硬件 | 把每段再细分,提高时钟频率 | 仍为 1 |
乱序执行 Out-of-Order Execution:
· 指令不必按程序顺序执行,只要操作数就绪即可进入执行
· 结果通过重排序缓冲区 ROB 按原序提交(保证精确异常)
· Intel / AMD 的现代 x86 处理器均采用
| 寄存器 | 保存内容 |
|---|---|
| IF/ID | 取回的指令、PC + 4 |
| ID/EX | 读出的操作数、扩展后的立即数、控制信号 |
| EX/MEM | ALU 结果、标志位、待写存储器的数据 |
| MEM/WB | 从存储器读出的数据或 ALU 结果、写回寄存器号 |
↑ 以上为站内 HTML 相对链接(纯网页可浏览);本页右上「在 Obsidian 中打开」跳回源笔记。