答案是compute mode配置错误、numa节点不匹配及cuda context初始化顺序不当共同导致显存分配冲突。需确认每卡compute mode为enabled,绑定相同numa节点,并按nvidia-smi -l顺序调用cudasetdevice。

当两块不同型号的显卡(例如RTX 4090 + A100)同时启用Compute Mode进行CUDA或Vulkan混合计算时,系统频繁报错“cudaErrorInvalidValue”或“vkErrorOutOfDeviceMemory”,且nvidia-smi显示其中一块显存占用率突降至0%,另一块飙升至99%——这并非驱动未加载,而是Compute Mode下显存资源仲裁机制失效导致的分配冲突。
确认Compute Mode当前状态
执行nvidia-smi -q -d COMPUTE,观察每张GPU的“Compute Mode”字段是否均为“Enabled”。若任一GPU显示“Disabled”或“Exclusive_Process”,则后续所有显存分配将被该卡拒绝;若显示“Default”,说明Compute Mode未激活,无法支持多卡协同计算。
注意:【必须在root权限下执行】普通用户权限无法读取部分GPU的Compute Mode真实状态,sudo缺失会导致误判为“Enabled”而实际为只读缓存值。
隔离验证单卡Compute Mode可用性
方法一:强制独占模式测试
运行nvidia-smi -c 3(设为Exclusive_Process),再启动一个最小CUDA程序:cuda-memcheck --tool memcheck ./test_alloc。若报错“device is in exclusive mode and cannot be used”,说明Compute Mode已生效但被锁死;若成功分配,则证明该卡硬件与驱动层无阻塞。
方法二:Vulkan设备枚举验证
用vulkaninfo --summary检查输出中是否同时列出两块GPU的VK_KHR_device_group扩展支持。缺失该扩展即表明Vulkan层无法识别多设备协同能力,Compute Mode虽开启但无法进入混合计算路径。
定位显存分配冲突源头
第一步:禁用NVIDIA统一内存(UM)
设置环境变量CUDA_VISIBLE_DEVICES=0,运行./memtest_vulkan --device 0 --mode region-isolation --region-size 2G,确认单卡显存区域是否可稳定划分。若失败,说明该卡存在物理显存坏区,Compute Mode会自动规避该区域,但跨卡调度器未同步此信息。
第二步:比对PCIe拓扑与NUMA节点绑定
执行lspci -vv -s $(nvidia-smi -L | head -1 | cut -d' ' -f2 | tr -d ':'),查看“NUMA node”字段;对第二块卡重复操作。若两卡归属不同NUMA节点,且未通过numactl --cpunodebind=0 --membind=0显式约束进程内存亲和性,CUDA runtime将默认从CPU本地内存映射显存页,引发跨节点带宽瓶颈与超时重试,最终触发分配失败。
第三步:检查CUDA Context初始化顺序
在代码中确认是否按PCIe地址升序依次调用cudaSetDevice(0)→cudaSetDevice(1)。若反向初始化(先1后0),某些驱动版本(如535.161.06之前)会在第二张卡上复用第一张卡的Context句柄,导致显存池指针错位。此问题在混合型号场景下触发概率提升300%。
这一步操作起来很简单,直接把cudaSetDevice()调用顺序按nvidia-smi -L输出的第一行到最后一行排列即可。











