关键词:Scalable Data Fabric (SDF)、CAKE、IFOP、IFIS/xGMI、GMI、全互联 mesh、中心交换
适用范围:Zen 1 ~ Zen 4 (EPYC) 及 Instinct MI300 系列 GPU
1. 总览:Infinity Fabric = 数据面 + 控制面
AMD 自 Zen 架构(2017)起,将片内/片间互连统一为 Infinity Fabric,它由两个逻辑平面组成:
| 平面 | 名称 | 职责 |
|---|---|---|
| SDF(Scalable Data Fabric) | 可扩展数据面 | 承载数据流量 :核心、缓存、内存控制器、I/O、die 间/插槽间链路之间的一致性访存与 I/O 传输。协议上是 HyperTransport 的超集,拓扑无关(总线、星型、mesh 皆可) |
| SCF(Scalable Control Fabric) | 可扩展控制面 | 承载控制信号:SMU 电源/温度管理、PSP 安全、测试、配置。有自己专用的片间 SerDes,可跨 die/跨插槽互通 |
通常所说的 Data Fabric 即 SDF 。它的"全互联"(any-to-any)能力是通过三级结构 实现的:die 内一致性数据面 → 封装内 IFOP 直连 mesh → 插槽间 IFIS/xGMI。
2. 第一级:Die 内的一致性数据面
以 Zen 1 的 Zeppelin die(EPYC 7001 "Naples" 的基本单元)为例,SDF 在 die 内挂接约 11 个端口:
┌───────────────────── Zeppelin Die (Zen 1) ─────────────────────┐
│ │
│ ┌───────────┐ ┌───────────┐ ┌───────────┐ ┌────────────────┐ │
│ │ CCX 0 │ │ CCX 1 │ │ UMC ×2 │ │ IOMS → I/O Hub │ │
│ │ 4核+8MB L3│ │ 4核+8MB L3│ │ DDR4 2通道│ │ PCIe/SATA/USB │ │
│ └─────┬─────┘ └─────┬─────┘ └─────┬─────┘ └──────┬─────────┘ │
│ │ CCM │ CCM │ │ │
│ ═══════╧═════════════╧═════════════╧══════════════╧═══════════ │
│ SDF 一致性数据面(全 die 运行在 MEMCLK 时钟域, │
│ 如 DDR4-2666 时 = 1333 MHz,避免跨时钟域延迟) │
│ ═══╤══════╤══════╤══════╤══════╤══════╤═══════════════════════ │
│ CAKE CAKE CAKE CAKE CAKE CAKE │
│ IFOP0 IFOP1 IFOP2 IFOP3 IFIS0 IFIS1 │
└────┬──────┬──────┬──────┬──────┬──────┬────────────────────────┘
└──┬───┘ └──┬───┘ └──┬───┘
封装内 die 间 封装内 die 间 插槽间(与 PCIe 引脚复用)
关键组件:
- CCM(Cache-Coherent Master)端口:每个 CCX 经一个 CCM 接入 SDF,发起一致性请求;
- UMC(统一内存控制器):每个 DDR4 通道一个,直接挂 SDF;
- IOMS:通向 I/O Hub(PCIe 控制器、SATA、南桥)的主/从端口。只有 CCM 和 IOMS 能发起 DRAM 请求;
- CAKE(Coherent AMD socKet Extender) :SDF 与物理链路之间的"关口",把一致性请求打包成 128-bit 包串行化送上 SerDes。Zeppelin 有 6 个 CAKE:4 个对接 IFOP(封装内),2 个对接 IFIS(插槽间)。
可见 Data Fabric 在 die 内就把"计算、内存、I/O、对外链路"统一挂到同一个一致性数据面上------这是全互联的基础:对外的每一条链路(CAKE 端口)天然就是 SDF 的一个节点,片外访问与片内访问走同一套协议,无需协议转换。
3. 第二级:封装内 die 间 ------ IFOP 全直连 mesh
Naples(EPYC 7001)在 SP3 封装内集成 4 个 Zeppelin die(其中两个旋转 180° 放置)。每个 die 用自己的 IFOP 链路直连其余 3 个 die,构成完全图 K4:
Die 0 ═══════════ Die 1
║ ╲ ╱ ║
║ ╲ ╱ ║
║ ╲ ╱ ║
║ ╲ ╱ ║
║ ╳ ║ ═ = IFOP 直连
║ ╱ ╲ ║ 每 die 3 条出链路
║ ╱ ╲ ║ 全封装共 6 条 = K4
║ ╱ ╲ ║ 任意两 die 一跳直达
║ ╱ ╲ ║
Die 3 ═══════════ Die 2
这就是 Naples "全互联"的字面体现:任意两个 die 之间都有物理直连链路,跨 die 访问严格 1 跳。每 die 贡献 2 通道 DDR4,全插槽 8 通道,4 个 NUMA 节点。
链路指标(DDR4-2666,即 SDF @ 1333 MHz):
| 指标 | 数值 |
|---|---|
| 单条 IFOP 带宽 | 16 B/clk/方向 ≈ 42.7 GB/s(双向),~2 pJ/b,短距单端信号 |
| 4-die 封装剖分带宽 | 170.7 GB/s |
| 延迟 | 本地内存 ~90 ns,跨 die ~145 ns |
两个工程细节:
- Zeppelin 实际放了 4 个 IFOP SerDes,全互联只需 3 条------第 4 条是为了把封装基板布线压缩到 4 层而加的冗余;
- Threadripper(2 die)则把每 die 的 2 条 IFOP 并联使用,die 间带宽翻倍到 85.3 GB/s------说明 IFOP 数量是灵活的 die 间资源,可按产品裁剪。
4. 第三级:插槽间 ------ IFIS / xGMI
每个 Zeppelin 还有 2 个 IFIS SerDes(x16 差分,与 PCIe Gen3 引脚复用,~11 pJ/b)。2P 配置下:
Socket 0 Socket 1
┌───────────────┐ ┌───────────────┐
│ Die0 ══ Die1 │═══╗ ╔═══│ Die0 ══ Die1 │
│ ║ ╲ ╱ ║ │ ║ IFIS ×16 ║ │ ║ ╲ ╱ ║ │
│ Die3 ══ Die2 │═══╬════ (×4 条) ══════╬═══│ Die3 ══ Die2 │
│ (K4 mesh) │═══╝ ╚═══│ (K4 mesh) │
└───────────────┘ └───────────────┘
- 共 4 条 IFIS 链路 连接两颗 CPU(每 die 出一条),单条 37.9 GB/s,插槽间剖分 151.7 GB/s;
- 代价:IFIS 占用 PCIe 引脚,2P 下每插槽 PCIe 从 128 条减为 64 条;
- 跨插槽访问最坏 2 跳(1 次 IFIS 跨插槽 + 对端封装内至多 1 次 IFOP),延迟 ~200 ns。
至此,Zen 1 时代 Data Fabric 用 die 内一致性面 + 封装内 K4 mesh + 插槽间 xGMI 实现了从核到远端内存的全域 any-to-any。
5. 演进:Zen 2 起改用"中心交换"实现全互联
K4 mesh 在 4 个 die 时很优雅,但存在硬约束:mesh 链路数随 die 数 O(n²) 增长、SerDes 占 die 面积、且内存控制器分散在各 die 导致 NUMA 效应显著。因此 Zen 2(EPYC 7002 "Rome")把全互联从"全直连 mesh"改为"星型中心交换":
┌────────────────────────────────┐
CCD0 ─GMI2──► │ 服务器 IOD (14/12nm) │
CCD1 ─GMI2──► │ ┌──────────────────────────┐ │
... │ │ SDF 交换枢纽: │ │
CCD7 ─GMI2──► │ │ · 8× GMI2 端口(接 CCD) │ │
│ │ · 8× DDR4 通道 (UMC 内置) │ │
│ │ · 128× PCIe Gen4 │ │
│ │ · 3~4× xGMI2 (2P 互连) │ │
│ └──────────────────────────┘ │
└───────────────┬────────────────┘
│ xGMI2 ×3~4(各 x16)
┌───────────────┴────────────────┐
│ 对端 IOD(2P 插槽) │
└────────────────────────────────┘
- 8 个 CCD(每 CCD 2×CCX,纯计算)互不连接 ,各经一条 GMI2(基于 IFOP,32 B 读 + 16 B 写 / FCLK)接到中央 IOD;
- 内存控制器集中到 IOD:任意 CCD 到任意内存通道都是"CCD→IOD→UMC"两跳,延迟大幅均一化(削弱了 Naples 的 NUMA 痛点);
- 逻辑上仍是全互联------any-to-any 由 IOD 内部交换枢纽集中提供,物理拓扑从 mesh 变星型,用"固定 2 跳"换取 die 数量从 4 扩展到 8(Zen 4 达 12);
- Infinity Fabric 2 的 SerDes 提到 25 GT/s(约为 Zen 1 的 2.3 倍),且 FCLK 与内存 MCLK 解耦;2P 用 3~4 条 xGMI2(用 3 条时可释放引脚,PCIe 增至 160 条)。
后续各代的关键变化:
| 代际 | Data Fabric 相关变化 |
|---|---|
| Zen 3 (Milan) | CCD 内合并为单一 8 核 CCX(32 MB L3 一体共享),CCD 内不再跨 CCX;IOD/拓扑沿用 Rome |
| Zen 4 (Genoa) | 最多 12 CCD,IOD 提供 12 个 GMI3 连接 + 12 通道 DDR5 + PCIe Gen5/CXL;≤4 CCD 的型号可给每 CCD 绑定双接口;2P xGMI3 走 PCIe Gen5 PHY,4 条 x16 理论 512 GB/s |
| Instinct MI300/MI350 (GPU) | 8 个 XCD 互不直连 ,全部经 Infinity Fabric 接到 IOD(IOD 内含 256 MB MALL/Infinity Cache 与 HBM 控制器)------与 Rome 相同的"中心交换式全互联"思路;整机层面每 GPU 出 7 条 ×128 GB/s IF 链路,构成 8 卡全互联 mesh(K8,聚合 896 GB/s) |
6. 小结:Data Fabric 实现全互联的设计哲学
- 协议统一:SDF 一套一致性协议贯穿 die 内、封装内、插槽间,CAKE/GMI/xGMI 只是不同距离、不同功耗预算(2 → 11 pJ/b)下的物理层适配;
- 小规模全直连:4 die 以内用 IFOP 构成完全图,一跳直达、带宽剖分最大化(Naples K4、Threadripper 双链路、8 GPU K8 mesh 均属此类);
- 大规模中心交换 :die 数增多后改用中央 IOD 星型交换,把 O(n²) 的连线复杂度收敛为 O(n),同时集中内存控制器以均一化延迟------"全互联"从物理直连演变为逻辑上的 any-to-any;
- 代价可见:每一跳都有明确的延迟/带宽标签(90 → 145 → 200 ns),这也是 Fleet 这类芯粒感知软件需要显式管理数据局部性的根本原因。
附:链路带宽速查表
| 链路 | 带宽 | 说明 |
|---|---|---|
| Zen 1 IFOP(die↔die) | 42.7 GB/s/条 | 16 B/clk/方向 @ 1333 MHz,~2 pJ/b |
| Naples 4-die 封装剖分 | 170.7 GB/s | K4 mesh,6 条 IFOP |
| Zen 1 IFIS(插槽↔插槽) | 37.9 GB/s/条 | x16 差分,与 PCIe Gen3 复用,~11 pJ/b |
| Naples 2P 插槽间剖分 | 151.7 GB/s | 4 条 IFIS |
| Threadripper 2-die | 85.3 GB/s | 每 die 双 IFOP 并联 |
| Zen 2 GMI2(CCD↔IOD) | 32 B 读 + 16 B 写 / FCLK | SerDes 25 GT/s(2.3× Zen 1) |
| Rome 2P xGMI2 | 3~4 条 × x16 | 3 条时 PCIe 增至 160 条 |
| Genoa 2P xGMI3 | 4 条 × x16 ≈ 512 GB/s | 走 PCIe Gen5 PHY |
| MI300X GPU↔GPU | 128 GB/s/条 × 7 = 896 GB/s | 8 卡 K8 全互联 |