核心内部三段式 + Uncore:CPU 芯片里的"计算区"与"总调度中心"
一颗 CPU 芯片里既有负责执行指令的"核心域",也有为所有核心共享服务的"Uncore 域"。本文把核心的前端/执行引擎/内存子系统三段拆开,再讲 Uncore/System Agent 如何充当片上总调度中心。
关联:cpu-bus-architecture(导读)、cpu-microarch-overview(单核怎么跑得快)、cpu-out-of-order(乱序执行)、cpu-physical-hierarchy(物理层次)
一、核心内部三段式快览
一个现代高性能核心(Intel Golden Cove / AMD Zen 4)的宏观结构分三大段:
1.1 Frontend(前端):把指令喂给执行引擎
前端的核心任务是从内存中取出指令,翻译成 CPU 能调度的微操作(μOP),并以足够快的速度填满执行引擎的流水线。
| 部件 | 作用 | 关键数字(Golden Cove / Zen 4) |
|---|---|---|
| 分支预测器 | 提前猜下一条指令地址,避免等取指 | 数 KB 级历史表、TAGE 算法 |
| 取指单元 | 按预测地址取指令 | 32B/拍 |
| 预译码 | 确定 x86 变长指令边界 | 4-6 条/拍 |
| 译码器 | x86 指令 → μOPs | 6 条/拍(Intel)/ 4 条/拍(AMD) |
| μOP Cache | 缓存已译码指令,省译码功耗 | 4K μOPs(Intel)/ 6.75K μOPs(AMD) |
前端的瓶颈常表现为"指令吞吐低、IPC 上不去",尤其是分支预测命中率差或代码体积大导致 μOP Cache 装不下时。详见 branch-prediction 和 i-cache。
1.2 Execution Engine(执行引擎):乱序执行的心脏
执行引擎负责把 μOP 分配到各种执行端口,乱序执行、按序退休。
| 部件 | 作用 | 关键数字(Golden Cove / Zen 4) |
|---|---|---|
| Register Rename / Allocation | 把架构寄存器重命名到物理寄存器,消除 WAW/WAR 依赖 | 数百个物理寄存器 |
| Reservation Station / 调度器 | 等 μOP 操作数就绪后发射到执行端口 | Intel 12 端口 / AMD 整数 8 + 浮点 6 |
| Execution Ports | 实际执行:ALU、FMA、Load/Store、Branch 等 | 见上图 |
| ROB | 重排序缓冲区,保证按程序顺序退休 | 512 entries(Intel)/ 320 entries(AMD) |
执行引擎的瓶颈常表现为"端口争用"——比如整数计算和 Load/Store 都集中在同一组端口,或者 ROB 满导致前端无法继续取指。详见 cpu-out-of-order。
1.3 Memory Subsystem(内存子系统):离数据最近的三层缓存
内存子系统负责从 L1/L2 缓存到片内互联/LLC 的所有数据通路。
| 部件 | 作用 | 关键数字(Golden Cove / Zen 4) |
|---|---|---|
| L1 I-Cache | 指令缓存 | 32KB, 8-way |
| L1 D-Cache | 数据缓存 | 48KB, 12-way(Intel)/ 32KB, 8-way(AMD) |
| Store Buffer | 暂存写操作,允许写合并和乱序 retirement | 几十 entries |
| Load Buffer | 跟踪未完成的 Load | 几十 entries |
| L2 Cache | 每核私有二级缓存 | 2MB(Intel P-core)/ 1MB(AMD) |
| TLB | 虚拟地址→物理地址缓存 | L1 ITLB/DTLB + L2 STLB |
L1/L2 的命中延迟只有 4-14 个周期,是所有内存访问中最快的。一旦 L2 miss,就要走片内互联到 L3/LLC,延迟从十几个周期跳到 40-50 个周期。详见 cache-organization 和 store-buffer。
1.4 三段的关键数字
| 部件 | Golden Cove (Raptor Lake) | Zen 4 |
|---|---|---|
| 译码宽度 | 6 条/拍(1 复杂 + 5 简单) | 4 条/拍 |
| μOP Cache | 4K μOPs | 6.75K μOPs |
| 发射宽度 | 8 μOPs/拍 | 6 μOPs/拍(整数)+ 6 μOPs/拍(浮点) |
| 执行端口 | 12 个 | 整数 8 + 浮点 6 |
| ROB | 512 entries | 320 entries |
| L1 D-Cache | 48KB, 12-way | 32KB, 8-way |
| L2 Cache | 2MB (per P-core), 16-way | 1MB (per core), 8-way |
二、SMT / 超线程:一套执行引擎喂两个线程
SMT(Simultaneous Multithreading)的核心思想:复制前端资源(取指/译码),共享执行引擎和缓存。当线程 A 因缓存 miss 等数据时,线程 B 的 μOPs 可以立即占满空闲端口。
线程 A 的架构状态 线程 B 的架构状态
(寄存器/RIP) (寄存器/RIP)
↓ ↓
┌────┴───────────────────────┴────┐
│ 共享: 译码器(分时) │
│ 共享: μOP Cache │
│ 共享: 发射队列/调度器(竞争) │
│ 共享: 执行端口 × N │
│ 共享: L1/L2/L3 Cache │
│ 共享: TLB │
└─────────────────────────────────┘
↓
片内互联 → L3/IMC| SMT 共享 | SMT 不共享 |
|---|---|
| 执行端口、发射队列、ROB | 架构寄存器(RIP/RSP/RAX...) |
| L1 I/D-Cache、L2、TLB | ITLB/DTLB 部分条目(有些实现有线程 tag) |
| 译码器(分时切换) | 分支预测器的部分历史表 |
| 片内互联接口 |
性能含义:SMT 对"一个线程满载核心"的场景没有帮助(甚至有轻微损耗——共享容量被分割)。但对"多个线程频繁等内存/等 cache miss"的场景可以大幅提升吞吐——A 线程 stall 时 B 线程立即顶上,让原本空闲的端口不再浪费。
三、Uncore / System Agent —— CPU 的"总调度中心"
3.1 什么是 Uncore
Uncore = 片上不属于任何核心但所有核心共享的部分。在 Intel 叫 Uncore 或 System Agent,在 AMD 叫 IOD(IO Die)。
3.2 Uncore 里有什么
| 部件 | 作用 | 是否属于 Uncore |
|---|---|---|
| LLC / L3 | 最后一级缓存,所有核心共享 | 是 |
| IMC | 集成内存控制器,把内存请求转成 DDR 命令 | 是 |
| PCIe Root Complex | PCIe 树的根,桥接 CPU 内存空间和 PCIe 地址空间 | 是 |
| CXL 控制器 | 处理 CXL 协议 | 是 |
| IOMMU | IO 虚拟地址翻译 | 是(常集成在 RC 或 SA 内) |
| Power Control Unit (PCU) | 频率、电压、功耗管理 | 是 |
| Display Engine / Media | 消费级集成显卡/视频编解码 | 是 |
3.3 Uncore 在三种架构中的位置
| Intel 单片 (Raptor Lake) | Intel Mesh (Sapphire Rapids) | AMD Chiplet (Genoa) | |
|---|---|---|---|
| LLC 位置 | Ring 每个 stop 挂一段 L3 slice,所有 slice 逻辑上统一 | 每个 Mesh 节点挂一段 L3 slice | L3 在 CCD 内(每个 CCD 独立的 32MB),跨 CCD 不共享 |
| IMC 位置 | System Agent 内(Ring 上的一站 / 独立连接到 Ring) | 散布在 Mesh 网格边缘的几个节点 | 集中在 IOD 内 |
| PCIe RC | System Agent 内 | 散布在 Mesh 网格边缘 | 集中在 IOD 内 |
| 核间延迟 | Ring 跳数 | Mesh 行/列跳数 | 同 CCD:低;跨 CCD:过 IOD,高 |
关键差异:Intel 单片方案中 LLC 跨所有核统一、内核间延迟更低;AMD Chiplet 方案中 LLC 是分片的(每个 CCD 自己一个 L3),跨 CCD 访问要走 IOD 中转,不是统一 LLC。这在某些场景下形成鲜明的性能差异——比如跨 CCD 共享数据比 Ring Bus 方案多出几十纳秒的延迟。
四、核心域 vs Uncore 域:数据怎么走
用户程序发起 Load
↓
L1 D-Cache (命中: 4-5 cycles)
↓
L2 Cache (命中: 12-14 cycles)
↓
L3/LLC (命中: 40-50 cycles) ← 第一次进入"Uncore 域"
↓
IMC → DDR (70-100ns) ← 完全在 Uncore 内完成, 不需要核心参与
如果目标是外设:
L3/LLC
↓
PCIe Root Complex → PCIe 设备 (DMA) ← 也在 Uncore 内完成关键 insight:核心只负责执行指令和访问 L1/L2;L3 及以下所有内存、IO 访问都交给 Uncore。Uncore 的延迟和带宽,决定了 CPU 与内存/外设/其他 CPU 通信的速度。
五、一句话总结
核心内部是"前端→执行引擎→内存子系统"三段式流水线,负责把指令变成结果;核心外部是 Uncore/System Agent,负责把结果从核心送到内存、外设和其他 CPU。软件优化要同时看两端:核心内看 IPC 和缓存命中率,核心外看 LLC、IMC、PCIe 和 NUMA 拓扑。
关联:cpu-bus-architecture(导读)、cpu-microarch-overview(单核怎么跑得快)、cpu-out-of-order(乱序执行)、cpu-physical-hierarchy(物理层次)、on-die-interconnect(片内互联)、memory-path.md(IMC/DDR 通路,待编写)