Appearance
流水线性能分析与多发射技术
2026 大纲 五(六)4 超标量和动态流水线的基本概念(含流水线性能的定量分析)。大纲写的是"基本概念",只要求会区分,不要求做具体的调度设计。
算流水线性能,先决定用哪一套公式
理想流水线的公式在 流水线基本概念 里已经有了。真实流水线会插气泡,于是同一个量有了两种算法——先选对公式,比算得快更重要:
设共插入
换成 CPI 的写法是
各类冒险的贡献直接相加,因为它们发生在不同的指令上。
🔴 两套公式的适用范围不同,选错会差一截。
用于指令条数已知且不多、要精确到每一拍的场合; 用于只给出统计比例的场合(此时相当于 ,建立与排空已被摊薄)。指令数少时用 CPI 公式,会漏掉 拍的建立时间。
画时空图时还有一条容易漏的机制:
🔴 气泡会向后传播。 与任何指令都不相关的后继指令也会被推迟——前一条停在 ID 段不走,后一条就进不了 ID。所以停顿之后的所有指令要整体右移,不能只移那条相关的。它有个副作用:顺延之后有时反而把后面的相关一并解决了(生产者早已写回)。
一、含冒险时的性能计算
理想情况下
当
时空图的逐拍读法,以及气泡向后传播的具体样子(想弄清"停顿之后的指令要不要一起右移"时展开)
时空图横轴为时钟周期、纵轴为指令,每个格子表示某条指令在某周期处于哪个段。理想情况下 5 条指令、5 段流水线共
T1 T2 T3 T4 T5 T6 T7 T8 T9
I1 IF ID EX MEM WB
I2 IF ID EX MEM WB
I3 IF ID EX MEM WB
I4 IF ID EX MEM WB
I5 IF ID EX MEM WB换成一段带 load-use 相关的序列(I1: lw R1,0(R2)/I2: ADD R3,R1,R4/I3: SUB R5,R3,R6),I2 要插入 1 个气泡:
T1 T2 T3 T4 T5 T6 T7 T8 T9
I1 IF ID EX MEM WB
I2 IF ID 泡 EX MEM WB
I3 IF — ID EX MEM WB注意 I3:它自己和任何指令都没有相关,却也被推迟了一拍——因为 I2 停在 ID 段不走,I3 就进不了 ID 段。前面堵一拍,后面全部跟着堵一拍,这是按序流水线的固有性质,也是气泡代价被放大的原因。
一段相关密集序列上的完整演算:转发到底省了多少拍(想核对"无转发/有转发"两种停顿数各自怎么数时展开)
五段流水线(IF/ID/EX/MEM/WB),时钟 100 MHz,寄存器堆支持前半周期写、后半周期读。指令序列:
I1: add R1, R2, R3
I2: sub R4, R1, R5 ← RAW on R1
I3: and R6, R1, R7 ← RAW on R1
I4: lw R8, 0(R1)
I5: or R9, R8, R1 ← load-use on R8
I6: add R10, R9, R8 ← RAW on R9(a)无转发。 消费者的 ID 最早只能与生产者的 WB 同周期(前写后读):
| 相关 | 正常 ID | 实际 ID | 停顿 |
|---|---|---|---|
| I2 等 I1 的 R1(WB 在 T5) | T3 | T5 | 2 |
| I3 等 I1 的 R1 | T6(已顺延) | T6 | 0 |
| I5 等 I4 的 R8(WB 在 T10) | T8 | T10 | 2 |
| I6 等 I5 的 R9(WB 在 T13) | T11 | T13 | 2 |
I3 本身也和 I1 相关,却被 I2 的停顿顺带推到了 T6,此时 R1 早已写回,不再产生额外停顿——气泡向后传播有时反而把后面的相关一并解决了。
(b)有完整转发。 ALU 结果可在下一拍直接喂给 EX,只有 load-use 必须停 1 拍:
| 指令 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
|---|---|---|---|---|---|---|---|---|---|---|---|
I1 add | IF | ID | EX | MEM | WB | ||||||
I2 sub | IF | ID | EX | MEM | WB | ||||||
I3 and | IF | ID | EX | MEM | WB | ||||||
I4 lw | IF | ID | EX | MEM | WB | ||||||
I5 or | IF | ID | 泡 | EX | MEM | WB | |||||
I6 add | IF | — | ID | EX | MEM | WB |
I2 的 EX(第 4 拍)收 I1 的 EX/MEM 转发;I3 的 EX(第 5 拍)收 I1 的 MEM/WB 转发;I5 是 load-use,I4 第 7 拍才出 MEM,转发最早供第 8 拍的 EX,停 1 拍;I6 的 EX(第 9 拍)收 I5 的 EX/MEM 转发。总计
(c)对比。 转发带来的加速
在这段相关密集的序列上,转发把停顿从 6 拍砍到 1 拍——而它的硬件代价只是几条多路选择线,这就是现代流水线一律配备完整转发通路的原因。
二、多发射:把 CPI 压到 1 以下
前面所有讨论的理想 CPI 都是 1——每周期最多完成一条指令。要突破这个上限,只能每周期发射多条指令。三条路线的分工是:超标量配备多条并行流水线(多组功能部件),由硬件运行时挖掘并行性;超流水线不加宽度而把每段细分成更多子段以提高频率;VLIW 由编译器在编译阶段把多条可并行的操作打包成一条超长指令字,每条含多个操作码字段分别控制不同功能部件。
| 对比项 | 超标量(动态多发射) | VLIW(静态多发射) |
|---|---|---|
| 并行性由谁挖掘 | 硬件运行时动态完成 | 编译器编译时静态完成 |
| 硬件复杂度 | 高(需动态调度、乱序执行) | 低(控制逻辑简单) |
| 编译器要求 | 一般 | 高(需精确调度) |
| 代码兼容性 | 好(二进制兼容) | 差(指令格式与硬件绑定) |
| 对比项 | 超标量 | 超流水线 | VLIW |
|---|---|---|---|
| 方法 | 多条并行流水线 | 更深的流水线 | 编译器打包多操作 |
| 关键资源 | 多组硬件部件 | 更高的时钟频率 | 编译器优化能力 |
| 每周期发射 | 1 条(但周期更短) | 1 条(含多个操作) | |
| 单指令延迟 | 不增加 | 周期数增加,总时间基本不变 | 不增加 |
| 主要副作用 | 部件间依赖检查复杂 | 分支预测错误代价更大 | 编译器需静态避免冲突 |
三条路线里,前两条的关系最容易混:
🔴 超标量与超流水线是两个正交的方向。超标量
增加宽度(空间上并行,一次进多条, 发射 理想 );超流水线 增加深度(把每一段再细分成 份,频率提升约 倍,每拍更短)。两者互不冲突,现代高性能处理器同时使用。⚠️ 特别注意超标量并不缩短流水线功能段的处理时间——它靠加宽,不靠把每段做快。
CPI 一旦小于 1,指标就该换个写法:IPC(每周期指令数)。双发射的理想 IPC 是 2,实测 1.5 就说明发射效率 75%。单发射流水线的 CPI 下限就是 1,要突破只能多发射。
但多发射的实际收益有天花板:
🔴 超标量的实际加速远达不到
,因为程序中天然的指令级并行度有限——相关的指令没法同时发射。这就是发射宽度增到一定程度之后收益迅速递减的原因。
🔴 超流水线让分支预测错误更贵。 代价
判定所在段编号 ,流水线越深,分支结果确定得越晚、要清除的错误指令越多。频率提高带来的收益会被增大的分支惩罚逐渐吃掉,这是"加深流水线"这条路的天花板。
⚠️ 顺带两条:加深流水线并不会让单条指令明显变慢——周期数变多但每周期更短,总时间基本不变,真正略微变慢的是段间寄存器延迟在总延迟中占比上升。VLIW 兼容性差的根源是一条 VLIW 指令里有几个操作槽被写进了指令格式,硬件换代增加了功能部件、旧的二进制也用不上,只能重新编译;所以它在通用处理器上没普及,却在 DSP 等封闭领域广泛应用。
三、动态流水线:发射与完成的两个维度
动态流水线讲的是另一件事:指令的发射顺序和完成(写回)顺序,各自可以是按序的,也可以是无序的。
| 模式 | 发射 | 完成 | 特点 |
|---|---|---|---|
| 按序发射、按序完成 | 按序 | 按序 | 最简单;前面一条卡住,后面全部跟着等 |
| 按序发射、无序完成 | 按序 | 无序 | 先算完的先写回,不必等前面的 |
| 无序发射、无序完成 | 无序 | 无序 | 动态流水线的典型形态,并行度最高,硬件最复杂 |
🔴 表里只有三种,因为不存在"无序发射、按序完成"——都已经乱序发射了,再强行按序写回没有任何意义。四种组合少掉的正是这一种。
🔴 无序完成会带来两个新问题:① WAR 与 WAW 冒险重新出现,必须靠寄存器重命名消除(按序流水线里它们本来不成问题,见 流水线冒险);② 异常难处理——早发射的指令出异常时,排在它后面的指令可能已经写回,机器状态回不去了。所以现代 CPU 采用的是无序执行、按序提交:允许乱序执行,但结果必须按程序顺序对外生效。


(袁春风《计算机组成与系统结构》第 3 版,见文末教材出处)
看 (a) 的两处代价,就明白按序的约束卡在哪:第 3 个时钟 i2 不能和 i1 同时发射,只好在译码阶段阻塞一拍;i5 在第 6 个时钟就已经算完,却要一直等到 i4 写回之后的第 9 个时钟才能写回。放开这两条约束,就得到 (c)。至于具体的调度算法(记分牌、Tomasulo)属于体系结构课程内容,不在大纲要求范围内。
考点速记
- 含冒险时
、 ,统计比例形式为 且各项可直接相加;指令数少时不能用 CPI 形式,会漏掉 拍建立时间。 - 气泡会向后传播,画时空图时停顿之后的指令整体右移;完整转发通路硬件代价小、收益极大,是现代流水线的标配。
- 超标量
增加宽度、超流水线 增加深度,两者正交可同时使用,超标量不缩短各段的处理时间;VLIW 由编译器静态调度、二进制兼容性差;动态流水线看发射与完成两个维度,无序完成会让 WAR/WAW 重新出现并使异常难处理,故现代 CPU 采用无序执行、按序提交。
这一节在真题里被考过的形式(下方「真题练习」里属于本篇的那几道):
- 给各功能段的执行时间,问 CPU 时钟周期至少是多少:取最长的那一段。若题面还给了流水段寄存器延时,要再加上去(80 ps 的最长段
20 ps 寄存器 100 ps)。⚠️ 给了寄存器延时却不加,是这类题准备好的错误选项。 - 给主频、流水段数、指令条数且无阻塞,问吞吐率:满载时每个时钟周期完成一条,所以吞吐率就趋近于主频本身(1.03 GHz
约 条/s)。指令条数只影响精确值与主频的差距,题目说"没有任何阻塞"时通常直接取主频那一档。 - 大题里问连续
条指令无阻塞时需要多少时钟周期: 。要把"第一条走完 拍填满流水线、之后每拍出一条"这句话写出来。 - 大题里画出某条语句对应的指令序列及其在流水线中的执行过程、并问至少需要多少周期:先按数据相关排出停顿,再数时空图的列数。停顿之后的指令整体右移。
易错:算时钟周期时漏掉流水段寄存器延时。
易错:指令条数不多时套 CPI 公式,漏掉建立时间那
拍。
易错:画时空图时只把相关的那条指令右移,忘了气泡会向后传播。
易错:认为超标量能缩短各流水段的处理时间。它增加的是宽度。
教材出处
- 3 种指令发射/完成模式的执行过程(图 6.30(a)(c)):袁春风《计算机组成与系统结构》第 3 版 §6.4 高级流水线技术,印刷页 p198
相关知识
指令流水线的基本概念与实现|流水线冒险及其处理|流水线对比模拟器|多处理器基本概念