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

为何读取CUDA统一内存会导致后续GPU内核运行变慢?

问题解答

为什么CPU只读UM数组会导致后续GPU内核变慢?

CUDA Unified Memory的默认页迁移策略是按需迁移且当前访问者获得页所有权。当CPU读取UM中的某一页时,CUDA会将该页从GPU内存迁移到CPU内存(哪怕只是只读操作)——因为UM默认认为当前访问的处理器(CPU)需要独占该页的访问权。后续GPU内核再访问这些页时,又需要把页从CPU迁回GPU,这个跨PCIe的页迁移过程会带来显著延迟,表现为GPU内核运行大幅变慢,本质和页错误的开销类似。

无需cudaMemPrefetchAsync的优化方法

  • 用cudaMemAdvise设置访问策略:
    针对GPU为主访问者、CPU偶尔只读的场景,可对UM数组设置两个关键建议:
    1. 设置cudaMemAdviseSetPreferredLocation为你的GPU设备ID,告诉CUDA优先把页留在GPU;
    2. 设置cudaMemAdviseSetReadMostly,允许CPU只读访问时不触发页迁移,直接通过PCIe读取GPU上的页(需硬件支持)。
      示例代码:
    cudaMemAdvise(um_array, array_size, cudaMemAdviseSetPreferredLocation, gpu_device_id);
    cudaMemAdvise(um_array, array_size, cudaMemAdviseSetReadMostly, cudaCpuDeviceId);
    
  • 主动复制需要CPU读取的部分:
    不要直接读取UM数组,而是在需要CPU获取结果时,用cudaMemcpy把目标片段从UM数组复制到CPU端的普通内存(比如malloc分配的数组)。这样UM数组的页始终留在GPU,后续GPU内核访问不会有迁移开销,也不需要预取操作。
  • 使用cudaMallocManaged的cudaMemAttachGlobal标志:
    分配UM内存时指定cudaMemAttachGlobal,允许CPU和GPU同时访问内存页(部分硬件支持),避免因访问者切换触发的页迁移。不过该特性依赖硬件和系统支持,需测试验证。

directManagedMemAccessFromHost支持的系统

这个特性允许CPU直接访问GPU上的UM页而不触发迁移,需要满足以下条件:

  • GPU架构:Pascal及以后的NVIDIA GPU(比如GTX 10系列、Tesla P系列、RTX 20/30/40系列等)
  • 操作系统:
    • Windows:Windows 10 1809版本及以上、Windows 11
    • Linux:内核版本4.15及以上的发行版(比如Ubuntu 18.04+、CentOS 8+)
  • CUDA版本:CUDA 10.0及以上
  • 系统配置:GPU需处于直接访问模式(桌面平台独立GPU一般默认支持;笔记本需禁用Optimus等双显卡切换机制,确保GPU直接连接到PCIe总线)

内容的提问来源于stack exchange,提问作者Huy Le

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 17:42:20