CUDA GPU按位置选择,但如何将默认设置为设备0以外的其他东西?

时间:2015-07-25 16:03:18

标签: cuda nvidia gpu-programming

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

Default GPU Assignment

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

或者是打开盒子和物理交换设备位置的唯一方法吗?不知怎的,这对我来说似乎不对......

非常感谢任何建议或相关的后续跟进链接。

干杯,

老爹

1 个答案:

答案 0 :(得分:5)

正如您已经指出的那样,cuda运行时具有its own heuristic用于订购GPU并为其分配设备索引。

CUDA_VISIBLE_DEVICES environment variable将允许您修改此排序。

例如,假设在正常使用中,我的显示设备被枚举为设备0,我首选的CUDA GPU被枚举为设备1.例如,在没有使用cudaSetDevice的情况下编写的应用程序将默认为使用枚举为0的设备。如果我想改变它,在linux下我可以使用类似的东西:

CUDA_VISIBLE_DEVICES="1" ./my_app

使cuda运行时枚举通常将设备1作为此应用程序运行的设备0的设备(并且在这种情况下普通设备0将从CUDA“隐藏”)。您可以通过导出该变量(例如,bash)来使会话成为“永久性”:

export CUDA_VISIBLE_DEVICES="1"
./my_app

如果我只想反转默认的CUDA运行时顺序,但仍然可以使应用程序使用这两个GPU,我可以这样做:

CUDA_VISIBLE_DEVICES="1,0" ./deviceQuery

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

也请参阅the documentationthis writeup