第七讲 · 流水线数据通路与性能

对应材料:2025 计组复习提纲“流水线概述、数据通路、控制、性能分析”,并参考 2024 流水线 PPT。

流水线没有让一条指令少做任何事情。它做的是把长组合路径切成几段,让不同指令在不同硬件段上重叠执行。

时钟 1:指令 A 在 IF
时钟 2:指令 A 在 ID,指令 B 在 IF
时钟 3:指令 A 在 EX,指令 B 在 ID,指令 C 在 IF

因此它主要提高的是单位时间完成的指令数,也就是吞吐率,而不是单条指令从进入到完成的延迟。

1. 从单周期切成五级

经典五级 MIPS 流水线:

级名称主要工作
IF / FInstruction Fetch用 PC 读 IM,计算 PC+4PC+4
ID / DInstruction Decode译码、读 RF、扩展立即数
EX / EExecuteALU 运算、有效地址或分支目标计算
MEM / MMemory读写 DM
WB / WWrite 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. 各类指令怎样经过五级

指令FDEMW
R 型取指读 rs/rtALU 运算空过写 rd
ori取指读 rs、扩展立即数ALU 运算空过写 rt
lw取指读基址算地址读 DM写 rt
sw取指读基址和待存值算地址写 DM空过
beq取指读比较对象比较/决定控制流空过空过

“空过”不代表指令可以随意跳级。为保持固定节拍,它仍占据相应流水位置,只是这一阶段没有状态更新。

5. 控制信号也要流水

控制器通常在 D 级按指令产生全部控制,再把信号按使用阶段分组:

  • E 级:ALU 运算、ALU 输入选择、目的寄存器选择;
  • M 级:DM 读写、分支相关控制;
  • W 级:RF 写使能、写回来源选择。

某信号在后级才使用,就必须随指令逐级保存。否则 D 级已经换成下一条指令,后级却会拿到下一条指令的控制,数据和策略彻底错位。

“单周期控制器能否直接搬过来”的答案是:译码思路可以复用,但控制信号不能直接跨几级拉长线使用,必须跟着对应指令流水。

6. 流水时空图

对没有暂停的 5 级流水线,四条指令的时空图为:

周期12345678
I1FDEMW
I2FDEMW
I3FDEMW
I4FDEMW

NN 条指令在理想 PP 级流水线中需要

P+N−1P+N-1

个周期。前 P−1P-1 个周期是在“灌满”,末尾还要“排空”;只有长程序中间段才接近每周期完成一条。

7. 流水线时钟周期

若各级组合延迟为 t1,t2,…,tPt_1,t_2,\ldots,t_P,级间寄存器开销为 tregt_{reg},则

Tpipe≥max⁡i(ti)+treg.T_{pipe}\ge\max_i(t_i)+t_{reg}.

不是把单周期延迟简单除以级数,因为:

  • 各级延迟通常不均衡;
  • 流水线寄存器有时钟到输出、建立时间等额外开销;
  • 更深的流水线还会增加冒险代价。

7.1 课件示例

课件给出五段延迟:IF 200 ps、ID 100 ps、EX 200 ps、MEM 200 ps、WB 100 ps,并暂不计流水寄存器开销。

  • 单周期最长路径为 200+100+200+200+100=800200+100+200+200+100=800 ps;
  • 流水线周期由最长一级决定,为 200 ps;
  • 理想情况下长程序吞吐率可接近单周期的 4 倍,而不是 5 倍,因为切分并不均匀。

8. 延迟、吞吐率、CPI 分开看

理想流水线:

CPIideal=1.CPI_{ideal}=1.

但单条指令要经历五个周期,其延迟约为 5Tpipe5T_{pipe}。如果 Tpipe=200T_{pipe}=200 ps,单条指令延迟约 1000 ps,甚至可能比单周期 800 ps 更长;系统仍然更快,因为灌满后每 200 ps 就能完成一条。

CPU 总时间仍是

TCPU=IC×CPI×Tclk.T_{CPU}=IC\times CPI\times T_{clk}.

流水线主要压缩 TclkT_{clk},但冒险会把 CPI 推到 1 以上。

9. 理想加速比为什么很难达到

若单周期被均匀切成 PP 级、没有寄存器开销、没有冒险且程序足够长,潜在加速比接近 PP。真实损失来自:

  • 各级不均衡;
  • 流水线寄存器开销;
  • 填充与排空;
  • 结构、数据、控制冒险造成的停顿;
  • 指令或 Cache 缺失带来的长延迟。

因此“流水级越多越快”并不成立。级越深,时钟可能越短,但需要更多寄存器,跨级依赖和错误路径清空的代价也更大。

10. 三种 CPU 模型对比

模型时钟周期CPI资源使用控制特点
单周期由最长指令决定1一条指令独占整条通路组合控制简单
多周期由最长步骤决定随指令变化一条指令可跨周期复用部件控制器需保存步骤状态
流水线由最长流水级决定理想 1,实际大于 1多条指令并行占不同级需处理冒险与级间控制

多周期与流水线都把长路径切段,但目的不同:多周期让同一条指令分时复用硬件,流水线让不同指令重叠占用各段。

11. 读流水线题的顺序

  1. 写清每级功能和结果何时可用;
  2. 画级间寄存器,列出必须随指令携带的信息;
  3. 再画时空图,不要只盯电路图;
  4. 区分“指令在哪一级”“结果在哪一级产生”“结果在哪一级被需要”;
  5. 最后才计算周期、CPI 与总时间。

下一讲处理流水线真正困难的部分:相邻指令之间不是互不相干的,它们会争资源、传数据、改变控制流。

评论