CUDA 程序忽略了 CUDA_VISIBLE_DEVICES 变量?

CUDA 程序忽略了 CUDA_VISIBLE_DEVICES 变量?

我在装有 Ubuntu Server 14.04 和 3 个 GPU(2 个 Tesla K20C 和 1 个 GeForce GT 630)的机器上使用 CUDA 7.5。我尝试将设置CUDA_VISIBLE_DEVICES为相应的 ID,以便代码仅在两个 Tesla GPU 上运行。出于某种原因,程序似乎忽略了变量并尝试在所有 3 个 GPU 上运行代码,这会导致错误。

到目前为止,我已尝试在/etc/environmentbash.bashrc文件中设置变量(之后重新启动)。使用 时echo $CUDA_VISIBLE_DEVICES,会显示正确的值。此外,当通过 SSH 从 NSight 远程启动程序并相应地设置环境变量时,执行工作按预期进行,并且仅使用 2 个 Tesla GPU。但是当我在本地启动程序时(通过终端或通过 Web 界面的 Gearman worker),环境变量似乎被忽略了。

作为一种解决方法,我setenv("CUDA_VISIBLE_DEVICES","0,2",1)在代码中使用。但这会使我的程序不可移植。

我这里遗漏了什么?谢谢!

答案1

小黄鸭调试确实有效。

事实证明,在调用 cuInit 或 cudaSetDevice 之前使用 unsetenv 就足够了,环境变量的初始值将被忽略。

#include <stdio.h>
#include <stdlib.h>
#include <cuda.h>

int
main(int argc, char **argv, char **env)
{
  int x;
  unsetenv("CUDA_VISIBLE_DEVICES");
  cuInit(0);
  // Now we see all the devices on machine
  cuDeviceGetCount(&x);
  printf("%d\n",x);
  return 0;
}

相关内容