6月底,NVIDIA悄悄发布CUDA Toolkit12.2。
新发布的版本引入了异构内存管理(Heterogeneous Memory Management,HMM),实现了主机内存和加速器设备之间的数据无缝共享。
HMM仅在Linux上受支持,并需要使用较新的内核(6.1.24+或6.2.11+)。
HMM要求使用NVIDIA的GPU开放内核模块驱动程序。由于这是HMM的首个发布版本,存在一些限制:
▶ 尚不支持对文件支持的内存进行GPU原子操作。
▶ 尚不支持Arm CPU。
▶ HMM尚不支持HugeTLBfs页面(这是一种罕见的情况)。
▶ 在尝试在父进程和子进程之间共享可访问GPU的内存时,fork()系统调用尚不完全支持。
▶ HMM尚未完全优化,可能比使用cudaMalloc()、cudaMallocManaged()或其他现有CUDA内存管理API的程序性能较慢。不使用HMM的程序的性能不会受到影响。
▶ Linux上默认启用Lazy Loading功能(在CUDA 11.7中引入)。在启动之前,要禁用此功能,请设置环境变量CUDA_MODULE_LOADING=EAGER。Windows的默认启用将在未来的CUDA驱动程序发布中实现。要在Windows上启用此功能,请设置环境变量CUDA_MODULE_LOADING=LAZY。 ▶ 主机NUMA内存分配:使用CUDA虚拟内存管理API或CUDA流有序内存分配器,分配CPU内存以针对特定的NUMA节点。应用程序必须确保在访问设备上通过这些API支持的指针的主机分配之后,仅在显式请求了内存在访问设备上的可访问性后才执行设备访问。无论设备是否支持可分页内存访问,都不允许从没有地址范围可访问性的设备访问这些主机分配。
▶ 增加了CUDA多进程服务(MPS)的运行时客户端优先级映射。这允许在MPS下运行的多个进程在粗粒度级别上在多个进程之间进行优先级仲裁,而无需更改应用程序代码。
NVIDIA 引入了一个新的环境变量CUDA_MPS_CLIENT_PRIORITY,它接受两个值:NORMAL优先级,0,和BELOW_NORMAL优先级,1。
例如,给定两个客户端,可能的配置如下:
// 客户端1的环境
export CUDA_MPS_CLIENT_PRIORITY=0 // NORMAL优先级
// 客户端2的环境
export CUDA_MPS_CLIENT_PRIORITY=1 // BELOW NORMAL优先级