处理器体系结构:从指令流水线到多核芯片 / Processor Architecture from Instruction Pipelines to Multicore Chips
📅 创建时间:2026-07-20 🏷️ 标签:#CPU #体系结构 #流水线 #乱序执行 #多核 📚 前置知识:[[01-parallel-foundations]] 📚 相关知识:[[/02-systems-and-performance/02-computer-architecture-and-hardware/01-computer-architecture-basics]]
1. 一条指令怎样执行
处理器执行指令通常可以抽象为:
取指 → 译码 → 读取操作数 → 执行 → 访存 → 写回如果每条指令必须完整结束后才能开始下一条,大量硬件会处于空闲。因此处理器使用流水线,让多条指令处于不同阶段。
周期 1:指令 A 取指
周期 2:指令 A 译码,指令 B 取指
周期 3:指令 A 执行,指令 B 译码,指令 C 取指流水线提高吞吐,但不会等比例降低单条指令的延迟。
2. 指令级并行
现代 CPU 会在单个核心内部寻找互不依赖的指令并行执行。
超标量
一个周期可以发射多条指令到不同执行单元,例如整数单元、浮点单元和加载存储单元。
乱序执行
a = load(slow_address); // Cache Miss
b = x + y; // 与 a 无关
c = m * n; // 与 a 无关CPU 不必等待第一条加载结束,可以先执行后两条指令,最后按程序顺序提交结果。
分支预测
遇到 if 时,CPU 会预测执行路径并提前工作。预测错误后,错误路径的流水线结果必须丢弃。
这也是规则循环通常比大量不可预测分支更容易获得高性能的原因。
3. 从提高频率转向增加核心
早期处理器主要依赖提高时钟频率,但功耗近似受到频率和电压的共同影响:
动态功耗 ≈ 电容 × 电压² × 频率频率继续增长带来严重发热和能耗问题,行业转向:
- 多核 CPU
- 更宽的 SIMD
- 专用加速器
- 大规模 GPU
这意味着软件必须显式或隐式地利用并行,才能继续获得性能增长。
4. 核心、硬件线程与逻辑处理器
物理核心
拥有独立的执行资源,可以真正与其他核心并行。
同时多线程 SMT
一个物理核心维护多个硬件线程上下文。当一个线程等待数据时,另一个线程使用部分空闲执行资源。
8 核 16 线程 ≠ 16 个完整核心SMT 的收益依赖工作负载。两个都占满相同执行单元的线程可能互相竞争。
5. CPU、GPU 与专用加速器
| 特性 | CPU | GPU | NPU/TPU |
|---|---|---|---|
| 核心数量 | 少量复杂核心 | 大量较简单执行单元 | 大量矩阵/张量单元 |
| 控制能力 | 强 | 中等 | 较弱或领域限定 |
| 单线程延迟 | 低 | 较高 | 依任务而定 |
| 吞吐能力 | 中等 | 高 | 特定算子极高 |
| 适合任务 | 操作系统、业务逻辑、复杂分支 | 图形、矩阵、规则数据并行 | AI 推理与训练 |
CPU 花费大量晶体管降低单线程延迟,GPU 把更多面积用于执行单元以提升总吞吐。
6. 并行层次
一台现代计算机中同时存在多层并行:
多节点并行
└─ 单节点多处理器/多 GPU
└─ 多核并行
└─ SMT 硬件线程
└─ SIMD 向量并行
└─ 流水线与乱序执行高性能程序通常不是只选择其中一种,而是组合多层并行。例如 MPI 跨节点、OpenMP 跨 CPU 核、SIMD 处理核心内部的数据。
7. 峰值性能不等于应用性能
理论浮点峰值可以粗略表示为:
峰值 FLOPS = 核心数 × 频率 × 每周期浮点操作数但应用还受到以下因素限制:
- 数据是否在 Cache 中
- 指令是否能够并行发射
- 分支预测是否准确
- SIMD 通道是否充分利用
- 内存带宽是否足够
- 多核之间是否频繁同步
因此硬件参数是上限,不是性能承诺。
历史处理器阅读补充
本页保留合并前的处理器架构说明。
当前文章增加了前端、乱序、端口、SMT、NUMA、功耗和工具流程。
ISA 与微架构
ISA 是软件可见契约。 微架构是具体实现。
相同 ISA 可以有不同流水线、Cache 和功耗。
前端
前端负责:
- Fetch;
- Branch Prediction;
- Decode;
- uop Cache;
- 指令供给。
I-Cache、iTLB 和预测错误会限制后端。
乱序
乱序执行调度独立操作,隐藏部分延迟。
真实数据依赖仍然必须等待。
最终退休保持架构可观察顺序。
执行单元
不同指令使用整数、浮点、向量、Load/Store 和地址端口。
热点可能受吞吐、延迟或端口竞争限制。
分支
难预测分支会浪费错误路径工作。
无分支改写可能增加指令和内存,需要测量。
SIMD
SIMD 需要独立迭代、适合布局和可向量化操作。
更宽向量不自动线性加速。
Cache
Cache 以 Line 传输。
时间和空间局部性影响命中。
工作集超过容量后性能可能出现拐点。
一致性
共享写产生 Cache Line 所有权转移。
False Sharing 会让不同变量互相干扰。
TLB
TLB 缓存页表转换。
大工作集与随机访问可能增加 TLB Miss。
Huge Page 有收益和部署代价。
SMT
SMT 共享核心资源。
一个线程等待时可能利用空闲槽位,也可能和另一个线程竞争。
NUMA
本地与远端内存延迟不同。
首次触碰、亲和性和分片影响数据位置。
功耗
频率随核心、温度、向量指令和功耗变化。
短时 Boost 不能代表稳态任务。
虚拟化边界
虚拟机可能限制 PMU、NUMA 和频率可见性。
容器配额会增加 Runnable 等待。
指标解释
IPC 低可能来自:
- 前端;
- 分支;
- 内存;
- 依赖;
- 端口。
IPC 高也不证明端到端快。
Profile 顺序
benchmark
-> hotspot
-> pipeline category
-> source and assembly
-> one experiment
-> repeat工具
- WPA CPU Sampled/Precise;
- VTune Hotspots;
- VTune Microarchitecture;
- VTune Memory Access;
- Linux Perf;
- 编译器向量化报告;
- 汇编分析。
实验矩阵
- 分支规律;
- 依赖链;
- SIMD;
- 工作集;
- False Sharing;
- SMT;
- NUMA;
- 亲和性;
- 频率;
- 不同编译器。
历史参数边界
处理器事件和阈值随微架构变化。
旧型号的 Cache、端口和计数器不能直接外推。
引用历史数字时保留 CPU、编译器、输入和命令。
当前课程映射
当前版本补充:
- 前端供给;
- 乱序和端口;
- Cache 一致性;
- SMT/NUMA;
- 功耗与虚拟化;
- 工具与实验;
- 完成标准。
阅读完成标准
读者应能:
- 区分 ISA 和微架构;
- 解释前端与后端;
- 找依赖和分支成本;
- 判断 SIMD;
- 解释 Cache/TLB;
- 评估 SMT/NUMA;
- 选择 Profile 工具;
- 限定历史结论。
归档复现实验记录
复现旧处理器实验时记录:
- 来源提交;
- CPU 型号;
- 微码;
- 操作系统;
- 编译器;
- 优化选项;
- 输入;
- 线程亲和性;
- 电源计划;
- 预热;
- 样本;
- PMU 事件;
- 原始结果;
- 正确性;
- 当前差异。
工具无法提供相同事件时,使用当前等价指标并明确映射限制。
核心总结
- 单核内部已经包含流水线、乱序执行和 SIMD 等并行机制。
- 多核是功耗墙之后性能增长的主要方向。
- CPU 追求低延迟和通用性,GPU 追求高吞吐。
- 真正的并行程序往往同时利用多个体系结构层次。
下一篇:[[03-cpu-parallelism]]