CUDA GPU是按位置选择的,但是如何将default设置为设备0以外的值?

tdi*_*ddy 2 cuda nvidia gpu-programming

我最近在家中的机器上安装了第二个GPU(Tesla K40),我的搜索建议第一个PCI插槽成为为CUDA作业选择的默认GPU。一个很棒的链接正在解释它,可以在这里找到:

默认GPU分配

我最初的GPU是TITAN X,也支持CUDA,但它实际上最适合单精度计算,而Tesla则更适合双精度。对于该小组,我的问题是是否有办法将我的默认CUDA编程设备始终设置为第二个?显然,我每次都可以在代码中指定要使用的设备,但是我希望可以对设备进行配置,使其始终默认使用特斯拉卡。

还是打开包装盒并实际交换设备位置的唯一方法?不知怎么对我来说...

任何建议或相关链接可以跟进。

Rob*_*lla 6

正如您已经指出的那样,cuda运行时具有自己的启发式功能,可用于订购GPU并为其分配设备索引。

CUDA_VISIBLE_DEVICES 环境变量将允许你修改这个排序。

例如,假设在普通使用中,我的显示设备被枚举为设备0,而我首选的CUDA GPU被枚举为设备1。cudaSetDevice例如,不使用任何编写的应用程序将默认使用枚举为0的设备。我想更改此设置,在Linux下,我可以使用类似以下内容的命令:

CUDA_VISIBLE_DEVICES="1" ./my_app
Run Code Online (Sandbox Code Playgroud)

导致cuda运行时将通常是设备1的设备枚举为该应用程序运行的设备0(在这种情况下,普通设备0从CUDA中“隐藏”)。您只需导出该变量(例如bash),即可将该会话设置为“永久”:

export CUDA_VISIBLE_DEVICES="1"
./my_app
Run Code Online (Sandbox Code Playgroud)

如果我只是想颠倒默认的CUDA运行时顺序,但仍然使两个GPU均可用于应用程序,则可以执行以下操作:

CUDA_VISIBLE_DEVICES="1,0" ./deviceQuery
Run Code Online (Sandbox Code Playgroud)

还有其他规范选项,例如使用提供的GPU UUID标识符(而不是设备索引)nvidia-smi

也请参考文档本文