﻿# 核心内部三段式 + Uncore：CPU 芯片里的"计算区"与"总调度中心"

> 一颗 CPU 芯片里既有负责执行指令的"核心域"，也有为所有核心共享服务的"Uncore 域"。本文把核心的前端/执行引擎/内存子系统三段拆开，再讲 Uncore/System Agent 如何充当片上总调度中心。


> 关联：[cpu-bus-architecture.md](/concepts/cpu/cpu-bus-architecture.md)（总纲）、[cpu-microarch-overview.md](/concepts/microarch/cpu-microarch-overview.md)（单核怎么跑得快）、[cpu-out-of-order.md](/concepts/microarch/cpu-out-of-order.md)（乱序执行）、[cpu-physical-hierarchy.md](/concepts/cpu/cpu-physical-hierarchy.md)（物理层次）

---

## 一、核心内部三段式快览

一个现代高性能核心（Intel Golden Cove / AMD Zen 4）的宏观结构分三大段：

```plantuml
@startuml
skinparam shadowing false
skinparam rectangle {
  BackgroundColor<<front>> #E3F2FD
  BorderColor<<front>> #1976D2
  BackgroundColor<<exec>> #FFF9C4
  BorderColor<<exec>> #F9A825
  BackgroundColor<<mem>> #C8E6C9
  BorderColor<<mem>> #388E3C
}
rectangle "FRONTEND (前端)\n━━━━━━━━━━━━━━━━\n分支预测器 → 取指(32B/拍)\n→ 预译码(确定指令边界)\n→ 译码(4-6条/拍→μOPs)\n→ μOP Cache(已译码缓存)\n→ 分发队列" <<front>> as FE
rectangle "EXECUTION ENGINE (执行引擎)\n━━━━━━━━━━━━━━━━━━\n重命名+分配 → 发射队列\n→ 调度器(乱序挑选就绪 μOPs)\n→ 执行端口×N\n  Port0:ALU/FMA/Div\n  Port1:ALU/FMA\n  Port2:Load+AGU\n  Port3:Load+AGU\n  Port4:Store Data\n  Port5:ALU/Shuffle\n  Port6:ALU+Branch\n  Port7:Store AGU\n→ 重排序缓冲区(ROB)\n→ 顺序退休" <<exec>> as EXE
rectangle "MEMORY SUBSYSTEM (内存子系统)\n━━━━━━━━━━━━━━━━━━━━\nL1 I-Cache(32KB,8路)\nL1 D-Cache(48KB,12路)\n  ├─ Store Buffer\n  ├─ Load Buffer\n  └─ Line Fill Buffer\nL2 Cache(每核私有,1-2MB)\n  ├─ ITLB / DTLB L1\n  └─ STLB(统一 L2 TLB)\n→ 经片内互联 → L3/LLC" <<mem>> as MEM
FE -down-> EXE
EXE -down-> MEM
MEM --> FE : 取指(经 L1 I-Cache)
@enduml
```

### 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.md](/concepts/microarch/branch-prediction.md) 和 [i-cache.md](/concepts/cache/i-cache.md)。

### 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.md](/concepts/microarch/cpu-out-of-order.md)。

### 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.md](/concepts/cache/cache-organization.md) 和 [store-buffer.md](/concepts/memory-ordering/store-buffer.md)。

### 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 可以立即占满空闲端口。

```bash
线程 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）。

```plantuml
@startuml
skinparam shadowing false
skinparam rectangle {
  BackgroundColor<<core>> #E3F2FD
  BorderColor<<core>> #1976D2
  BackgroundColor<<uncore>> #FFF9C4
  BorderColor<<uncore>> #F9A825
  BackgroundColor<<ext>> #C8E6C9
  BorderColor<<ext>> #388E3C
}
rectangle "CORE 域\n━━━━━━━━\nCore 0~N\nL2(私有)" <<core>> as CORES
rectangle "LLC / L3\n最后一级缓存\n━━━━━━━━\n多 Bank 分布\n随 Core/Ring 切片" <<uncore>> as LLC
rectangle "System Agent\n━━━━━━━━━━━━━━━\n┌ IMC ×2-12\n│  (每个 IMC = 1-2 DDR 通道)\n│  地址映射/交错/调度\n├ PCIe Root Complex\n│  (CXL 控制器也在这一层)\n├ Power Control Unit\n│  (频率/电压/功耗管理)\n└ Display Engine\n   (消费级) / 多媒体引擎" <<uncore>> as SA
rectangle "外部接口\n━━━━━━\nDDR5 DIMMs\nPCIe Slots\nDMI → Chipset" <<ext>> as EXT
CORES <--> LLC : Ring/Mesh/IFOP
LLC <--> SA
SA --> EXT : DDR PHY / PCIe PHY / DMI
@enduml
```

### 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 域：数据怎么走

```bash
用户程序发起 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.md](/concepts/cpu/cpu-bus-architecture.md)（总纲）、[cpu-microarch-overview.md](/concepts/microarch/cpu-microarch-overview.md)（单核怎么跑得快）、[cpu-out-of-order.md](/concepts/microarch/cpu-out-of-order.md)（乱序执行）、[cpu-physical-hierarchy.md](/concepts/cpu/cpu-physical-hierarchy.md)（物理层次）、[on-die-interconnect.md](/concepts/cpu/on-die-interconnect.md)（片内互联）、memory-path.md（IMC/DDR 通路，待编写）*

