GPU 上的内存管理单元(MMU)

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,还能实现对关键内存区域的快速访问。

    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

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

    打赏作者

    DeeplyMind

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

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

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

    打赏作者

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

    抵扣说明:

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

    余额充值