GPU 上的内存管理单元(MMU)可以让程序使用GPU的虚拟地址来编程,即GPUVM(GPU Virtual Memory)。
1. GPUVM 的基本概念
GPUVM 是 GPU 提供的内存管理单元功能,其作用与早期 ASIC 上的 GART(Graphics Address Remapping Table)类似。不过,和整个 GPU 仅存在一个全局 GART 表不同的是,GPUVM 在任意时刻可以有多个页表处于活跃状态。这些页表能够混合包含 VRAM 页、系统页(涵盖内存和 MMIO)。而且,系统页可被映射为被窥探的(即缓存的系统页)或者非窥探的(也就是未缓存的系统页)。
2. VMID(虚拟内存标识符)机制
- 分配方式:每一个活跃的 GPUVM 都有与之对应的 ID,即 VMID,并且每个 VMID 都关联着一个页表。在执行命令缓冲区时,内核会告知引擎该命令缓冲区要使用的 VMID。VMID 是在提交命令时动态分配的。
- 用户空间与内核的协作:用户空间驱动程序维护自身的地址空间,当提交命令缓冲区并分配 VMID 时,内核会相应地设置它们的页表。硬件在同一时间最多支持 16 个活跃的 GPUVM。
3. 页表结构与特性
- 层级结构:依据 ASIC 系列的不同,每个 GPUVM 由 1 - 2 级或者 1 - 5 级页表构成。
- 页面属性:GPUVM 支持为每页设置 RWX(读、写、执行)属性,同时还具备诸如加密和缓存属性等其他特性。
4. 特殊的 VMID 0
VMID 0 比较特殊,它是内核驱动程序使用的 GPUVM。除了由页表管理的一个 aperture(可理解为内存区域)外,VMID 0 还有其他几个 aperture。其中一个用于直接访问 VRAM,另一个是传统的 AGP aperture,其作用是将访问直接转发到匹配的系统物理地址(当存在 IOMMU 时则是 IOVA)。这些 aperture 能够直接访问相关内存,无需承担页表带来的开销。VMID 0 主要被内核驱动程序用于内存管理等任务。
5. 内存访问与页错误处理
- 访问方式:GPU 客户端借助 GPUVM 的 VMID 来访问内存。对于用户应用程序而言,每个应用都可以拥有专属的 GPUVM 地址空间。应用程序负责管理该地址空间,而内核驱动程序则为每个进程管理 GPUVM 页表。
- 错误处理:若 GPU 客户端访问了无效页面,就会产生 GPU 页错误,这和 CPU 访问无效页面的情况类似。
6. 与传统 GART 的差异
- 多个页表:GPUVM 支持同时存在多个活跃的页表,相比之下,传统 GART 只有一个全局表。
- 动态 VMID 分配:VMID 是动态分配的,这使得系统能够更高效地支持多个并发的 GPU 客户端。
- 更丰富的属性支持:GPUVM 支持 RWX、加密和缓存等多种属性,功能更为强大。
7. 在系统中的角色
GPUVM 为 GPU 提供了虚拟内存管理能力,这一点和 CPU 的 MMU 类似。它让多个应用程序能够安全且高效地共享 GPU 内存资源,同时也使内核能够对 GPU 内存进行有效管理。借助 VMID 0 的特殊 aperture,还能实现对关键内存区域的快速访问。

被折叠的 条评论
为什么被折叠?



