CUDA Unified Memory 自 2014 年随 CUDA 6 发布以来,经历了从「自动迁移」到「可编程虚拟内存管理」的彻底演进。在 CUDA 12 中,全新的虚拟内存管理 API(VMM API)将显存管理的粒度从「指针层」下探到「物理页层」,赋予开发者构造任意内存拓扑的能力。本文从工程实战角度,深入剖析 Unified Memory 的内部机制、页面迁移策略以及生产环境中的 OOM 治理方案。
一、内存模型演进:从 cudaMalloc 到 cuMemMap
1.1 三代架构概览
CUDA 统一内存模型经历了三个明确的演进阶段:
| 时代 | CUDA 版本 | 核心能力 | API |
|---|---|---|---|
| UVM 1.0 | CUDA 6–7 | 按需迁移,CPU/GPU 共享指针 | cudaMallocManaged |
| UVM 2.0 | CUDA 8–11 | 超量分配,GPU 缺页中断 | cudaMallocManaged 属性控制 |
| VMM 原生 | CUDA 12 | 可编程页表,独立物理分配 | cuMemCreate / cuMemMap |
早期 UVM 模型下,cudaMallocManaged 分配的是一个逻辑地址空间,物理内存驻留在 CPU 或 GPU 的任意一端。当 GPU 发生全局内存访问时,若对应页面不在本地显存中,则触发 GPU 缺页中断(Page Fault),CUDA Driver 将所需页面从 CPU 迁移至 GPU 显存。
1.2 VMM API 的核心原语
CUDA 12 引入的 VMM 管理 API 将「物理分配」与「地址映射」解构为独立操作:
// 1. 分配物理内存块
CUmemGenericAllocationHandle handle;
CUmemAllocationProp prop = {};
prop.type = CU_MEM_ALLOCATION_TYPE_PINNED;
prop.location.type = CU_MEM_LOCATION_TYPE_DEVICE;
prop.location.id = 0; // GPU 0
cuMemCreate(

发表评论 取消回复