title: cpu2dpu 拓扑演变
created: 2026-09-03
updated: 2026-09-03
type: entity
tags: [topology, cpu, numa, pcie, dpu, smartnic, nvlink, cxl, clos, entity]
sources:
- raw/scripts/0cpu.sh
- raw/scripts/0网络.sh
- raw/scripts/sysinfo.sh
- raw/articles/cpu2dpu.md


cpu2dpu 拓扑演变

拓扑决定数据通路:CPU 核怎么共享缓存、内存怎么跨 NUMA 访问、外设挂在哪条 PCIe 树上、DPU 卸载的流量从哪进哪出。本文前半部分解析 raw/articles/cpu2dpu.md(从 CPU 拓扑到 DPU 拓扑:引出 NVLink 与 CXL)的演进主线,后半部分为实操查看命令与拓扑感知调优。

核心主线:CPU 曾是世界的中心,一切设备挂在它的树上;东西向流量打碎了金字塔;数据中心用 CLOS 把网络压扁;DPU 把网络边界推进到主机内部;NVLink 与 CXL 再把主机内部的树压扁——金字塔在所有尺度上让位于「矩阵 + 弹性池」


原理篇

1. CPU 拓扑:以 CPU 为中心的世界

核内

封装内:Mesh 互联 + 三个出口

[C0][C1][C2] ...... [C63]
  |   |   |            |
═══╪═══╪═══╪═══ Mesh 互联 ═══(旧架构 Ring,今多 Mesh)
  |   |   |            |
[LLC 切成 N 片,逻辑上全体共享]  ~50周期
───────────────────────────────
IMC(8~12通道)   PCIe RC(80~128 lanes)   UPI
   ▼                 ▼                   ▼
DDR5 内存      GPU / DPU / NVMe       另一颗 CPU

要点:L3 是「分布式共享」(物理切片、逻辑统一,MESI 在 Mesh 上维护一致性);IMC、PCIe RC、UPI 三个出口决定了 CPU 能连什么。

多路服务器:NUMA

访问目标 延迟 带宽
本地内存 ~90ns DDR5 全带宽
对端内存(过 UPI) ~140~190ns 减半

Chiplet(AMD EPYC / 新至强)

L3 只在 CCD 内共享;双路互联(xGMI)走两颗 IOD 之间。软件看到的仍是两棵 NUMA 树,chiplet 是对 OS 透明的实现细节。

小结:CPU 拓扑 = 一棵树

层级 技术 典型带宽 延迟量级
核 ↔ L3 片内 Mesh / IF TB/s 级 ~10ns
CPU ↔ 内存 DDR5 × 8~12 通道 ~38GB/s/通道 ~90ns
CPU ↔ CPU UPI / xGMI xGMI ≈ 2× UPI 跨 NUMA +40~60ns
CPU ↔ GPU/DPU PCIe 5.0 x16 ~64GB/s ~100ns+
GPU ↔ GPU NVLink 900GB/s (H100 双向)

核心观察:单路是一棵树,双路是 NUMA 森林——所有东西向通信都必须先爬到 CPU 这个「根」。

2. 树的缺陷:结构性病因

树的隐含假设是流量以南北向为主;一旦流量变东西向(微服务 RPC、分布式存储副本、AI all-reduce、存算分离),缺陷全部暴露:

# 缺陷 根源
1 根拥塞/收敛比(48×25G 下行 vs 2×100G 上行 → 6:1) 越往上总带宽越窄
2 对分带宽小(两半通信容量被根锁死) 切面必经根
3 故障域放大(坏核心 = 全网瘫痪) 越高越关键、越贵
4 先上后下(跨子树 5 跳 vs 同层 1 跳) 路径必经共同祖先
5 路径唯一,无 ECMP;冗余链路被 STP 阻塞 树的数学性质
6 扩展性差(天花板 = 根设备端口数) 单体即上限

缺陷详解

① 根拥塞/收敛比:一台 ToR 48×25G 下行(1200G)只有 2×100G 上行(200G)→ 收敛比 6:1。单机访问互联网没问题(单流用不满),但同层横向通信要挤上行走两遍——AI all-reduce、分布式存储副本、微服务 RPC 全是东西向,树直接崩掉。

② 对分带宽:把网络切成左右两半,跨切面通信容量 = 对分带宽,是衡量「横向能力」的核心指标。树的对分带宽被根锁死:网络再大,两半之间只能跑根链路的带宽;而 all-reduce 恰恰要全网两两通信。

③ 故障域放大

坏了谁 影响范围
一台服务器 它自己
一台 ToR 一个机架
一台汇聚 一片 pod
一台核心 全网瘫痪

位置越高的设备故障影响越大、需要越强冗余 → 只能用又贵又大的高端盒子,成本随高度超线性增长

④ 先上后下:服务器 A、B 通信要爬到共同祖先再下来(跨 pod 5 跳 vs 同 ToR 1 跳)。后果:跳数不均 → 延迟方差大(对 RDMA 微秒级应用是灾难);负载不均 → 上层链路永远最热、下层大量空闲。

⑤ 路径唯一:两节点间路径唯一带来三个连锁问题——无 ECMP 多路径负载均衡空间;为冗余多拉的链路必须被 STP 阻塞防环(平时纯浪费,故障时等几十秒收敛);一条链路断 = 一棵子树被隔离。

⑥ 扩展性差:向上扩 = 换更大端口密度的核心盒子(掏空预算仍有上限);向外扩 = 加一层要全部重新布线、IP 重新规划。树的规模 = 根设备的端口数,天花板写在硬件型号上

主机内部,病也一样

网络 PCIe 设备树 NUMA 树
核心交换机 PCIe RC (CPU)
瓶颈 上行链路 通往 CPU 的上行带宽 UPI 链路
跨域代价 先上后下 过根的 P2P 极差 跨节点 +50ns
单路径 STP 阻塞 链路唯一,断了子树消失 一条 UPI 路径

这就是为什么:GPUDirect 要把 GPU 和 DPU 放同一 PCIe Switch 下(树内直达不过根);CXL 把 PCIe 树改造成交换矩阵(主机内部重演「树 → CLOS」进化);NUMA 亲和性调优本质是绕开树根

3. 药方(网络侧):CLOS / Fat-Tree / Spine-Leaf

所谓「压扁 + 加宽」:压扁 = 减少层级、固定跳数(跨子树不再先上后下);加宽 = 两点之间多条并行路径(对分带宽不再被根锁死)。这个思想 1953 年诞生(Charles Clos 为电话交换机设计),70 年里被反复重演:电话网 → 数据中心 → 芯片/机箱内部

思想源头:Clos 网络(1953)

输入级      中间级      输出级
[n×n] ── [m×n] ── [n×n]

用一堆小交换机织成网络替代一台大交换机。Clos 定理:中间级数量 m ≥ 2n−1 时严格无阻塞(任何两点随时可接通)。关键转变:用「网络结构」替代「单体设备」,容量上限被数学消除

Fat-Tree:用同一种便宜交换机织出的胖树

Leiserson 1985 提出「胖树」:越靠近根链路越宽。数据中心版关键决策:不用物理上更宽的链路,而用多条普通链路聚合出「宽」——全网可用同一种 48 口商用白盒交换机。

Spine-Leaf:把 Clos「对折」

三阶 Clos 从中间折叠就是叶脊,规则只有一条:每台 Leaf 全连所有 Spine

性质 说明
恒定 2 跳 任意两台服务器路径固定 → 延迟均匀(RDMA 至关重要)
路径数 = Spine 数 A→B 多条等价路径,ECMP 哈希分担
优雅降级 坏一台 Spine:容量下降,不分区;坏一条链路:流量绕行
横向扩展 加 Leaf/加 Spine 即扩容,规模不绑定任何单体设备

典型 Leaf 配比:48 口 40 下行 + 8 上行 → 8 Spine、收敛比 5:1(通用业务够用);AI/存储集群 32 下 + 16 上 → 16 Spine、2:1;要 1:1 就 24+24。

再大就 CLOS 套 CLOS(五阶):Leaf+Spine 组成 Fabric Pod,Pod 之间再织 Super-Spine 层——Google Jupiter、Meta、Azure 的超大规模网络皆如此。收敛比由上下行配比决定:通用业务 3~5:1,AI 集群 1.5~2:1,无阻塞 1:1。

压扁加宽之后,还剩什么病?

解药正是 DPU:NVIDIA Spectrum-X 让 DPU 与交换机实时互通遥测,做自适应路由(大象流绕开热点、按包/按流喷射)——在 ECMP 之上加一层动态流量工程,把「哈希赌运气」变成「看着路况开车」。

4. DPU 拓扑:网络边界推进到主机内部

单节点视图

[GPU0]═NVLink═[GPU1]═NVLink═[GPU2]═NVLink═[GPU3]
    │           │           │           │
    └───────────┴─────┬─────┴───────────┘
                 [PCIe Switch]
                      │ Gen5 x16
[NVMe]────[CPU]────[DPU]      ← 主机唯一对外网口
 (业务OS/应用)     │ 400G
             [DDR5]│
                   
            ToR/Leaf 交换机

DPU 的三个拓扑视图

视角 看到的网络 DPU 的角色
向外 Spine-Leaf / CLOS 矩阵 矩阵的分布式延伸:OVS/VXLAN/RDMA 在主机边缘终结
向内 PCIe 设备树 树的根(RC 模式)或高端口:呈现 virtio/SR-IOV 虚拟设备
向上 业务/存储/RDMA/管理多平面 「一卡多平面」,多网合一

DPU 内部:隐形的管理节点

每台服务器实际有两套系统:业务系统(CPU)+ 基础设施系统(DPU 的 ARM)。数千个 DPU 组成一张隐藏的带外管理网。DPU 内部含可编程网络流水线(RDMA QP 硬件终点、OVS 卸载)+ ARM×16 自带 OS + 硬件加速(加密/压缩/正则),通过 PCIe 接口向主机呈现 virtio 网卡/虚拟 NVMe 盘或直通 VF/SF。

快车道上跑的技术

技术 一句话 与拓扑的关系
RDMA 网卡直接 DMA 读写两端内存,内核旁路+零拷贝+单边,~1μs QP/MR 在 DPU 流水线终结;GPUDirect RDMA 让 GPU 显存不过 CPU 直传
NVMe-oF NVMe 队列映射到 RDMA QP/TCP,远端盘当本地盘 DPU 卸载后主机可无盘化(SNAP)
SR-IOV PF 切 VF 直通,线速但私有驱动、热迁移难 VF 接入 DPU 硬件 eswitch,策略由 DPU 下发
vDPA 硬件执行 virtqueue,guest 用标准 virtio 驱动 快且开放,支持热迁移,支撑弹性裸金属

5. 主机内部革命(上):NVLink / NVSwitch / GB200 NVL72

NVSwitch:机箱内的胖树

传统 GPU─PCIe Switch─CPU─PCIe Switch─GPU 过根单路径;NVLink4/5 + NVSwitch 后任意两卡多路径直通。H100 NVLink 900GB/s 是 PCIe 5.0 x16(64GB/s)的 ~14 倍。AMD/Intel 等 2024 年成立 UALink 联盟做开放版——「直连矩阵」已是公认方向。

GB200 NVL72:完美双部图

指标 数值
GPU / CPU 72 × Blackwell(每卡 192GB HBM3e,共 ~13.8TB)/ 36 × Grace(共 ~17TB LPDDR5X)
结构 18 计算托盘(2 GB200 = 2 Grace + 4 Blackwell)+ 9 交换托盘(各 2 颗 NVSwitch)
交换芯片 18 颗 × 72 端口
NVLink 总带宽 130 TB/s(= 72 × 1.8TB/s)
算力 ~720 PFLOPS FP8 训练 / 1.44 EFLOPS FP4 推理
功耗 ~120kW,液冷

机架结构:计算托盘与交换托盘穿插摆放(计算/计算/交换循环)→ 所有铜缆 ≲0.5m。对外:每计算托盘 8×400G(CX-7)+ 2×BlueField-3 DPU。

核心布线规则(全部答案):每块 Blackwell 有 18 条 NVLink5,每条各奔一颗交换芯片;每「托盘↔芯片」对恰好 4 条。验算:72 GPU × 18 = 1296 = 18 芯片 × 72 端口 ✓ —— 完美双部图,一个端口不多不少(9 托盘×2 芯片是数学唯一解:72×18÷72 = 18)。

布线规则推出的性质
- 任意两卡恒 1 跳,其间 18 条不相交路径(单 GPU 视角:每颗芯片恰好一条链路 ~100GB/s)
- 单对可聚合 1.8TB/s(PCIe 5.0 x16 的 ~28 倍),与访问自己 HBM 一样宽
- 全网 1:1 无收敛——对分带宽 130TB/s,CLOS 数学「用结构替代单体性能」的机架级实现
- SHARP3:all-reduce 不在端点算,在交换芯片里边转发边归约(FP8/FP4),进一步压缩集合通信时间

计算托盘内部:GB200 = Grace ──NVLink-C2C(~900GB/s)── 自家 4 块 Blackwell;每块 Blackwell 192GB HBM + 18 条 NVLink 上面板。Grace 没有独立交换端口——借道自家 GPU 的 NVLink(C2C→fabric)访问全机架 HBM/LPDDR

铜缆经济学:1296 条链路全无源铜缆(twinax,≲0.5m),对比光模块每机架省 ~20kW 量级;出机架(NVL576 方向)必须转光——单机架就是铜缆经济边界,这就是 72 的由来。再往外交还给以太/IB 的 CLOS + 36 个 BlueField-3。

定位:NVL72 是一台电脑,BlueField-3 是它的网卡,Spine-Leaf 是它的局域网——第 3、4 章的图在这里合为一体。(GB300、Rubin 沿用同一布线思想,仅单卡显存/链路速率升级)

6. 主机内部革命(下):CXL 从树到矩阵

协议与设备

CXL 复用 PCIe 物理层,升级为缓存一致协议:

子协议 作用 设备类型
CXL.io 就是 PCIe(枚举/DMA/中断) 全部
CXL.cache 设备缓存主机内存,硬件保证一致 Type 1 智能网卡 / Type 2 GPU
CXL.memory 主机访问设备上的内存 Type 2 GPU / Type 3 内存扩展器

三个阶段:扩展 → 池化 → 共享

阶段 能力 机理 状态
① 扩展 单机内存扩容(+2TB,延迟约本地 1.5~2 倍) OS 识别为新 NUMA 节点,冷页下沉 已量产
② 池化 (CXL 2.0) 多主机独占式共享内存池 MLD:逻辑设备独占绑定,交接靠软件 flush+重绑 试点
③ 共享 (CXL 3.0) 多主机同读同写同一区域 Back-Invalidation,硬件一致性 硬件在路上

CXL 2.0 为什么只能「池化」不能「共享」

CXL 2.0 多主机方案是 MLD(多逻辑设备)独占绑定:Type-3 内存池切成 LD0/LD1/LD2 各归一个主机,谁也不能碰别人的。所谓「共享」只能靠交接:A 用完 → 软件 cache flush + unmap → 管理面把 LD0 重绑给 B → B 再 map(GB 级粒度/毫秒级/一致性靠软件自觉)。

为什么不能让 A、B 同时读写同一区域?因为一致性权力是单向的:主机可以失效/收回「设备」的缓存行,但设备和设备身后的网络完全碰不到主机的缓存——B 写 X=20 直达内存池,A 缓存里的 X 仍是旧的 10(陈旧数据)。

CXL 3.0 Back-Invalidation:把反向窥探权交给网络

CXL 3.0(2023.8)新增一组反向消息(BI-SnpInv / BI-SnpData):允许设备/交换网络向主机缓存发起窥探——要求主机失效某行、或交回脏行。

Host A           Fabric(交换芯片当"目录")        Host B
  │ 读X,缓存X(S)     │                          │ 读X,缓存X(S)
  │                  │◄─────────────────────────│ 欲写X,请求升级到M
  │◄── BI-SnpInv(X) ─│   ← 反向窥探:打进主机缓存!
  │ X:S→I,回ACK ────►│                          │
  │                  │─────────────────────────►│ 获M,写入 X=20
  │ 再读X:miss        │                          │
  │─────────────────►│ 从 B 干预/回传新值        │ M→S
  │◄── X=20(S) ──────│◄─────────────────────────│

要点:主机缓存从「本地国王」降级为「网络中的一个缓存」——可被远端失效、被要求回传数据;交换芯片成为共享区域的目录/序列化点(知道哪些主机映射了共享 LD,向相关主机定向发窥探而非广播);设备侧写入(网卡 DMA 到 CXL 内存)也能主动失效主机的陈旧行。CXL 3.0 还同步引入 GPF(全局持久化刷写:所有主机缓存失效后持久内存才算落盘)与 FM API(交换网络标准化管理面)。

你早就见过这门手艺:双路服务器 CPU1 写 X,就是经 UPI 窥探失效 CPU0 的缓存。CXL 3.0 = 把 socket 间窥探机制(cc-NUMA)从 UPI 延伸到交换矩阵上,「机架 = 一台大号多路机」在内存层面成立

解锁的应用与代价

CXL 2.0 交接 CXL 3.0 共享
归属 独占 多主机同读同写
一致性 软件显式 flush 硬件、缓存行粒度
切换成本 GB 级搬移,毫秒级 一次窥探,百 ns 级
编程模型 内存「搬家」 普通指针解引用

适用:读多写少的共享元数据/索引、消息队列、分布式锁、引用计数;不适用:写共享热区(窥探乒乓)。现状:出货以 CXL 2.0 为主,BI 需要新主机根复合体 + 3.0 交换芯片,正在路上。

三个杀手级应用

① 内存扩展——解决 DDR 容量/成本墙:CPU 本地 DDR5 512GB(~90ns)+ CXL 内存条 +2TB(~150ns)。OS 把 CXL 内存识别为新的 NUMA 节点(一台「远端 NUMA 机器焊在 PCIe 上」);Linux 分层内存把冷页下沉 CXL 层、热页留 DDR——用延迟换容量,软件透明。已量产。

② 内存池化——把内存变成「存储阵列」:Host1 只需 1TB、Host2 峰值要 4TB、Host3 只用 0.5TB,都通过 CXL Switch 连 16TB 内存刀片,按需在线切分/回收。今天每台服务器按峰值配内存、平均利用率不到 50%;池化后内存变成全局弹性资源——DAS → SAN 的路,内存界重走一遍。试点中。

③ 资源解耦数据中心:CPU 池、GPU 池、内存池、存储池用 CXL/以太互联按需组装「虚拟服务器」——树形主机被彻底打散,主机内部和数据中心变成同构的「资源 + 互联」问题。

现实进度:Intel/AMD 新平台已支持 CXL 2.0;三星/美光/澜起 CXL 内存扩展器已量产;内存池化在超大规模厂商试点;NVIDIA 走私有路线(Grace-Hopper 用 NVLink-C2C,带宽数倍于 CXL)——两条路线并行。

与 RDMA 范式对照

RDMA CXL 3.0 共享内存
范式 消息传递(单边读写) 共享内存
一致性 无,应用自己 fencing 硬件缓存一致
编程 QP/MR/Verbs 普通 load/store
带宽 400G ≈ 50GB/s/链 每主机口 ~64GB/s(单向)
适合 大块传输 读多写少的共享元数据/锁/消息队列

代价:窥探数百 ns、带宽低于 DDR/NVLink 一个量级——慢但通,与 NVLink「快而专」互补

7. 多尺度统一:同一套数学,同一个方向

数据中心 主机内部 共同思想
三层树 PCIe 树 / NUMA 树 单根、单路径、必经根
单体核心交换机 单体大型主机 容量天花板写在硬件上
Spine-Leaf / Fat-Tree NVSwitch 矩阵 / CXL Switch 压扁:固定跳数;加宽:多路径
ECMP 多路径 18 条 NVLink / CXL 多端口 并行链路堆出对分带宽
Clos 定理 (m≥2n−1) NVL72 双部图 (72×18=18×72) 用数学结构替代单体性能
存储 → NVMe-oF 弹性池 内存 → CXL Type-3 弹性池 局部资源 → 共享弹性资源
DPU:边缘可编程端点 DPU:设备树的翻译官 两个尺度都需要边缘智能

阵营对比:NVSwitch/NVL72(NVIDIA 私有,130 TB/s,单机架铜缆,快而专 AI)vs CXL 3.0+BI(开放标准,每主机口 ~64GB/s,跨机箱机架,慢而通通用)。

结语

70 年前 Clos 为电话局发明「用小交换机网络替代大交换机」,此后同一场革命重演四次:电话网 (1953) → 数据中心 → 经 DPU 侵入主机 → CXL 把总线摊成网络,NVL72 把网络叠回总线。拓扑进化的方向只有一个:从金字塔变成「矩阵 + 弹性池」;DPU 在每个尺度上都扮演同一个角色——站在边缘的翻译官和交通警察。

关键数字速查

数字 含义
2n−1 Clos 严格无阻塞条件
k³/4 k 元胖树服务器数(k=48 → 27,648)
2 跳 Spine-Leaf 任意两点恒定跳数
~90 / ~140ns 本地 / 跨 NUMA 内存延迟
900GB/s H100 NVLink(PCIe5 x16 的 ~14 倍)
1296 = 72×18 = 18×72 NVL72 完美双部图
130 TB/s NVL72 全网对分带宽,1:1 无收敛
BI-SnpInv CXL 2.0 池化 / 3.0 共享的分水岭

完整原文:cpu2dpu(192 行,含全部 ASCII 图)


命令篇

8. CPU 拓扑查看

# 概要:CPU 数、Socket、核、线程、NUMA 节点
lscpu
lscpu | grep -E "Socket|Core|Thread|NUMA|Model name"
lscpu -e                          # 逻辑 CPU 与 NUMA/核的映射

# 树形拓扑图(需 hwloc 包)
lstopo --output-format png -o cpu_topo.png
lstopo-noX                        # 无图形界面文本输出

# NUMA 硬件布局
numactl --hardware
numactl --show                    # 当前进程 NUMA 策略
numastat                          # NUMA 内存分配统计

# 每核拓扑
cat /proc/cpuinfo | grep -E "processor|physical id|core id|cpu cores"

NUMA 亲核

taskset -cp <pid>                 # 查看进程 CPU 亲和
taskset -c 0-3 ./app              # 绑 0-3 号 CPU 运行
numactl --cpunodebind=0 --membind=0 ./app   # 绑节点 0(CPU+内存本地)

9. PCIe 拓扑查看

lspci -tv                         # 树形视图
lspci -nn                         # 完整列表(含 class/vendor/device)
sudo lspci -vvv -s 03:00.0 | grep -E "LnkCap|LnkSta"   # 链路能力/实际协商

# 设备归属哪个 NUMA 节点
cat /sys/bus/pci/devices/0000:03:00.0/numa_node

# 链路速率速查:Gen3 x16 ~32GB/s | Gen4 x16 ~64GB/s | Gen5 x16 ~128GB/s | Gen6 x16 ~256GB/s

10. GPU 拓扑查看

nvidia-smi topo -m                # GPU 间拓扑(NVLink/PCIe/主机桥接)
# NV# = NVLink 直连 | NODE = 同 NUMA 经 CPU | SYS = 跨 Socket(最慢)

nvidia-smi -q | grep -E "Bus Id|NUMA"   # GPU 归属
nvidia-smi topo -m                # 看 CPU Affinity 列,taskset 绑同 NUMA 核

11. DPU / 智能网卡查看

lspci | grep -iE "mellanox|bluefield|ethernet"   # 网卡/DPU 设备
cat /sys/class/net/<PF>/device/sriov_numvfs      # SR-IOV VF 数量
rdma link show                    # RDMA 链路(roce/ib)
ibstat 2>/dev/null                # InfiniBand 状态
lspci -tv | grep -i -A2 "bluefield|mellanox"    # DPU 挂哪棵 PCIe 树
ip link show | grep -E "pf0vf|rep"               # representor 口

12. 拓扑感知调优

场景 做法
数据库内存访问慢 numactl --interleave=all 或绑本地节点
网卡软中断吃满单核 RSS/RPS + 中断绑网卡同 NUMA 核
GPU 训练通信慢 nvidia-smi topo -m 确认 NVLink 连通
NVMe 性能不及预期 查 PCIe Gen3/4、是否与其他卡抢通道
DPU 数据面占 CPU 高 确认代表接口直通,控制面才上 CPU

相关页面