在GPU虚拟化与内存管理领域,GART(Graphics Aperture Remapping Table)和GPUVM(GPU Virtual Memory)页表是两种关键的内存映射机制。作为AMD GPU驱动架构的核心组件,KFD(Kernel Fusion Driver)需要高效管理这两种页表以实现硬件资源的最优调度。
这个系列的第8-8篇将深入对比两种页表的设计差异,这对开发者而言具有三重价值:
GART是传统的GPU内存映射方案,主要特点包括:
典型应用场景包括:
c复制// GART映射示例
gart_map(device, virtual_addr, physical_addr, size, flags);
GPUVM是新一代虚拟化方案,关键特性有:
内存映射操作示例:
c复制// GPUVM映射流程
gpuvm_map(device, vm_id, va_range, physical_pages, prot_flags);
| 指标 | GART | GPUVM |
|---|---|---|
| TLB命中率 | 中等(固定页) | 高(可变页) |
| 遍历延迟 | 1-2周期 | 3-5周期 |
| 并行能力 | 单通道 | 多VM并发 |
实测数据显示:
两种方案的内存占用差异显著:
内存占用计算公式:
code复制GART_size = aperture_size / page_size * entry_size
GPUVM_size = active_va_ranges * (n_levels * 512 + leaf_entries)
Buffer Object(BO)是两种页表共用的核心结构:
c复制struct amdgpu_bo {
struct ttm_buffer_object tbo;
struct amdgpu_mem_mgr *manager;
union {
struct gart_mapping gart;
struct gpuvm_mapping vm;
};
};
关键操作流程:
GART更新流程:
GPUVM更新优化:
| 场景 | 推荐方案 | 调优参数 |
|---|---|---|
| 视频编码 | GART | 2MB页, write-combined |
| 机器学习训练 | GPUVM | 64KB页, read-ahead |
| 图形渲染 | 混合模式 | 关键资源用GPUVM |
问题1:GPUVM导致的内存泄漏
amdgpu_vm_stats问题2:GART映射性能下降
cat /sys/kernel/debug/amdgart/stats通过KFD接口实现混合管理:
c复制struct kfd_page_table_ops {
int (*map)(struct kfd_process *p, uint64_t va, ...);
int (*unmap)(struct kfd_process *p, uint64_t va);
};
// 注册自定义操作
kfd_register_pt_ops(dev, &custom_ops);
NUMA架构下的最佳实践:
某3A游戏在混合页表策略下的表现:
关键实现:
python复制# 资源分类策略
if resource.is_texture():
use_gart(large_page=True)
elif resource.is_compute():
use_gpuvm(prefetch=True)
矩阵运算性能对比(TFLOPS):
| 矩阵规模 | GART | GPUVM | 提升 |
|---|---|---|---|
| 1024x1024 | 12.4 | 14.7 | 18.5% |
| 4096x4096 | 9.8 | 11.2 | 14.3% |
新一代统一内存管理架构特点:
当前开发分支特性预览:
diff复制+ amdgpu: Add unified page table framework
+ drm/amdkfd: Support hybrid page table mode
- Remove legacy GART-only path