CUDA 程式忽略 CUDA_VISIBLE_DEVICES 變數?

CUDA 程式忽略 CUDA_VISIBLE_DEVICES 變數?

我在配備 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;
}

相關內容