Appearance
指令流水线的基本概念与实现
2026 大纲 五(六)1、2 指令流水线的基本概念、指令流水线的基本实现。
单条指令一点没变快,快的是"同时在跑几条"
流水线最容易被误解的一点,恰好也是它最本质的一点:
🔴 流水线不缩短单条指令的执行时间。 一条指令仍然要走完
个段,总延迟是 ,甚至可能比非流水线时更长(多了段间寄存器的延迟)。它提升的是吞吐率——满载之后每个时钟周期完成一条。这与多模块存储器里"每个存储体并没有变快"是同一回事:并行提高的是总量,不是单件速度。
从这句话出发,本篇后面的公式就都有了归宿:算吞吐率、加速比、效率用的是"总量"视角,算单条指令延迟用的是"单件"视角,两者不能混。
它与多周期的关系也可以一句话说清:多周期让一个部件跨阶段复用,流水线让不同指令同时占用不同部件。硬件规模几乎没变,吞吐率却提高了数倍。但这个"同时"有前提:
🔴 各段必须使用不同的部件,否则重叠不起来。 两段抢同一个部件就只能排队。指令存储器与数据存储器必须分开,正是因为 IF 段与 MEM 段要同时工作。
⚠️ 还有一条形式上的要求:不访存的指令也要占满 MEM 段。R 型指令在 MEM 段什么都不做,但仍要占一个周期——所有指令走同样的段数,写回顺序才与程序顺序一致。
(本篇讨论的"指令流水线"默认指处理机级、线性、静态流水线。)
交互可视化
一、流水线是从多周期再往前推一步
| 一条指令占 | 部件利用率 | |
|---|---|---|
| 单周期 | 1 个长周期 | 低——一条指令期间大部分部件闲置 |
| 多周期 | 若干个短周期 | 高——部件跨阶段复用,但同一时刻仍只有一条指令在执行 |
| 流水线 | 若干个短周期 | 最高——不同指令同时占用不同部件 |
多周期解决了"一条指令内部件闲置",但没解决"某一时刻大部分部件仍然闲置"——因为机器里始终只有一条指令。流水线的做法是:既然 IF 段做完就空出来了,那就立刻让下一条指令进来。
二、为什么是五段
五段的划分不是约定,而是从单周期数据通路的关键路径上切出来的。lw 指令要依次经过:
这五个环节各自使用不同的部件,且前一环节的输出正是后一环节的输入。在每个自然分界处切一刀,就得到五段:
| 阶段 | 缩写 | 操作 | 用到的部件 |
|---|---|---|---|
| 取指 | IF | 从指令存储器取指令,PC+4 | 指令存储器、PC |
| 译码/读寄存器 | ID | 译码操作码,读寄存器堆 | 译码器、寄存器堆读口 |
| 执行 | EX | ALU 运算或计算存储器地址 | ALU |
| 访存 | MEM | 读/写数据存储器 | 数据存储器 |
| 写回 | WB | 将结果写回寄存器堆 | 寄存器堆写口 |
三、段间寄存器
每个流水段之后必须设置段间寄存器(流水线寄存器、锁存器):
IF → IF/ID → ID → ID/EX → EX → EX/MEM → MEM → MEM/WB → WB组合逻辑的输出只在输入稳定时才有效:IF 段刚取出的指令,下一个周期就会被新的一条指令冲掉——因为 IF 段已经在给下一条指令服务了。所以每一段的输出必须在周期末尾锁进寄存器,供下一段在下一周期使用。

(袁春风《计算机组成与系统结构》第 3 版,见文末教材出处)
对照单周期数据通路可以看出:流水线唯一的结构改动就是插入这四条竖直的段寄存器,部件本身一个没变。
🔴 段间寄存器不只锁存数据,还要传控制信号。 控制信号在 ID 段一次性译出,却要一直用到 WB 段,只能随指令一路往下传。而寄存器本身有延迟,必须计入时钟周期:
🔴
取最慢段加寄存器延迟,不是各段之和。 各段之和是非流水线时一条指令的耗时。比最慢段快的那些流水段,每个周期都在空等——各段延迟越不均衡,浪费越大。
四、时空图与三个性能指标
以连续 5 条指令为例(每段耗时
Δt 2Δt 3Δt 4Δt 5Δt 6Δt 7Δt 8Δt 9Δt
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完成 5 条指令共需
三个指标依次为:吞吐率
🔴 加速比恒小于段数
。 分母 (只要 ),只有在 时才趋近 ,有停顿时更低。若算出 ,一定是顺序执行的时间算错了。
🔴 效率就是时空图的面积比。 总面积是
格,被指令真正占用的只有 格,其余是建立阶段与排空阶段的空白——这两块空白就是加速比达不到 的全部原因。所以画出时空图数格子比套公式稳,有停顿时空泡也算作空白格。
顺带回答一个常被问的:段数是不是越多越好?不是。段数增加会让①段间寄存器延迟占周期的比例上升,限制频率进一步提高;②单条指令经历的周期数增加、延迟变大;③冒险的停顿代价更大(要丢弃的错误指令更多);④控制逻辑急剧复杂。段数是性能与复杂度的折中。
两道演算:指标的完整算法,以及时钟周期为什么不是各段之和(想核对自己套公式的每一步时展开)
(一)5 段流水线,每段时间均为 2 ns,执行 100 条指令,求
校验:顺序执行需
(二)某 4 段流水线各段延迟为 60 ps、80 ps、70 ps、90 ps,段间寄存器延迟 10 ps,求时钟周期与最大吞吐率。
不是各段延迟之和 300 ps——那是非流水线时一条指令的耗时。流水线的时钟周期只由最慢段决定,本例中 60 ps 的那一段每个周期要空等 40 ps,这就是各段不均衡的代价。
五、流水线的分类
| 分类标准 | 类型 | 说明 |
|---|---|---|
| 按级别 | 部件级流水线 | 部件内部流水(如浮点加法器) |
| 处理机级流水线 | 指令执行级别(IF-ID-EX-MEM-WB) | |
| 处理机间流水线 | 多台处理机串接,宏流水线 | |
| 按功能 | 单功能流水线 | 只完成一种功能 |
| 多功能流水线 | 可配置为多种功能 | |
| 按可否并行 | 静态流水线 | 同一时刻只能按一种功能工作 |
| 动态流水线 | 各段可同时按不同功能工作 | |
| 按有无反馈 | 线性流水线 | 数据单向流动,无反馈 |
| 非线性流水线 | 存在反馈回路,某些段多次经过 |
六、什么样的指令系统有利于流水线
流水线要跑得顺,靠的是每一段的工作量都可预测、都能在一个时钟周期内做完。指令系统的三个设计选择直接决定这一点:
| 指令系统特点 | 对流水线的具体好处 |
|---|---|
| 指令格式规整且定长 | 定长 |
| 指令和数据按边界对齐存放 | 对齐 |
| 只有 Load/Store 能访问存储器 | 只有这两类指令真正经过 MEM 段,其余指令空过;否则运算指令也要访存,MEM 段的工作量随指令而变 |
第二条最容易漏,因为它看着像存储器章节的事;把它翻译成时间就清楚了:不对齐 ⇒ 一次访存变两次 ⇒ MEM 段时长不确定 ⇒ 各段不再均衡。流水线最怕"这条指令的某一段特别慢"——时钟周期得按最慢的来,所有指令一起陪绑。
这三条正是 RISC 的设计特征,所以说 RISC 天生适合流水线——它不是碰巧适合,而是照着流水线的需求设计出来的。CISC 指令长度不等、寻址方式复杂、运算指令也能访存,难以划出耗时均匀的段;现代 x86 的做法是在前端把 CISC 指令翻译成内部的类 RISC 微操作,后端仍按流水线执行。
考点速记
- 流水线是多周期的下一步:多周期让部件跨阶段复用,流水线让不同指令同时占用不同部件;五段划分来自单周期关键路径的五个环节,各段用不同部件是能重叠的前提。
- 段间寄存器不仅锁存数据,还要把控制信号一路传到 WB 段;
取最慢段加寄存器延迟(不是各段之和),故流水线不缩短单条指令延迟,只提升吞吐率。 、 、 、 ;效率就是时空图的面积比,画图数格子比套公式稳。有利于流水线的三个指令系统特点(定长规整、边界对齐、只有 Load/Store 访存)都指向同一个诉求:让每一段的耗时固定。
这一节在真题里被考过的形式(下方「真题练习」里属于本篇的那几道):
- 给几条指令系统特点,问哪些有利于实现流水线:三条通常全部成立——格式规整且定长(IF 段每周期固定取一条、ID 段可边译码边读寄存器)、按边界对齐存放(每次访存只要一个存储周期,不对齐要访存两次再拼接)、只有 Load/Store 能访存(其余指令 MEM 段空过)。判据统一是能不能让每一段的耗时固定。
- 判断超标量流水线的特性:能在一个时钟周期内同时发射多条指令(对)、能结合动态调度提高并行性(对);但不能缩短流水线功能段的处理时间(错)——它靠加宽而不是靠把每段做快。
- 问哪几类处理器理想情况下 CPI 为 1:基本流水线是(满载时每周期完成一条),超标量小于 1。与单周期、多周期的完整对照见 单周期数据通路。
易错:认为流水线缩短了单条指令的执行时间。它只提高吞吐率,单条延迟甚至可能变长。
易错:把时钟周期算成各段之和。取最慢段再加段间寄存器延迟。
易错:算出加速比大于段数还不检查。
恒成立。
易错:以为超标量是把每一段做得更快。它是同时发射多条,段本身没变快。
教材出处
- 5 段流水线数据通路及段寄存器(图 6.5):袁春风《计算机组成与系统结构》第 3 版 §6.2 流水线处理器的实现,印刷页 p169
相关知识
流水线冒险|流水线性能分析|单周期数据通路|多周期数据通路|数据对齐与大小端|CISC 与 RISC|多模块存储器