第七讲 · 流水线数据通路与性能
对应材料:2025 计组复习提纲“流水线概述、数据通路、控制、性能分析”,并参考 2024 流水线 PPT。
流水线没有让一条指令少做任何事情。它做的是把长组合路径切成几段,让不同指令在不同硬件段上重叠执行。
时钟 1:指令 A 在 IF
时钟 2:指令 A 在 ID,指令 B 在 IF
时钟 3:指令 A 在 EX,指令 B 在 ID,指令 C 在 IF
因此它主要提高的是单位时间完成的指令数,也就是吞吐率,而不是单条指令从进入到完成的延迟。
1. 从单周期切成五级
经典五级 MIPS 流水线:
| 级 | 名称 | 主要工作 |
|---|---|---|
| IF / F | Instruction Fetch | 用 PC 读 IM,计算 |
| ID / D | Instruction Decode | 译码、读 RF、扩展立即数 |
| EX / E | Execute | ALU 运算、有效地址或分支目标计算 |
| MEM / M | Memory | 读写 DM |
| WB / W | Write Back | 结果写回 RF |
切分原则不是“每级名字好看”,而是让每级延迟尽量接近,同时保证级间能用寄存器隔开。
2. 流水线寄存器保存的不是一个值
四组级间寄存器通常命名为:
- IF/ID;
- ID/EX;
- EX/MEM;
- MEM/WB。
它们要保存这条指令后续仍需要的全部信息:数据、寄存器编号、PC 相关值和控制信号。
以 lw 为例:
IF/ID:指令、PC+4
ID/EX:R[rs]、R[rt]、扩展立即数、目标寄存器编号、后级控制
EX/MEM:有效地址、待存数据、目标寄存器编号、访存/写回控制
MEM/WB:主存读出值、ALU 结果、目标寄存器编号、写回控制
如果只传“数据结果”却忘了传目的寄存器编号,lw 到 W 级时就不知道应该写谁。课件专门用这个错误说明:指令的信息流必须与执行进度同步前进。
3. 一个流水级里发生什么
每一级都可以抽象成:
前级流水线寄存器 → 本级组合逻辑 → 后级流水线寄存器
在一个时钟周期内,组合逻辑使用前级寄存器的旧值计算;到下一个边沿,所有后级寄存器同时锁存结果。不同指令虽然并行,但每条指令仍然按 F→D→E→M→W 顺序前进。
4. 各类指令怎样经过五级
| 指令 | F | D | E | M | W |
|---|---|---|---|---|---|
| R 型 | 取指 | 读 rs/rt | ALU 运算 | 空过 | 写 rd |
ori | 取指 | 读 rs、扩展立即数 | ALU 运算 | 空过 | 写 rt |
lw | 取指 | 读基址 | 算地址 | 读 DM | 写 rt |
sw | 取指 | 读基址和待存值 | 算地址 | 写 DM | 空过 |
beq | 取指 | 读比较对象 | 比较/决定控制流 | 空过 | 空过 |
“空过”不代表指令可以随意跳级。为保持固定节拍,它仍占据相应流水位置,只是这一阶段没有状态更新。
5. 控制信号也要流水
控制器通常在 D 级按指令产生全部控制,再把信号按使用阶段分组:
- E 级:ALU 运算、ALU 输入选择、目的寄存器选择;
- M 级:DM 读写、分支相关控制;
- W 级:RF 写使能、写回来源选择。
某信号在后级才使用,就必须随指令逐级保存。否则 D 级已经换成下一条指令,后级却会拿到下一条指令的控制,数据和策略彻底错位。
“单周期控制器能否直接搬过来”的答案是:译码思路可以复用,但控制信号不能直接跨几级拉长线使用,必须跟着对应指令流水。
6. 流水时空图
对没有暂停的 5 级流水线,四条指令的时空图为:
| 周期 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
|---|---|---|---|---|---|---|---|---|
| I1 | F | D | E | M | W | |||
| I2 | F | D | E | M | W | |||
| I3 | F | D | E | M | W | |||
| I4 | F | D | E | M | W |
条指令在理想 级流水线中需要
个周期。前 个周期是在“灌满”,末尾还要“排空”;只有长程序中间段才接近每周期完成一条。
7. 流水线时钟周期
若各级组合延迟为 ,级间寄存器开销为 ,则
不是把单周期延迟简单除以级数,因为:
- 各级延迟通常不均衡;
- 流水线寄存器有时钟到输出、建立时间等额外开销;
- 更深的流水线还会增加冒险代价。
7.1 课件示例
课件给出五段延迟:IF 200 ps、ID 100 ps、EX 200 ps、MEM 200 ps、WB 100 ps,并暂不计流水寄存器开销。
- 单周期最长路径为 ps;
- 流水线周期由最长一级决定,为 200 ps;
- 理想情况下长程序吞吐率可接近单周期的 4 倍,而不是 5 倍,因为切分并不均匀。
8. 延迟、吞吐率、CPI 分开看
理想流水线:
但单条指令要经历五个周期,其延迟约为 。如果 ps,单条指令延迟约 1000 ps,甚至可能比单周期 800 ps 更长;系统仍然更快,因为灌满后每 200 ps 就能完成一条。
CPU 总时间仍是
流水线主要压缩 ,但冒险会把 CPI 推到 1 以上。
9. 理想加速比为什么很难达到
若单周期被均匀切成 级、没有寄存器开销、没有冒险且程序足够长,潜在加速比接近 。真实损失来自:
- 各级不均衡;
- 流水线寄存器开销;
- 填充与排空;
- 结构、数据、控制冒险造成的停顿;
- 指令或 Cache 缺失带来的长延迟。
因此“流水级越多越快”并不成立。级越深,时钟可能越短,但需要更多寄存器,跨级依赖和错误路径清空的代价也更大。
10. 三种 CPU 模型对比
| 模型 | 时钟周期 | CPI | 资源使用 | 控制特点 |
|---|---|---|---|---|
| 单周期 | 由最长指令决定 | 1 | 一条指令独占整条通路 | 组合控制简单 |
| 多周期 | 由最长步骤决定 | 随指令变化 | 一条指令可跨周期复用部件 | 控制器需保存步骤状态 |
| 流水线 | 由最长流水级决定 | 理想 1,实际大于 1 | 多条指令并行占不同级 | 需处理冒险与级间控制 |
多周期与流水线都把长路径切段,但目的不同:多周期让同一条指令分时复用硬件,流水线让不同指令重叠占用各段。
11. 读流水线题的顺序
- 写清每级功能和结果何时可用;
- 画级间寄存器,列出必须随指令携带的信息;
- 再画时空图,不要只盯电路图;
- 区分“指令在哪一级”“结果在哪一级产生”“结果在哪一级被需要”;
- 最后才计算周期、CPI 与总时间。
下一讲处理流水线真正困难的部分:相邻指令之间不是互不相干的,它们会争资源、传数据、改变控制流。