我在配備 Ubuntu Server 14.04 和 3 個 GPU 的電腦上使用 CUDA 7.5:2 個 Tesla K20C 和 1 個 GeForce GT 630 CUDA_VISIBLE_DEVICES
。由於某種原因,程式似乎忽略了該變數並嘗試在所有 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;
}