CPU 与流水线
CPU 是计算机的核心执行单元,负责取指、译码、执行与数据回写。本篇梳理 CPU 的组成、指令周期,并深入五级流水线及其冒险处理。
CPU 五大组件
ALU(算术逻辑单元):执行加减乘除、逻辑与或非、移位等运算。CU(控制单元):产生时序与控制信号,指挥各部件协同工作。寄存器组:高速存储,包括通用寄存器、PC、IR、PSW 等。时钟:周期性方波信号,决定指令步进的节拍。总线:数据/地址/控制总线,连接 CPU、主存与 I/O。
指令周期
一条指令经历 取指 → 译码 → 执行 → 访存 → 写回 五个阶段,各阶段占用一个时钟周期:
IF 取指: IR <- M[PC], PC <- PC + 4
ID 译码: 读寄存器, 译码 OP, 产生控制信号
EX 执行: ALU 计算 / 地址生成
MEM 访存: load/store 访问数据存储器
WB 写回: 结果写回寄存器堆
不同指令各阶段耗时不同,通常以最慢阶段作为时钟周期长度,限制了单周期 CPU 的性能上限。
五级流水线
将指令周期拆分,各阶段并行处理不同指令,理论 CPI 趋近 1:
周期 1 IF1
周期 2 IF2 ID1
周期 3 IF3 ID2 EX1
周期 4 IF4 ID3 EX2 MEM1
周期 5 IF5 ID4 EX3 MEM2 WB1
周期 6 IF6 ID5 EX4 MEM3 WB2
...
满载时每个周期完成一条指令,吞吐率提升约 5 倍。深度流水线(如 14 级、20 级)可进一步压低周期,但同时加剧冒险与功耗。
三类冒险与处理
结构冒险:硬件资源争用,如同时访存取指与读写数据。解决:哈佛结构(指令/数据 Cache 分离)。数据冒险:后续指令用到前序指令尚未写回的结果。解决:数据转发(forwarding) 从 EX/MEM 旁路到 EX 输入,或必要时插入 1 个气泡(stall)。控制冒险:分支/跳转改变 PC,后续已取指的指令作废。解决:延迟槽、分支预测(BTB、2-bit 饱和计数器)、动态预测器,或静态预测(默认向后跳转预测 taken)。
典型转发示例
add r1, r2, r3
sub r4, r1, r5 <- r1 来自上一条 ALU 结果,无需等待 WB
良好的转发与预测可让 CPI 接近 1,但预测失败与访存延迟仍是现代超标量 CPU 的主要性能瓶颈。