当前位置: 首页 > news >正文

AMDGPU 基于DRM SVM框架的新SVM功能实现 :属性子系统结构体关系解析

AMD 正在使用 drm svm框架重构SVM的实现,看来drm svm框架要进入大范围应用了。下面是在kernel社区上由AMD的开发人员提交的POC 验证版本的patches的技术方案实现。这里快速总结了实现,以飨读者。

因是POC版本,设计可能会变动,读者们慎重使用。本文仅用来跟踪前沿驱动技术的迭代发展现状。


1. 整体架构

用户空间 (UAPI) 内核空间 (attr 管理) 内核空间 (SVM 核心) ┌───────────────────┐ ┌──────────────────────┐ ┌──────────────────┐ │drm_amdgpu_gem_svm │ ioctl │ amdgpu_svm_attr_tree │ │ amdgpu_svm │ │ start_addr │──SET/GET─────────▶│ lock (mutex) │◄────────────── │ attr_tree │ │ size │ │ tree (rb_root) │ │ gpusvm │ │ nattr │ │ range_list │ │ adev, vm ... │ │ attrs_ptr ───────┤ └─────┬────────────────┘ └──────────────────┘ │ │ │ 包含 N 个 │ │ ┌────────────────┤ ▼ │ 包含 N 个 │ │drm_amdgpu_svm_ │ ┌──────────────────────┐ ┌──────┴───────────┐ │ │ attribute │ 转换为 │amdgpu_svm_attr_range │ │amdgpu_svm_range │ │ │ type (u32) │────────────────▶ │ it_node (区间树) │ 查询 attrs │ base (gpusvm) │ │ │ value (u32) │ │ list (链表) │◄────────────── │ pte_flags │ │ └────────────────┘ │ attrs ──────────────┤ │ attr_flags │ │ │ preferred_loc │ │ gpu_mapped ... │ │ │ prefetch_loc │ └──────────────────┘ │ │ flags │ │ │ granularity │ │ │ access (enum) │ │ └──────────────────────┘

2. 各结构体解析

2.1amdgpu_svm_attrs— 属性值集合(Value Object)

structamdgpu_svm_attrs{int32_tpreferred_loc;// 首选内存位置: GPU ID / SYSMEM(0) / UNDEFINED(0xffffffff)int32_tprefetch_loc;// 预取位置uint32_tflags;// 位标志组合 (COHERENT, GPU_RO, GPU_EXEC 等)uint32_tgranularity;// 映射粒度enumamdgpu_svm_attr_accessaccess;// NONE / ENABLE / IN_PLACE};

纯数据容器,没有指针,可以直接拷贝。它把用户空间的多个离散
drm_amdgpu_svm_attribute(type/value 对)聚合成一个完整的属性快照。

2.2amdgpu_svm_attr_range— 区间-属性映射节点

structamdgpu_svm_attr_range{structinterval_tree_nodeit_node;// ← 嵌入区间树,key=[start, last] 页号structlist_headlist;// ← 链入 attr_tree->range_list 有序链表structamdgpu_svm_attrsattrs;// ← 嵌入属性值};

双索引结构:同一个节点同时存在于两个数据结构中:

索引方式数据结构用途
it_node区间红黑树(rb_root_cached)O(log n) 按地址范围查询
list有序链表(range_list)O(n) 顺序遍历、合并相邻同属性区间

这是内核中常见的"同一对象多索引"模式(类似 VMA 同时在mm->mm_rb
mm->mmap中)。

2.3amdgpu_svm_attr_tree— 属性管理器(容器)

structamdgpu_svm_attr_tree{structmutexlock;// 保护下面两个数据结构structrb_root_cachedtree;// ← attr_range 的区间红黑树根structlist_headrange_list;// ← attr_range 的有序链表头structamdgpu_svm*svm;// ← 回指所属 SVM 实例};

每个 SVM 实例一个attr_tree,管理该进程(fd)所有地址范围的属性。

2.4amdgpu_svm_attr_change_trigger— 变更分类枚举

enumamdgpu_svm_attr_change_trigger{ACCESS_CHANGE=(1U<<0),// access 级别变了 → 可能需要 unmap/remapPTE_FLAG_CHANGE=(1U<<1),// GPU PTE flags 变了 → 需要重建 PTEMAPPING_FLAG_CHANGE=(1U<<2),// 映射策略变了 → 可能影响缓存一致性LOCATION_CHANGE=(1U<<3),// 首选位置变了 → 可能触发迁移GRANULARITY_CHANGE=(1U<<4),// 粒度变了 → 需要拆分/合并 rangeATTR_ONLY=(1U<<5),// 只更新属性,不影响 GPU 映射};

位掩码设计,允许一次set_attr操作同时触发多种变更。


3. 属性标志分类

amdgpu_svm_attrs.flags中的标志位按作用范围分为两组:

PTE 级标志(影响 GPU 页表条目)

#defineAMDGPU_SVM_PTE_FLAG_MASK\(AMDGPU_SVM_FLAG_COHERENT|AMDGPU_SVM_FLAG_EXT_COHERENT|\AMDGPU_SVM_FLAG_GPU_RO|AMDGPU_SVM_FLAG_GPU_EXEC)
标志含义
COHERENT0x02GPU-CPU 缓存一致性
EXT_COHERENT0x80跨节点扩展一致性
GPU_RO0x08GPU 只读访问
GPU_EXEC0x10GPU 可执行

映射级标志(影响映射策略)

#defineAMDGPU_SVM_MAPPING_FLAG_MASK\(AMDGPU_SVM_FLAG_HOST_ACCESS|AMDGPU_SVM_FLAG_HIVE_LOCAL|\AMDGPU_SVM_FLAG_GPU_READ_MOSTLY|AMDGPU_SVM_FLAG_GPU_ALWAYS_MAPPED)
标志含义
HOST_ACCESS0x01允许 CPU 访问设备内存
HIVE_LOCAL0x04限制在 XGMI hive 内
GPU_READ_MOSTLY0x20读多写少优化
GPU_ALWAYS_MAPPED0x40始终保持 GPU 映射

4. 数据流

用户调用 ioctl(AMDGPU_SVM_OP_SET_ATTR) │ ▼ drm_amdgpu_svm_attribute[] (type/value 对数组) │ ▼ amdgpu_svm_attr_set() │ ├─▶ 解析为 amdgpu_svm_attrs (聚合所有 type/value) │ ├─▶ 在 attr_tree 中插入/拆分/合并 amdgpu_svm_attr_range │ (区间树 + 链表同步维护) │ ├─▶ 计算 trigger 位掩码 (哪些属性变了) │ └─▶ 通知 svm_range 层:amdgpu_svm_range_apply_attr_change() │ ▼ 根据 trigger 决定:重建 PTE / 迁移 VRAM / 销毁重建 range

5. 关键设计:属性层与映射层解耦

attr_rangesvm_range独立的区间覆盖,粒度不同:

地址空间: 0 4K 8K 12K 16K attr_range: |←── preferred=GPU, flags=COHERENT ──────────→| (一个大区间) svm_range: |← range1 →|← range2 →| |← range3 →| (按 fault 按需创建) (已映射) (已映射) (无fault) (已映射)
  • attr_range:由用户set_attr显式创建,覆盖用户声明的整个地址范围
  • svm_range:由 GPU page fault 按需创建,只覆盖实际被 GPU 访问的页
  • svm_range需要知道某个页的属性时,调用
    amdgpu_svm_attr_lookup_page_locked()查询attr_tree

这种解耦的好处:

场景优势
用户声明 1GB 范围的属性attr_tree只存一个节点(O(1) 空间)
只有 4KB 被 GPU 访问svm_range只创建一个 4KB 范围
用户修改属性只更新attr_range,通知svm_range按需调整
GPU fault 新地址svm_range查询attr_tree获取属性

6. 内存中的对象层次

amdgpu_device (GPU 设备) └── amdgpu_vm (每个进程一个) └── amdgpu_svm (每个 fd/vm 一个) ├── drm_gpusvm gpusvm │ └── drm_gpusvm_notifier[] │ └── drm_gpusvm_range[] ← amdgpu_svm_range.base │ └── amdgpu_svm_attr_tree *attr_tree ├── rb_root_cached tree ─────────┐ └── list_head range_list ─────────┤ ▼ amdgpu_svm_attr_range ├── it_node (in tree) ├── list (in range_list) └── attrs (属性值)

7. UAPI 到内核属性的转换

用户空间通过drm_amdgpu_svm_attribute数组传递离散的 type/value 对:

// 用户空间structdrm_amdgpu_svm_attributeattrs[]={{.type=AMDGPU_SVM_ATTR_PREFERRED_LOC,.value=gpu_id},{.type=AMDGPU_SVM_ATTR_SET_FLAGS,.value=AMDGPU_SVM_FLAG_COHERENT},{.type=AMDGPU_SVM_ATTR_ACCESS,.value=gpu_id},};

内核在amdgpu_svm_attr_set()中将其聚合为一个amdgpu_svm_attrs

UAPI typeattrs 字段
ATTR_PREFERRED_LOCpreferred_loc = value
ATTR_PREFETCH_LOCprefetch_loc = value
ATTR_ACCESSaccess = ENABLE
ATTR_ACCESS_IN_PLACEaccess = IN_PLACE
ATTR_NO_ACCESSaccess = NONE
ATTR_SET_FLAGSflags |= value
ATTR_CLR_FLAGSflags &= ~value
ATTR_GRANULARITYgranularity = value
http://www.cnnetsun.cn/news/1455330.html

相关文章:

  • 3分钟搞定专业级直播抠像:OBS背景移除插件完全指南
  • LeetDown开源降级工具:让A6/A7老设备重获流畅体验的完整指南
  • 人肉暗网计划:脑电波传输敏感代码的技术架构与测试实践
  • 避坑指南:Anomalib 2.1.0训练自定义数据集时最常见的5个报错及解决方法
  • CG设计师必备:2024年最新免费资源网站大全(含教程、模型、纹理)
  • DO-178C中的MC/DC新特性:屏蔽与短路机制如何提升航空软件测试效率?
  • ComfyUI插件避坑指南:SeedVR2+Kontext组合安装常见报错解决方案
  • 从零到一:Rancher单机与高可用部署实战指南
  • 看完就会:盘点2026年顶流之选的AI论文工具
  • 开源视频下载工具AcFunDown使用指南
  • 如何让Unity游戏秒变多语言?XUnity Auto Translator全方位解决方案
  • 7大优势打造企业级React管理系统:基于Next.js 14与Shadcn UI的极速开发方案
  • LangFlow快速上手:3步搭建智能文档问答系统(附截图教程)
  • 大多数人以为高质量内容是AI搜索护城河,其实上下文护城河才是真正的生存之道
  • YOLOv7量化实战:从安装到部署的完整避坑指南(PyTorch 2.0.1+pytorch_quantization 2.1.3)
  • PROJECT MOGFACE多框架适配:PyTorch模型转换与部署优化
  • ILI9341 TFT驱动库深度解析:SPI时序、寄存器配置与SD图像加载
  • 如何通过AI技术实现音频质量的显著提升
  • 意识备份诈骗案:百万程序员买到的空白文件——软件测试从业者的专业警示与应对指南
  • 2026最权威AI论文软件排名:这些工具被高校和导师悄悄推荐
  • AD9854 DDS芯片SPI驱动开发与工程实践
  • 硬件漏洞利用:Downr1n实现iOS设备强制降级全解析
  • 深度剖析抖音无水印下载架构:从解析算法到跨平台实现
  • Intel Texture Works:如何在Photoshop中实现3倍纹理压缩效率?
  • 绝了,我用Python写了个大乐透号码生成器,居然中了50元
  • StructBERT模型AI面试官系统原型:答案语义评分与题库管理
  • 计量经济学实战指南:从模型选择到结果解读的完整流程
  • Gemma-3-12b-it企业AI助手构建:基于本地多模态能力的私有知识库问答
  • 深入QS100的SDR架构:除了NB-IoT,它如何通过‘可扩展协议’支持LoRa等自定义通信?
  • 抖音无水印视频解析工具:从需求到实践的全流程指南