本系列文档旨在帮助新手系统学习AMDGPU中的Shared Virtual Memory (SVM)技术。SVM作为异构计算ROCm和CUDA编程的核心支撑技术,在人工智能时代有着举足轻重的地位,已成为驱动开发者们必备的一项技能。
本专栏为2026年02月专栏,二月周一到周五每天发布一篇(节假日除外)。敬请订阅关注,以便及时收到发布通知。
第一部分:基础篇 🟢
适合完全新手,建立基础概念
01-什么是SVM
- 1.1 统一内存访问的需求
- 1.2 传统GPU内存模型的局限
- 1.3 SVM的核心概念和优势
- 1.4 CPU-GPU共享内存的工作原理
- 1.5 实际应用场景
02-SVM相关的Linux内核基础
- 2.1 虚拟内存管理基础
- 2.2 页表和地址转换
- 2.3 MMU和页面异常
- 2.4 DMA和IOMMU
- 2.5 HMM框架介绍
03-AMDGPU驱动架构概览
- 3.1 AMDGPU驱动整体架构
- 3.2 KFD (Kernel Fusion Driver) 简介
- 3.3 TTM (Translation Table Maps)
- 3.4 GART表的作用
- 3.5 SVM在驱动中的位置
第二部分:数据结构篇 🟡
理解代码组织,掌握核心数据结构
04-核心数据结构详解
- 4.1
svm_range- 内存范围表示- 起始/结束地址
- 位置标记 (actual_loc, preferred_loc)
- 访问属性和标志
- 4.2
svm_range_list- 范围管理- interval tree组织
- 链表结构
- 锁机制
- 4.3
svm_range_bo- Buffer Object管理- 引用计数
- eviction fence
- 多范围共享
- 4.4
svm_work_list_item- 异步工作项 - 4.5 数据结构关系图
05-进程与SVM的关系
- 5.1
kfd_process中的 SVM 管理 - 5.2 进程创建时的SVM初始化
- 5.3 进程销毁时的清理
- 5.4 多GPU场景下的管理
第三部分:核心功能篇 🟡🔴
深入实现细节,理解关键流程
06-SVM范围管理
- 6.1 范围的创建
- 6.2 范围的查找 (interval tree使用)
- 6.3 范围的分割与合并
- 6.4 范围的删除与清理
- 6.5 代码示例和流程图
07-内存迁移机制
- 7.1 为什么需要迁移
- 7.2 RAM到VRAM的迁移流程
- 7.3 VRAM到RAM的迁移流程
- 7.4 SDMA引擎的使用
- 7.5 GART表在迁移中的作用
- 7.6 迁移性能优化
08-页面映射与GPU页表
- 8.1 GPU页表结构
- 8.2 页表映射的建立
- 8.3 页表映射的更新
- 8.4 页表映射的撤销
- 8.5 多GPU映射管理
- 8.6 AIP (Access In Place) 支持
09-缺页处理机制
- 9.1 GPU页面异常(page fault)的产生
- 9.2 GPU Page Fault的处理
- 9.3 XNACK重试机制
- 9.4 缺页处理流程图
- 9.5 性能考虑
- 9.6 与CPU缺页处理的对比
10-MMU Notifier集成
- 10.1 为什么需要MMU Notifier
- 10.2
mmu_interval_notifier注册 - 10.3 CPU页表变化的捕获
- 10.4 invalidate回调处理
- 10.5 与HMM的配合
第四部分:高级特性篇 🔴
掌握高级功能和优化技术
11-预取与位置提示
- 11.1 prefetch操作
- 11.2 preferred_loc的设置和使用
- 11.3 访问策略 (read-only, read-write)
- 11.4 granularity控制
- 11.5 性能调优建议
12-VRAM驱逐与恢复
- 12.1 VRAM不足时的驱逐
- 12.2 eviction fence机制
- 12.3 驱逐工作队列
- 12.4 页面的恢复
- 12.5 驱逐策略
13-多GPU和XGMI支持
- 13.1 多GPU场景介绍
- 13.2 P2P访问支持
- 13.3 XGMI互连
- 13.4 bitmap_access和bitmap_aip
- 13.5 跨GPU迁移
14-用户态API接口
- 14.1 IOCTL命令详解
SET_ATTRIBUTES- 设置SVM范围属性GET_ATTRIBUTES- 获取SVM范围属性- 其他操作
- 14.2 用户态使用示例
- 14.3 ROCm runtime集成
- 14.4 错误处理
15-Checkpoint Timestamp同步机制
- 15.1 为什么需要Checkpoint Timestamp
- 15.2 数据结构
- 15.3 核心操作
- 15.4 时间戳比较
- 15.5 完整工作流程
- 15.6 应用场景
- 15.7 性能与优化
- 15.8 调试与故障排查
学习路径建议
🎯 初学者路径 (2-3周)
- 第一部分:基础篇 (01-03) → 建立概念
- 第二部分:数据结构篇 (04-05) → 理解组织
- 第三部分:核心功能篇 (06-10) → 逐个模块学习,配合代码阅读
🚀 有经验者路径 (1周)
- 快速浏览01-03,重点看03
- 精读04-05,理解数据结构
- 按实际需求选读06-14的具体模块
🔍 问题驱动路径
- 性能优化: 重点看 12-13章 (预取、优化技术)
- 多GPU开发: 重点看 11章 (多GPU支持)
- 调试排查: 重点看 14章 (调试与问题排查)
- 同步机制: 重点看 10、15章 (MMU Notifier、Checkpoint Timestamp)
快速参考
核心数据结构速查
| 结构体 | 文件 | 作用 |
|---|---|---|
svm_range |
kfd_svm.h | 表示一个SVM内存范围 |
svm_range_list |
kfd_priv.h | 管理进程的所有SVM范围 |
svm_range_bo |
kfd_svm.h | 管理共享的buffer object |
svm_work_list_item |
kfd_svm.h | 异步工作项 |
关键宏定义
c
#define SVM_RANGE_VRAM_DOMAIN (1UL << 0) // VRAM域标记
#define MAX_GPU_INSTANCE 8 // 最大GPU数量
#define KFD_IS_SVM_API_SUPPORTED(adev) // SVM支持检查
关键配置
bash
# 内核配置项
CONFIG_HSA_AMD_SVM=y # 启用SVM支持
CONFIG_HMM_MIRROR=y # HMM支持
CONFIG_DEVICE_PRIVATE=y # 设备私有内存
# 运行时检查
cat /sys/module/amdgpu/parameters/noretry # XNACK设置
术语速查
| 术语 | 全称 | 说明 |
|---|---|---|
| SVM | Shared Virtual Memory | 共享虚拟内存 |
| HMM | Heterogeneous Memory Management | 异构内存管理 |
| MMU | Memory Management Unit | 内存管理单元 |
| IOMMU | Input/Output MMU | I/O内存管理单元 |
| TTM | Translation Table Maps | 转换表管理器 |
| GART | Graphics Address Remapping Table | 图形地址重映射表 |
| SDMA | System DMA | 系统DMA引擎 |
| XNACK | Exception No ACK | 异常不确认(页面重试机制) |
| XGMI | Infinity Fabric | AMD GPU互连技术 |
| AIP | Access In Place | 就地访问 |
| P2P | Peer-to-Peer | 点对点访问 |
| KFD | Kernel Fusion Driver | 内核融合驱动 |
| PASID | Process Address Space ID | 进程地址空间ID |
| VMID | Virtual Memory ID | 虚拟内存ID |