Skip to content

指令流水线的基本概念与实现

2026 大纲 五(六)1、2 指令流水线的基本概念、指令流水线的基本实现

单条指令一点没变快,快的是"同时在跑几条"

流水线最容易被误解的一点,恰好也是它最本质的一点:

🔴 流水线不缩短单条指令的执行时间。 一条指令仍然要走完 k 个段,总延迟是 kΔt甚至可能比非流水线时更长(多了段间寄存器的延迟)。它提升的是吞吐率——满载之后每个时钟周期完成一条。这与多模块存储器里"每个存储体并没有变快"是同一回事:并行提高的是总量,不是单件速度

从这句话出发,本篇后面的公式就都有了归宿:算吞吐率、加速比、效率用的是"总量"视角,算单条指令延迟用的是"单件"视角,两者不能混。

它与多周期的关系也可以一句话说清:多周期让一个部件跨阶段复用,流水线让不同指令同时占用不同部件。硬件规模几乎没变,吞吐率却提高了数倍。但这个"同时"有前提:

🔴 各段必须使用不同的部件,否则重叠不起来。 两段抢同一个部件就只能排队。指令存储器与数据存储器必须分开,正是因为 IF 段与 MEM 段要同时工作。

⚠️ 还有一条形式上的要求:不访存的指令也要占满 MEM 段。R 型指令在 MEM 段什么都不做,但仍要占一个周期——所有指令走同样的段数,写回顺序才与程序顺序一致。

(本篇讨论的"指令流水线"默认指处理机级、线性、静态流水线。)

交互可视化

加载可视化中...

一、流水线是从多周期再往前推一步

一条指令占部件利用率
单周期1 个长周期低——一条指令期间大部分部件闲置
多周期若干个短周期高——部件跨阶段复用,但同一时刻仍只有一条指令在执行
流水线若干个短周期最高——不同指令同时占用不同部件

多周期解决了"一条指令内部件闲置",但没解决"某一时刻大部分部件仍然闲置"——因为机器里始终只有一条指令。流水线的做法是:既然 IF 段做完就空出来了,那就立刻让下一条指令进来

二、为什么是五段

五段的划分不是约定,而是从单周期数据通路的关键路径上切出来的。lw 指令要依次经过:

取指读寄存器ALU 算地址访存写回寄存器

这五个环节各自使用不同的部件,且前一环节的输出正是后一环节的输入。在每个自然分界处切一刀,就得到五段:

阶段缩写操作用到的部件
取指IF从指令存储器取指令,PC+4指令存储器、PC
译码/读寄存器ID译码操作码,读寄存器堆译码器、寄存器堆读口
执行EXALU 运算或计算存储器地址ALU
访存MEM读/写数据存储器数据存储器
写回WB将结果写回寄存器堆寄存器堆写口

三、段间寄存器

每个流水段之后必须设置段间寄存器(流水线寄存器、锁存器):

IF  →  IF/ID  →  ID  →  ID/EX  →  EX  →  EX/MEM  →  MEM  →  MEM/WB  →  WB

组合逻辑的输出只在输入稳定时才有效:IF 段刚取出的指令,下一个周期就会被新的一条指令冲掉——因为 IF 段已经在给下一条指令服务了。所以每一段的输出必须在周期末尾锁进寄存器,供下一段在下一周期使用。

图 6.5 5 段流水线数据通路及段寄存器
图 6.5 5 段流水线数据通路及段寄存器
(袁春风《计算机组成与系统结构》第 3 版,见文末教材出处)

对照单周期数据通路可以看出:流水线唯一的结构改动就是插入这四条竖直的段寄存器,部件本身一个没变。

🔴 段间寄存器不只锁存数据,还要传控制信号。 控制信号在 ID 段一次性译出,却要一直用到 WB 段,只能随指令一路往下传。而寄存器本身有延迟,必须计入时钟周期:

Δt=max(Δt1, , Δtk)+t寄存器

🔴 Δt 取最慢段加寄存器延迟,不是各段之和。 各段之和是非流水线时一条指令的耗时。比最慢段快的那些流水段,每个周期都在空等——各段延迟越不均衡,浪费越大

四、时空图与三个性能指标

以连续 5 条指令为例(每段耗时 Δt):

        Δ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+51)Δt=9Δt。一般地,k 段流水线执行 n 条指令 T=(k+n1)Δt——式子可以直接读出来:第一条指令花 k 拍走完全程(填满流水线),之后每拍出一条,还剩 n1 条。

三个指标依次为:吞吐率 TP=n(k+n1)Δtnk 时趋近 TPmax=1/Δt);加速比 S=knΔt(k+n1)Δt=knn+k1nk 时趋近段数 k);效率 E=Sk=nn+k10<E1。三者关系为 S=kE

🔴 加速比恒小于段数 k 分母 n+k1>n(只要 k>1),只有在 n 时才趋近 k,有停顿时更低。若算出 S>k,一定是顺序执行的时间算错了。

🔴 效率就是时空图的面积比。 总面积是 k(k+n1) 格,被指令真正占用的只有 kn 格,其余是建立阶段与排空阶段的空白——这两块空白就是加速比达不到 k 的全部原因。所以画出时空图数格子比套公式稳,有停顿时空泡也算作空白格。

顺带回答一个常被问的:段数是不是越多越好?不是。段数增加会让①段间寄存器延迟占周期的比例上升,限制频率进一步提高;②单条指令经历的周期数增加、延迟变大;③冒险的停顿代价更大(要丢弃的错误指令更多);④控制逻辑急剧复杂。段数是性能与复杂度的折中。

两道演算:指标的完整算法,以及时钟周期为什么不是各段之和(想核对自己套公式的每一步时展开)

(一)5 段流水线,每段时间均为 2 ns,执行 100 条指令,求 TPSE

k=5n=100Δt=2 ns:

T=(5+1001)×2=208 nsTP=100208 ns4.81×108 条/s,S=5×100100+51=5001044.81,E=10010496.2%

校验:顺序执行需 100×5×2=1000 ns,S=1000/2084.81,与公式一致。

(二)某 4 段流水线各段延迟为 60 ps、80 ps、70 ps、90 ps,段间寄存器延迟 10 ps,求时钟周期与最大吞吐率。

Δt=max(60,80,70,90)+10=100 ps,TPmax=1100 ps=1010 条/s=10 GIPS

不是各段延迟之和 300 ps——那是非流水线时一条指令的耗时。流水线的时钟周期只由最慢段决定,本例中 60 ps 的那一段每个周期要空等 40 ps,这就是各段不均衡的代价。

五、流水线的分类

分类标准类型说明
按级别部件级流水线部件内部流水(如浮点加法器)
处理机级流水线指令执行级别(IF-ID-EX-MEM-WB)
处理机间流水线多台处理机串接,宏流水线
按功能单功能流水线只完成一种功能
多功能流水线可配置为多种功能
按可否并行静态流水线同一时刻只能按一种功能工作
动态流水线各段可同时按不同功能工作
按有无反馈线性流水线数据单向流动,无反馈
非线性流水线存在反馈回路,某些段多次经过

六、什么样的指令系统有利于流水线

流水线要跑得顺,靠的是每一段的工作量都可预测、都能在一个时钟周期内做完。指令系统的三个设计选择直接决定这一点:

指令系统特点对流水线的具体好处
指令格式规整且定长定长 IF 段每周期固定取一条,不必先解析长度再决定取几字节;格式规整 寄存器号位置固定,ID 段可以边译码边读寄存器
指令和数据按边界对齐存放对齐 每次访存只需一个存储周期。不对齐的数据跨越边界,要访存两次再拼接,MEM 段时间就不固定了
只有 Load/Store 能访问存储器只有这两类指令真正经过 MEM 段,其余指令空过;否则运算指令也要访存,MEM 段的工作量随指令而变

第二条最容易漏,因为它看着像存储器章节的事;把它翻译成时间就清楚了:不对齐 ⇒ 一次访存变两次 ⇒ MEM 段时长不确定 ⇒ 各段不再均衡。流水线最怕"这条指令的某一段特别慢"——时钟周期得按最慢的来,所有指令一起陪绑。

这三条正是 RISC 的设计特征,所以说 RISC 天生适合流水线——它不是碰巧适合,而是照着流水线的需求设计出来的。CISC 指令长度不等、寻址方式复杂、运算指令也能访存,难以划出耗时均匀的段;现代 x86 的做法是在前端把 CISC 指令翻译成内部的类 RISC 微操作,后端仍按流水线执行。

考点速记

  1. 流水线是多周期的下一步:多周期让部件跨阶段复用,流水线让不同指令同时占用不同部件;五段划分来自单周期关键路径的五个环节,各段用不同部件是能重叠的前提。
  2. 段间寄存器不仅锁存数据,还要把控制信号一路传到 WB 段;Δt最慢段加寄存器延迟(不是各段之和),故流水线不缩短单条指令延迟,只提升吞吐率。
  3. T=(k+n1)ΔtTPmax=1/ΔtS=knn+k1<kE=S/k效率就是时空图的面积比,画图数格子比套公式稳。有利于流水线的三个指令系统特点(定长规整、边界对齐、只有 Load/Store 访存)都指向同一个诉求:让每一段的耗时固定

这一节在真题里被考过的形式(下方「真题练习」里属于本篇的那几道):

  • 给几条指令系统特点,问哪些有利于实现流水线:三条通常全部成立——格式规整且定长(IF 段每周期固定取一条、ID 段可边译码边读寄存器)、按边界对齐存放(每次访存只要一个存储周期,不对齐要访存两次再拼接)、只有 Load/Store 能访存(其余指令 MEM 段空过)。判据统一是能不能让每一段的耗时固定
  • 判断超标量流水线的特性能在一个时钟周期内同时发射多条指令(对)、能结合动态调度提高并行性(对);但不能缩短流水线功能段的处理时间(错)——它靠加宽而不是靠把每段做快。
  • 问哪几类处理器理想情况下 CPI 为 1基本流水线是(满载时每周期完成一条),超标量小于 1。与单周期、多周期的完整对照见 单周期数据通路

易错:认为流水线缩短了单条指令的执行时间。它只提高吞吐率,单条延迟甚至可能变长。

易错:把时钟周期算成各段之和。取最慢段再加段间寄存器延迟。

易错:算出加速比大于段数还不检查。S<k 恒成立。

易错:以为超标量是把每一段做得更快。它是同时发射多条,段本身没变快。

教材出处
  • 5 段流水线数据通路及段寄存器(图 6.5):袁春风《计算机组成与系统结构》第 3 版 §6.2 流水线处理器的实现,印刷页 p169

相关知识

流水线冒险流水线性能分析单周期数据通路多周期数据通路数据对齐与大小端CISC 与 RISC多模块存储器

真题练习