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

Posted

技术标签:

【中文标题】按位置选择的CUDA GPU,但如何将默认设置为设备0以外的东西?【英文标题】:CUDA GPU selected by position, but how to set default to be something other than device 0? 【发布时间】:2015-10-16 04:21:24 【问题描述】:

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

Default GPU Assignment

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

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

我们将不胜感激任何要跟进的建议或相关链接。

【问题讨论】:

CUDA_VISIBLE_DEVICES 是your friend。 愿你活到一千岁..... 【参考方案1】:

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

CUDA_VISIBLE_DEVICESenvironment 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 documentation 或this writeup。

【讨论】:

以上是关于按位置选择的CUDA GPU,但如何将默认设置为设备0以外的东西?的主要内容,如果未能解决你的问题,请参考以下文章

Cuda 内核代码驻留在英伟达 GPU 上的啥位置?

如何知道 CAFFE 代码是使用 GPU 还是 CUDA 代码运行?

如何选择指定的GPU来运行CUDA程序?

如何在单独的 CUDA 函数中分配 GPU 内存?

如何远程连接运行OpenGL/Cuda 等GPU程序

如何安装cuda