Ampere与Turing架构GPU中CudaMalloc共享内存分配行为差异问题
问题原因分析
这种行为差异源于Windows WDDM驱动对不同CUDA架构的内存分配策略差异,具体解释如下:
1. 不同架构下cudaMalloc的默认行为区别
- Turing及更早架构(如T1200,SM 8.6):在Windows WDDM环境中,NVIDIA驱动默认支持
cudaMalloc的透明内存超额提交——当GPU专用内存耗尽时,驱动会自动将后续的cudaMalloc请求分配到系统内存(即你所说的共享GPU内存),通过WDDM的分页机制实现内存动态调度。这就是T1200能分配到34GB(4GB专用+30GB系统内存)才崩溃的原因。 - Ampere及以后架构(如RTX3070,SM 8.7):NVIDIA对WDDM驱动的内存管理逻辑做了调整,默认关闭了
cudaMalloc的透明超额提交。此时cudaMalloc会严格限制在GPU专用内存中分配,一旦专用内存耗尽,直接返回cudaErrorMemoryAllocation错误,不会自动 fallback 到系统内存。
2. 编译配置的影响
你编译时通过CMAKE_CUDA_ARCH_BIN指定了包含Turing(8.6)和Ampere(8.7)在内的多架构目标,生成的二进制程序可兼容两种GPU,但运行时的内存分配行为由当前GPU对应的驱动逻辑决定,与编译配置无关。
3. 解决方案:实现跨内存池的分配
如果需要在Ampere及后续架构上实现类似T1200的内存超额提交效果,需替换cudaMalloc为统一内存分配接口:
cudaError_t cudaStatus = cudaMallocManaged(&costBuffer[i]->cudaBuffer, allocatedMemory);
cudaMallocManaged是CUDA统一内存的核心接口,它会自动管理内存在GPU专用内存和系统内存之间的调度,当GPU专用内存不足时,会自动使用系统内存,同时保证GPU可以透明访问这些内存。
内容的提问来源于stack exchange,提问作者Adam Kuzański
相关产品推荐
相关产品推荐

