跳至正文

cpu-与流水线


CPU 与流水线

核心定义

CPU 是 指令系统 的执行核心,负责 取指、译码、执行、访存、写回 五阶段。流水线 是把一条指令的执行过程拆分为多个阶段,使不同指令在不同阶段并行推进,从而提高 吞吐率 的技术。流水线优化的目标不是让单条指令更短,而是让 单位时间内完成更多指令

考研常考 CPI、吞吐率、加速比、冒险处理、分支预测 。CPI 是 每条指令平均所需时钟周期数 。理想流水线 CPI = 1 ;实际 CPI = 理想 CPI + 冒险带来的停顿周期

加速比=非流水执行时间流水执行时间\text{加速比} = \dfrac{\text{非流水执行时间}}{\text{流水执行时间}} 吞吐率=指令条数总执行时间\text{吞吐率} = \dfrac{\text{指令条数}}{\text{总执行时间}} CPI=总周期数指令条数\text{CPI} = \dfrac{\text{总周期数}}{\text{指令条数}}
flowchart LR IF["取指 IF"] --> ID["译码 ID"] ID --> EX["执行 EX"] EX --> MEM["访存 MEM"] MEM --> WB["写回 WB"]

CPU 的硬件组成

CPU = 运算器 + 控制器

部件组成职责
运算器ALU(核心)、累加器 ACC、通用寄存器、状态寄存器 PSW算术运算 + 逻辑运算
控制器PC、IR、CU、MAR、MDR取指、译码、发控制信号

关键寄存器职能(高频考点,极易混淆):

  • PC(程序计数器):下一条要执行的指令地址——指向”未来”,自动加 1。
  • IR(指令寄存器):当前正在执行的指令本身(操作码 + 地址码)——掌握”现在”。
  • MAR(地址寄存器):访存地址暂存,位数 = 可寻址存储单元个数(n 位 → 2n2^n 个)。
  • MDR(数据寄存器):访存数据暂存,位数 = 存储字长。

取指周期结束的标志:指令存入 IR,同时 PC 已加 1 指向下一条。

🚫 归属陷阱地址译码器属于主存(把 MAR 的地址转成字线片选信号),不在 CPU 内;指令译码器 ID 才在 CPU 控制器里。“译码”看前缀:指令译码→CPU,地址译码→主存

冯·诺依曼架构与指令周期

指令和数据都以 二进制形式存于同一存储器,CPU 靠 指令周期的不同阶段 区分二者(而非操作码译码、寻址方式或存储单元):

  • 取指周期:读出的二进制送入 IR,当指令解释。
  • 执行周期:读出的二进制送入 MDR / 通用寄存器,当数据运算。

指令周期 = 取指 + 间址 + 执行 + 中断 四子周期。

🚫 因果倒置:不能选”靠操作码译码结果区分”——必须先知道是指令才能译码,那是”马后炮”。内存里全是 0/1 没有标签,只能靠 时间节拍 区分。

控制器:硬布线 vs 微程序

方式实现特点
硬布线控制纯组合逻辑电路速度快,不灵活
微程序控制一条机器指令拆成 微指令序列,存于 控制存储器(ROM)灵活,较慢

🚫 微程序不是纯硬件:它是存在控制存储器里的 代码,属 固件 Firmware(软硬交界面)。看到”微程序/微指令”立刻打”固件”标签。

性能指标体系

指标含义
CPI一条指令的平均时钟周期数 = 总周期数 / 指令条数
IPC每周期执行指令数 = 1 / CPI(超标量多发射中 IPC > 1)
MIPS每秒百万条指令
字长一次处理的二进制位数,越长精度越高

摩尔定律:价格不变时元器件数约每 18-24 个月翻倍、性能翻倍。但受 量子隧穿效应 等物理极限制约,不可能一直遵循——题干出现”一直/永远”几乎必错。

关键细节 / 操作步骤

  1. 第一步:先识别题目是在问 流水线结构 还是 性能计算
  2. 第二步:若是结构题,写出五阶段:取指(IF)→ 译码(ID)→ 执行(EX)→ 访存(MEM)→ 写回(WB)
  3. 第三步:若是冒险题,先区分三大类:结构冒险 (争用 同一硬件资源 )、数据冒险 (指令间 数据依赖 )、控制冒险 (分支方向 未确定 )。
  4. 第四步:若是数据冒险,优先看 前递(转发) 与 暂停(插入气泡) 。RAW(读后写)是最常见的数据冒险。
  5. 第五步:若是控制冒险,优先看 分支预测 与 延迟槽 。预测准确率直接影响 流水线停顿频率
  6. 第六步:若是结构冒险,检查是否有 资源冲突 ,解决方法是 增加资源副本或插入停顿
  7. 第七步:若是性能题,流水线时钟周期由 最长阶段 决定。
  8. 第八步:kk 段流水线执行 nn 条指令的理想时间 = (k+n1)×Δt(k + n - 1) \times \Delta t
  9. 第九步:若题目问”为什么不能无限加深流水线”,原因是 启动开销增大、阶段失衡、控制复杂度上升
  10. 第十步:若题目问多发射(超标量),它和流水线的区别是:流水线强调 阶段重叠 ,多发射强调 同一周期发射多条指令

⚠️ 易错辨析

流水线提升的是 吞吐率 ,不等于所有情况下都降低单条指令延迟。若冒险频繁,气泡会抵消并行收益。反例:分支预测失败时,已进入流水线的指令需要清空,实际 CPI 反而可能接近或超过非流水。 5 段流水不是固定铁律,关键在于 题目给出的阶段划分 ;不同教材可能在访存和写回上有不同表述。 控制冒险不是”程序错了”,而是 分支方向未定导致后续指令可能白做 ,需要冲刷或预测。 数据冒险不一定靠重排解决,有时必须 暂停 ;具体处理取决于 依赖关系和硬件支持 。反例:ADD R1,R2,R3; SUB R4,R1,R5 中 R1 的 RAW 依赖必须等 ADD 写回或前递。 “前递的作用”是 减少等待周期、缓解数据冒险 ,但不能解决所有数据冒险(如访存结果未返回时)。

💡 技巧与口诀 口诀:看结构先五段,看冲突分三类(结/数/控),看性能算吞吐(CPI×周期=时间);冒险三对策:前递、暂停、预测 。 应用场景:题目一旦给出”多条指令同时执行”或”分段重叠”,就优先往流水线模型上靠。先判断是否有冒险,再谈加速比;没有这一步,计算常会 漏掉停顿周期 。性能计算时先把 理想情况和实际情况分开 ,再把停顿周期补回去。

📝 真题闭环 题目:某 5 段流水线(IF/ID/EX/MEM/WB),每段耗时分别为 80ns、70ns、90ns、80ns、70ns。现连续执行 10 条指令,其中第 3 条指令与第 5 条指令分别引起 1 个和 2 个时钟周期的停顿。求实际吞吐率和加速比。 解题思路: 答案:实际吞吐率约 6.54×1036.54 \times 10^{-3} 条/ns ,加速比约 2.55

时钟周期由最长阶段决定:Δt\Delta t = 90ns 。 理想流水执行时间 = (5+101)×90=1260ns(5 + 10 - 1) \times 90 = 1260\text{ns} 。 实际停顿周期 = 1+2=31 + 2 = 3 个 → 实际时间 = 1260+3×90=1530ns1260 + 3 \times 90 = 1530\text{ns} 。 非流水执行时间 = 10×(80+70+90+80+70)=10×390=3900ns10 \times (80+70+90+80+70) = 10 \times 390 = 3900\text{ns} 。 实际吞吐率 = 10/1530ns6.54×10310 / 1530\text{ns} \approx 6.54 \times 10^{-3} 条/ns 。 加速比 = 3900/15302.553900 / 1530 \approx 2.55


cd ..