NVIDIA Open GPU Kernel 源码深度解析

NVLink NVSwitch NVLink-C2C MMU 硬件特性与驱动实现

基于 open-gpu-kernel-modules 最新源码

NVSwitch 深度解析

硬件特性 Hardware

NVSwitch 支持两代芯片:LS10(Laguna,Hopper 代)LR10(Limerock,Blackwell 代)。LS10 有 64 个 NVLink 端口(每端口 2 条 lane),LR10 有 36 个端口(每端口 4 条 lane)。

路由引擎(NV_ROUTE,0x5000-0x5FFF)支持三种转发模式:SPRAY(轮询分发)、RANDOM(随机选择)、ALTERNATE(交替路径)。组播最多支持 16 个 spray 组、每组 32 个 TCP directive、最多 11 轮转发。

错误检测包括:每 lane CRC 计数器、Flit 级 CRC、ECC 保护(Ganged Link Table Data2、Ingress 重映射表均有 ECC 字段)、Credit 超时检测。错误严重度分为 FATAL(需芯片复位)和 NONFATAL(可纠正)。

NVSwitch 核心代码 组播路由代码 错误处理代码

微架构参数 Microarchitecture

参数LS10 LagunaLR10 Limerock
端口数6436
每端口 Lane24
NPG 引擎169
NXBAR 引擎34
每 NXBAR Tile124
总 Crossbar Tile3616
GLT 表项256 × 64-bit512 × 32-bit
Ingress 地址位51:3946:36
延迟计数器窗口~12 小时 (48-bit)~3.3 秒 (32-bit)
PCI 设备 ID0x22A0-0x22AF0x1AE8, 0x1AF0-0x1AFF

FSP(Fabric State Manager)通过 MCTP over EMEM 与 CPU 通信,支持多包分片(SOM/EOM 标志、0-3 序列号)。InfoROM 使用格式字符串解析(S08/U04/U08/U16/U24/U32/U64/BINARY),小端字节序。

LS10 头文件 LR10 头文件 FSP RPC 代码 InfoROM 解析代码

芯片代际差异 Generation

LR10 相比 LS10 的关键变化:端口数减少但每端口带宽提升(36×4 lane vs 64×2 lane);新增 XP3G/ XVE/ PRIVLOC 硬件块;移除了 CPR/XAL/XPL/XTL 块;增强安全性(TNVL 模式,含认证证书链和安全锁);地址支持从 52 位缩减到 47 位。

寄存器定义文件:LS10 有 48 个 dev_*.h 文件,LR10 有 42 个,覆盖 ROUTE、INGRESS、EGRESS、NPORT、NVLW、NVLDL、NVLTLC、NXBAR、TSTATE、FALCON、SOE 等完整硬件块。

LS10 寄存器定义 LR10 寄存器定义

驱动实现算法 Algorithm

初始化序列(22 步):平台检测 → HAL 设置 → 寄存器键加载 → SOE 构建 → CCI 构建 → DMA Mask → 设备状态 → UUID → InfoROM → 黑名单检查 → Fabric 心跳 → 链路创建 → 训练模式 → Scratch → 错误日志 → PRI Ring → IP Wrapper → 路由初始化 → 端口计数器 → 后置初始化 → 后台任务 → 中断使能。

Fabric Manager 集成:状态机从 OFFLINE → STANDBY → CONFIGURED,心跳超时后转为 MANAGER_TIMEOUT。黑名单原因包括 MANUAL_OUT_OF_BAND、TRUNK_LINK_FAILURE、ACCESS_LINK_FAILURE 等 8 种。

链路复位和 Drain 序列:检查 NXBAR 错误(始终为 FATAL)→ 禁用中断 → 等待紧急关机 → SOE NPort 复位 → Minion 链路复位(最多 3 次重试)→ 状态恢复 → 重编程路由表 → 重新注册链路 → ALI 训练 → 等待 DL 时钟 → 重新使能中断。

初始化序列代码 LS10 链路复位代码

NVLink C2C 深度解析

硬件特性 Hardware

NVLink C2C 是 Grace-Hopper 和 Vera-Rubin Superchip 中 CPU 与 GPU 之间的芯片间互联。驱动接口支持最多 2 个 C2C 实例 × 7 条链路 = 14 条链路。每条链路的带宽和 lane 宽度由固件动态上报(驱动中无硬编码数值)。

Blackwell 在 DVSEC 寄存器中新增了两个独立的 C2C 错误类别:C2C_MISC_LINK_ERROR(bit 8)和 C2C_HBI_LINK_ERROR(bit 9)。一致性模型通过 ATS(地址转换服务)和 SVA(共享虚拟寻址)实现,GPU 与 CPU 共享页表,由 ARM SMMU 管理。

C2C 控制命令定义 Blackwell C2C 寄存器

微架构参数 Microarchitecture

  • coherentCpuFbBase:CPU 一致帧缓冲基地址,GPU 物理地址 + 此偏移 = CPU 可访问 GPA
  • NUMA Online 区域:从 coherent FB 中 carve out,按 memblock 大小对齐
  • ATS 粒度:UVM_GMMU_ATS_GRANULARITY = 512MB(PDE1 级别)
  • NOATS 位:位于 PDE1,可按 512MB 区域禁用 ATS 查找
  • EGM Peer ID:固定为 7(vGPU 迁移安全),通过 HSHUB EGM_CONFIG 编程

HSHUB(High-Speed Hub)是 GPU 端连接 C2C/NVLink/PCIe 的枢纽。控制命令包括 PEER_CONN_CONFIG、GET_HSHUB_ID_FOR_LINKS、EGM_CONFIG 等。

内存系统生成头 ATS/SVA 代码

芯片代际差异 Generation

特性Grace-Hopper GH100Grace-Blackwell GB100
BAR1禁用重新使能(支持同时访问)
C2C LCE 类型统一 C2C分离 C2C_H2D + C2C_D2H
CE 物理 vidmem 写入非一致未明确
C2C 故障寄存器MISC_LINK_ERROR + HBI_LINK_ERROR
SMMU WARBug 4130089Bug 4686457(BAR1/FLA 缓存刷新)

Grace CPU(TH500)通过 6 种 PCIe 设备 ID 识别(0x22B1-0x22B4, 0x22B8, 0x22B9),对应 x16/x4/x1/x8/x2 不同 lane 配置。

GH100 CE 映射 GB100 CE 映射

驱动实现算法 Algorithm

C2C 链路检测:BIF 层读取 PDB_PROP_KBIF_IS_C2C_LINK_UP → GSP 静态配置提供 bAtsSupported → 内存系统层调用 kmemsysSetupCoherentCpuLink()

一致性 CPU 映射创建(GH100):检查 Self-Hosted + C2C 链路 UP → 读取 coherentCpuFbBase → 确定 coherentCpuFbSize → carve out 保留区域(WPR)→ 计算 NUMA Online 大小 → 注册 GPU 内存为 Linux NUMA 节点。

SMMU TLB 无效(GH180 WAR):针对 Bug 4130089,驱动直接编程 ARM SMMU VCMDQ(通过 MMIO,使用 VINTF63 和 VCMDQ127),支持按 ASID 整体无效和按 VA 逐页无效,操作码为 TLBI_EL2_ASID (0x21)TLBI_EL2_VA (0x22)CMD_SYNC (0x46)

P2P/RDMA over C2C:本地分配上的 RDMA 不支持(返回 NOT_SUPPORTED)→ 转换为 CPU 一致的 GPA(+coherentCpuFbBase)→ 映射标记为 CPU 可缓存。

一致性链路设置 GH100 CPU 映射 P2P/RDMA 映射

不在本仓库的内容

C2C PHY/链路训练由 GPU 固件(Minion/FSP/GSP)处理,非开源驱动。ARM CMN/CCI 一致性互连由 ARM 固件/Linux 配置。ARM SMMU v3 驱动在 Linux 内核中(drivers/iommu/arm-smmu-v3/),本仓库仅通过 IOMMU 子系统 API 使用。带宽/延迟规格、物理 lane 数量和精确拓扑均不在驱动代码中描述。

MMU 深度解析

硬件特性 Hardware

GPU MMU 页表层级从 Pascal 的 5 级演进到 Hopper/Blackwell 的 6 级。VA 空间从 Pascal/Turing/Ampere 的 49-bit 扩展到 Hopper/Blackwell 的 57-bit(128PB)。Blackwell 独有 256GB 巨型页支持(PDE2 可作为叶 PTE)。

支持的页大小:Blackwell 离散 GPU 支持 4K/64K/2M/512M/256G 五种;集成 GPU 仅支持 4K/64K/2M。ATS(地址转换服务)从 Volta 引入,在 Hopper+ 上 UVM 对所有映射设置 ATS_NOT_ALLOWED,由 CUDA 确保所有分配在 512MB 对齐区域中。

故障缓冲分两种:可重放(Graphics/SM,"Fault and Stall",UVM 独占所有权)和不可重放(CE/PBDMA,"Fault and Switch",RM 拥有 HW 缓冲,UVM 读 shadow 缓冲)。

UVM MMU 核心 MMU 头文件

微架构参数 Microarchitecture

架构页表深度VA 位页大小MMU 版本LTP 数
Pascal GP1005 (PD3→PD0→PTE)494K/64K/2MVER2-
Volta GV1005 (PD3→PD0→PTE)494K/64K/2MVER2-
Turing TU1025 (PD3→PD0→PTE)494K/64K/2MVER2-
Ampere GA1005 (PD3→PD0→PTE)494K/64K/2M/512MVER2-
Hopper GH1006 (PD4→PD0→PTE)574K/64K/2M/512MVER318
Blackwell GB1006 (+256G 叶)574K/64K/2M/512M/256GVER320

PTE 格式(MMU_VER3,Hopper/Blackwell):64 位,Bit 0=VALID,Bit 2:1=APERTURE(SYS_COHERENT/SYS_NONCOHERENT/VIDMEM/PEER),Bit 7:3=PCF(16 种权限组合),Bit 11:8=KIND(压缩格式),Bit 39:12/51:12=ADDRESS,Bit 63:61=PEER_ID。

PCF 权限控制标志:支持 RW/RO × ATOMIC/NO_ATOMIC × CACHED/UNCACHED × ACE/ACD 共 16 种组合。另有 SPARSE、MAPPING_NOWHERE、NO_VALID_4KB_PAGE 特殊值。

PDE 格式:PD4/PD3/PD2 使用单 PDE(8 字节),PD0 使用双 PDE(16 字节,同时包含 64K 和 4K 子项)。

Hopper MMU 代码 Blackwell MMU 代码 MMU 寄存器定义

芯片代际差异 Generation

新特性引入代际说明
可重放故障缓冲PascalGraphics 引擎 "Fault and Stall"
ATS 支持VoltaCPU/GPU 共享页表,NV4K 编码
不可重放故障VoltaCE/PBDMA "Fault and Switch"
基于消息的 MMU 中断Turing替代传统中断
Poisoned PTETuring调试机制
512MB 巨型页AmperePDE1 可作为叶 PTE
访问计数器AmpereACE/ACD 在 PCF 标志中
机密计算AmpereCC/Fabric 加密
57-bit VA / 6 级页表HopperPD4 级(2 项),MMU_VER3
统一 ADDRESS 字段Hopper无 comptagline 重叠
256GB 巨型页BlackwellPDE2 可作为叶 PTE
20 LTPsBlackwellHopper 为 18
Hopper 格式定义 Blackwell 格式定义

驱动实现算法 Algorithm

页树分配:从根节点走查,从 VA 位计算入口索引 → 若为空则分配新页目录 → 重试循环处理并发竞争(dir_cache)→ 新目录清零(通过 CE 或 CPU)→ 自底向上写 PDE → TLB 无效。页表位置策略:默认优先 vidmem 回退 sysmem;SR-IOV 必须 vidmem;机密计算必须 vidmem;集成 GPU 必须 sysmem。

VA 空间布局(Hopper+):0→64PB(RM 管理)→ 64PB→64PB+32TB(Peer 身份映射 32×1TB)→ 64PB+32TB→64PB+384TB(Flat Vidmem 最多 1TB)→ 64PB+384TB→64PB+512TB(UVM 内部 128GB)。

可重放故障处理流程:中断触发 → 从 HW 缓冲拷贝到 shadow → 解析故障包(VA/类型/访问类型/引擎/客户端)→ 批量服务故障 → 填充页表 → TLB 无效 → 更新 PUT 指针触发重放 → 通知客户端。

HMM 集成:x86_64 默认开启,ARM64 默认关闭。通过 mmu_interval_notifier 跟踪 CPU 页表变化。设备私有页(devmem)表示 GPU 内存映射到 CPU 地址空间。迁移使用 Linux migrate_vma_* API,通过 CE 在 GPU↔CPU 间拷贝数据。

页树分配代码 故障缓冲代码 HMM 集成代码 内存迁移代码

全代际技术对比

NVLink 代际演进

代际PascalVolta/TuringAmpereHopperBlackwell
版本NVL 1.0NVL 2.0/2.2NVL 3.0NVL 4.0NVL 5.0
训练算法Legacy PRBSLegacyALTALT+ALIALI
Fabric 地址对齐-16GB64GB512GB4TB
加密NVLENVLE+ALID/CLID
自适应带宽✓ 5 模式✓ 链路计数

NVSwitch 代际对比

参数LS10 LagunaLR10 Limerock
代际Hopper GH200Blackwell B200/GB200
端口 × Lane64 × 236 × 4
Crossbar3 NXBAR × 12 Tile4 NXBAR × 4 Tile
GLT 表项256 × 64-bit512 × 32-bit
地址位宽52-bit47-bit
延迟计数器48-bit (~12h)32-bit (~3.3s)
安全增强基础TNVL 认证 + 安全锁

MMU 代际演进

特性Pascal→AmpereHopperBlackwell
页表深度5 级6 级6 级 + 256G 叶
VA 空间49-bit57-bit57-bit
最大页512MB512MB256GB
PTE 格式VER2(分离地址)VER3(统一地址)VER3
PCF 组合独立标志16 种编码16 种编码
故障类型可重放+不可重放同左+CC 支持同左

趋势展望

Fabric 地址空间指数增长

从 Volta 的 16GB 到 Blackwell 的 4TB,Fabric 地址对齐每代增长 4-8 倍。Blackwell 的 64 项 GPA 重映射表每项 4TB,总覆盖 256TB。这反映了 NVLink 拓扑从单机架向多机架扩展的趋势,地址管理复杂度将持续上升。

训练控制权从驱动向固件转移

NVLink 训练从 Pascal 的完全 SW 控制(Legacy PRBS)到 Hopper 的 ALI 固件驱动,再到 Blackwell 子链路状态也旁路给 HW/FW。开源驱动的角色正从"直接操控硬件"变为"协调固件和 Fabric Manager",代码可见度下降但系统可靠性提升。

MMU 页表深度与 VA 空间的军备竞赛

Hopper 将页表从 5 级扩展到 6 级、VA 从 49-bit 扩展到 57-bit,Blackwell 进一步在 PD2 级引入 256GB 巨型页。这对应着 LLM 训练中对单 GPU 管理 TB 级显存的需求。未来 Rubin 架构可能扩展至 64-bit VA 或 7 级页表。

NVSwitch 端口收敛、Lane 扩张

从 LS10 的 64×2 lane 到 LR10 的 36×4 lane,端口数减少但每端口带宽翻倍。这暗示 NVLink 5.0 单 lane 速率显著提升,使得更少的物理端口即可满足更高总带宽。NXBAR 从 3 增加到 4 表明 crossbar 架构也在同步演进。

C2C 一致性生态逐渐成熟

从 Grace-Hopper 到 Grace-Blackwell,C2C 驱动路径从禁用 BAR1 到重新使能(同时访问)、从统一 C2C LCE 到分离 H2D/D2H 类型、从缺少故障寄存器到增加 MISC/HBI 双错误类别。Blackwell 的 Bug 4686457 WAR 显示一致性内存路径仍在调优中。随着 Vera-Rubin 发布,C2C 带宽预计将从 900GB/s 翻倍到 1.8TB/s。

总结

open-gpu-kernel-modules 源码揭示了 NVIDIA GPU 互联与内存管理架构的完整演进路线:NVLink 从软件训练走向固件自治,NVSwitch 从多端口低带宽走向少端口高带宽,MMU 从 49-bit/5 级扩展到 57-bit/6 级+256GB 巨型页,C2C 一致性从实验性功能走向生产就绪。驱动代码正在从"直接硬件操控"向"固件协调层"转变,开源可见度下降但系统可靠性提升。