

英伟达的统一虚拟内存(UVM)在设计逻辑上与CPU虚拟内存高度相似,但GPU的缺页异常(Page Fault)开销远高于CPU。不过,这种高开销的成因和大众普遍认知并不相同。本文将详细拆解UVM缺页异常的完整执行流程、性能特点,以及统一内存的高性能使用原则。

统一虚拟内存沿用了CPU虚拟内存的核心思想:让CPU和GPU共享同一个虚拟地址空间,无需开发者手动区分设备内存与主机内存。系统会根据数据访问需求,按需迁移内存页;当访问的内存页不在当前处理器的常驻内存中时,就会触发缺页异常,这是UVM机制的核心运行规则。
当GPU访问未常驻的内存数据时,会触发一套完整的硬件+驱动协同处理流程,具体分为6个步骤:
GPU的一个线程束(Warp)发起数据读取指令,其中任意一条线程的访问地址,在流式多处理器(SM)的页表缓存(TLB)中无匹配记录。此时GPU内存管理单元(GMMU)会主动遍历系统页表,最终确认没有有效的内存页映射条目,正式触发缺页异常。
系统登记本次缺页异常,并强制触发异常的整个线程束暂停执行。需要重点注意:仅当前出错的线程束停滞,GPU核心上的其他线程束会正常运行,不会出现整块GPU闲置的情况,最大程度保障了GPU的算力利用率。
GMMU会将本次缺页异常信息写入GPU内存中的环形异常缓冲区,同时生成硬件中断信号,通过PCIe总线传输给电脑主机(CPU端),等待系统驱动处理。
主机端的nvidia-uvm.ko内核驱动被唤醒,一次性批量读取缓冲区中的异常信息(单次最多可处理256个缺页异常),并整合分析所有异常地址,精准定位出需要迁移的2MB内存区域,避免零散处理造成的资源浪费。
GPU拷贝引擎启动数据迁移工作,数据通过PCIe总线在主机内存和GPU内存之间传输。不同于CPU单次4KB单页的迁移方式,UVM会以64KB为基础块,搭配预取机制批量传输数据,大幅提升内存迁移的吞吐效率。
驱动完成数据迁移后,会同步更新CPU、GPU两端的页表映射信息,清除失效的TLB缓存条目,避免地址映射冲突。随后下发指令让停滞的线程束重新执行,程序恢复正常运行。
完整的UVM缺页流程需要两次跨PCIe交互:一次是GPU向主机发送中断信号,一次是主机向GPU迁移数据,这导致一次统一内存缺页的延迟可达毫秒级,远高于普通CPU轻量缺页。但这并不代表“GPU缺页性能不如CPU”,核心误区有三点:
想要充分发挥统一内存的性能优势,规避不必要的性能损耗,开发调优需遵循三大核心原则: