按位置选择的 CUDA GPU,但如何将默认值设置为设备 0 以外的其他值?
CUDA GPU selected by position, but how to set default to be something other than device 0?
我最近在家里的机器上安装了第二个 GPU (Tesla K40),我的搜索表明第一个 PCI 插槽成为为 CUDA 作业选择的默认 GPU。可以在此处找到很棒的 link 解释:
Default GPU Assignment
我原来的 GPU 是 TITAN X,也启用了 CUDA,但它确实最适合单精度计算,而 Tesla 更适合双精度。我对小组的问题是是否有办法将我的默认 CUDA 编程设备设置为始终是第二个?显然我每次都可以在代码中指定要使用的设备,但我希望我可以配置我的设备,使其始终默认使用 Tesla 卡。
或者是打开盒子并物理交换设备位置的唯一方法?不知何故,这对我来说似乎是错误的....
如有任何建议或相关 link 要跟进,我们将不胜感激。
正如您已经指出的,cuda 运行time 有 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 将 "hidden" 来自CUDA,在这种情况下)。您可以简单地通过导出该变量(例如,bash)为会话创建 "permanent":
export CUDA_VISIBLE_DEVICES="1"
./my_app
如果我只是想反转默认的 CUDA 运行时间顺序,但仍然让两个 GPU 都可供应用程序使用,我可以这样做:
CUDA_VISIBLE_DEVICES="1,0" ./deviceQuery
还有其他规范选项,例如使用 nvidia-smi
提供的 GPU UUID 标识符(而不是设备索引)。
也参考the documentation or this writeup。
我最近在家里的机器上安装了第二个 GPU (Tesla K40),我的搜索表明第一个 PCI 插槽成为为 CUDA 作业选择的默认 GPU。可以在此处找到很棒的 link 解释:
Default GPU Assignment
我原来的 GPU 是 TITAN X,也启用了 CUDA,但它确实最适合单精度计算,而 Tesla 更适合双精度。我对小组的问题是是否有办法将我的默认 CUDA 编程设备设置为始终是第二个?显然我每次都可以在代码中指定要使用的设备,但我希望我可以配置我的设备,使其始终默认使用 Tesla 卡。
或者是打开盒子并物理交换设备位置的唯一方法?不知何故,这对我来说似乎是错误的....
如有任何建议或相关 link 要跟进,我们将不胜感激。
正如您已经指出的,cuda 运行time 有 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 将 "hidden" 来自CUDA,在这种情况下)。您可以简单地通过导出该变量(例如,bash)为会话创建 "permanent":
export CUDA_VISIBLE_DEVICES="1"
./my_app
如果我只是想反转默认的 CUDA 运行时间顺序,但仍然让两个 GPU 都可供应用程序使用,我可以这样做:
CUDA_VISIBLE_DEVICES="1,0" ./deviceQuery
还有其他规范选项,例如使用 nvidia-smi
提供的 GPU UUID 标识符(而不是设备索引)。
也参考the documentation or this writeup。