You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 01:57:46