我在装有 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/environment
和bash.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;
}