AMD KFD的BO设计分析系列 0:开篇

开启 GPU 存储探索系列

终于要开启我此前一直不敢触碰的 GPU 存储系列了。先放一张图,把核心关系直观呈现出来,以此作为这个系列的起点,并以此纪念。

AMD的显卡和计算卡驱动中的buffer object(BO)实现,是学习gem和ttm技术使用的完美教程。欢迎想理解和学习这些技术的驱动开发人员一起探讨(请点击文末社区链接,入群探讨与学习)。

注:图中 “kfdm_mm” 为笔误,正确应为 “kgd_mem”,此处不做修改,还望大家理解。

对这个图做个简单解释:一个BO有两部分组成:虚拟地址部分和物理地址部分。

对于普通用户态应用程序,其访问的变量地址均为进程独立的虚拟地址。该虚拟地址通过内存管理单元(MMU)的映射机制,关联到实际的物理内存地址 —— 即 CPU 可直接寻址的物理地址。

在涉及 GPU 的应用场景中,BO需支持 CPU 访问、GPU 访问及 DMA 访问等多场景需求,不同访问者(CPU、GPU、DMA)基于自身的地址映射体系,形成了对同一 BO 的不同地址视角,即对应不同的地址空间。本系列重点聚焦于 GPU 访问视角下的地址空间相关机制和实现。CPU视角就是mmap技术,具体请查看专栏:linux drm子系统专栏介绍 。

  • 虚拟地址部分(VA, Virtual Address):由 GPU 虚拟地址空间相关的结构体(如 amdgpu_vm、amdgpu_bo_va、amdgpu_bo_va_mapping 等)管理,负责描述和维护 BO 在 GPU 虚拟空间中的信息。

  • 物理地址部分(PA, Physical Address):由 TTM 框架相关结构体(如 ttm_resource、ttm_tt)管理,负责分配和维护 BO 实际对应的物理存储区域(如 VRAM、GTT)。

BO 通过将虚拟地址部分和物理地址部分结合,实现了 GPU 存储对象的完整抽象。再加上 VA 和 PA 各自的管理器,以及两者之间的映射关系结构体,构成了 GPU 存储系统的整体实现框架。这种设计既保证了虚拟空间的灵活映射,也确保了物理资源的高效分配与管理。

本专栏涉及的概念和代码都很多,整个系列最好按我给出的顺序阅读,因为我按照最佳实践对文章进行了排序。通常,每篇博文中都会有承前启后的文档链接。请关注这些链接。

Let's go, enjoy the journey.

对于从事GPU驱动开发或者图形、计算应用的开发人员,对BO的概念有一个较清晰的认识的话,可以直接从框架分析入手。链接如下:

DRM-01:GEM显存管理

DRM-02:TTM与GEM的关系

对于还不熟悉BO的朋友,可以从BO的基本概念入手。链接如下:

AMD KFD的BO设计分析系列:Buffer Object概览

当然,最后是殊途同归,理论指导实践,实践验证理论。


技术交流,欢迎加入社区:GPUers

08-24
<think>我们正在处理一个关于AMD KFD (Kernel Fusion Driver) 的技术详解及开发指南的请求。根据提供的引用,我们可以整合以下信息: 1. KFD的作用:负责异构计算(如ROCm/HSA)下的GPU资源管理,特别是管理用户空间队列提交的任务,高效管理进程的显存(VRAM)和系统内存(GTT)资源[^1]。 2. KFD中的event机制:是用户空间与内核、GPU之间进行异步事件通知和同步的核心基础,提供事件等待、信号、异常和调试等能力[^2]。 3. KFDDRM的交互:在获取VM(虚拟内存)时,KFD会调用DRM分配的amdgpu_vm并再次初始化[^3]。 4. KFD的中断处理:为每个GPU节点注册中断处理类,不同代GPU有不同的实现,主要区别在中断上半部和下半部的处理函数[^4]。 5. Doorbell机制:实现用户空间与硬件高效通信,通过PCIe BAR2映射寄存器区间,驱动负责doorbell索引的分配、映射、权限管理和回收[^5]。 现在,我们将根据这些信息构建一个详细的回答,包括KFD的技术概述、核心机制(如event、doorbell、中断)以及开发中的关键点。同时,我们将按照要求使用LaTeX格式行内公式($...$)和独立公式($$...$$),并生成相关问题。 注意:由于引用内容有限,我们主要基于提供的引用进行整合,并适当补充通用知识(确保真实可靠)来构建回答。</think>### AMD KFD (Kernel Fusion Driver) 技术详解及开发指南 #### 一、KFD 概述 KFDAMD GPU 驱动中负责异构计算(如 ROCm/HSA)资源管理的核心模块,主要功能包括: 1. **资源虚拟化**:管理用户空间队列提交的任务,高效分配显存(VRAM)和系统内存(GTT)资源[^1]。 2. **硬件抽象**:为不同代 GPU(如 GFX10/GFX11)提供统一接口,其架构满足关系: $$ \text{KFD} \subseteq \text{AMDGPU驱动} \subseteq \text{Linux内核} $$ 3. **进程隔离**:通过虚拟内存管理(VM)实现多进程安全隔离,在 `kfd_ioctl_acquire_vm` 中初始化 DRM 分配的 `amdgpu_vm` 对象[^3]。 #### 二、核心机制详解 1. **Event 异步通知机制** - **设计目标**:提供用户空间与 GPU 的低延迟事件同步(如任务完成、异常通知)[^2]。 - **实现流程**: ```mermaid graph LR A[用户空间] -->|注册事件| B[KFD Event] B -->|中断触发| C[ISR 上半部] C -->|Workqueue| D[ISR 下半部] D -->|通知用户进程| A ``` - **中断处理**:每代 GPU 实现独立的 `event_interrupt_class`,包含: - `.interrupt_isr`:快速中断判定(上半部) - `.interrupt_wq`:异步事件处理(下半部)[^4] 2. **Doorbell 通信机制** - **硬件基础**:通过 PCIe BAR2 映射寄存器区间,实现用户空间直接读写。 - **驱动职责**: - Doorbell 索引分配与回收 - 内存映射权限控制(`mmap` 实现) - 多进程并发管理[^5] - **性能优势**:延迟公式 $t_{\text{doorbell}} \ll t_{\text{syscall}}$,实现无锁任务提交。 3. **VM 虚拟内存管理** - **双初始化问题**:DRM 首次初始化 `amdgpu_vm` 后,KFD 在 `acquire_vm` 调用链中再次初始化[^3]。 - **内存隔离**:满足多进程安全要求: $$ \forall P_i \in \text{Processes}, \quad \text{VM}(P_i) \cap \text{VM}(P_j) = \emptyset \quad (i \neq j) $$ #### 三、开发实践指南 1. **中断处理开发** ```c // 示例:GFX11 中断处理类注册 static const struct kfd_event_interrupt_class gfx11_interrupt_class = { .interrupt_isr = gfx11_event_interrupt_isr, .interrupt_wq = gfx11_event_interrupt_wq, }; int kfd_gfx11_interrupt_init(struct kfd_node *dev) { dev->event_interrupt_class = &gfx11_interrupt_class; // 注册到节点 } ``` 2. **Doorbell 映射实现** - **用户空间映射**:通过 `ioctl(KFD_IOC_ALLOC_QUEUE_DOORBELL)` 获取 doorbell ID。 - **内核映射**:`kfd_doorbell_mmap()` 将 PCI BAR2 区域映射到用户空间[^5]。 3. **调试建议** - 使用 `trace_kfd_events` 追踪 event 生命周期 - 通过 `debugfs` 检查 doorbell 分配状态 - 监控 VM 泄漏:`amdgpu_vm_fini` 调用计数 #### 四、性能优化关键 1. **Event 延迟优化**:采用 MSI-X 中断 + 分层处理(ISR 轻量化)。 2. **Doorbell 批处理**:聚合任务提交减少 MMIO 写入次数。 3. **VM 缓存复用**:跨进程共享只读 VM 段,减少重复初始化开销[^3]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DeeplyMind

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值