在多GPU计算机中,我该如何指定CUDA作业应在哪个GPU上运行?
例如,在安装CUDA时,我选择安装了NVIDIA_CUDA-<#.#>_Samples
,然后运行了几个nbody
模拟实例,但它们都在GPU 0上运行; GPU 1完全空闲(使用watch -n 1 nvidia-dmi
进行监视)。 使用以下命令检查CUDA_VISIBLE_DEVICES
echo $CUDA_VISIBLE_DEVICES
我发现这个没有设置。我试过使用以下方法进行设置:
CUDA_VISIBLE_DEVICES=1
然后再次运行 nbody
,但它也转到了GPU 0。
我查看了相关问题 如何选择指定的GPU来运行CUDA程序?,但是 deviceQuery
命令不在CUDA 8.0 bin目录中。除了 $CUDA_VISIBLE_DEVICES$
,我看到其他帖子提到环境变量 $CUDA_DEVICES
,但这些没有设置,我也没有找到如何使用它的信息。
虽然与我的问题没有直接关系,但使用 nbody -device = 1
我能够使应用程序在GPU 1上运行,但是使用 nbody -numdevices = 2
没有在GPU 0和1上运行。
我正在测试一个在CentOS 6.8上使用bash shell、CUDA 8.0、2个GTX 1080 GPU和NVIDIA驱动程序367.44的系统。
我知道在使用CUDA编写时可以管理和控制使用哪些CUDA资源,但当运行已编译的CUDA可执行文件时,我该如何从命令行管理这些资源呢?
nbody
应用程序具有命令行选项,可选择要运行的 GPU-您可能需要研究该代码。 对于更一般的情况,“CUDA_VISIBLE_DEVICES”应该可以使用。 如果不行,您可能没有正确使用它,您应该给出一个完整的尝试示例。 您还应该指示您正在使用哪个操作系统,对于Linux,要使用什么shell(例如bash、csh等)。deviceQuery
对此没有必要,它只是一个示例应用程序,用于演示CUDA_VISIBLE_DEVICES
的行为。 正确的环境变量名称中没有$
符号。 - Robert CrovellaCUDA_VISIBLE_DEVICES=1
并不能永久地设置环境变量(实际上,如果你在命令行上只输入这个命令,它几乎没有什么用处)。这个命令:export CUDA_VISIBLE_DEVICES=1
将永久地为该会话设置它。你可能想要学习关于环境变量在bash中如何工作、各种命令对它们产生的影响以及持续时间等方面的知识。 - Robert CrovelladeviceQuery
是 CUDA 8 提供的,但您需要构建它。如果您阅读了 Linux 的 CUDA 8 安装指南,它将解释如何构建deviceQuery
。 - Robert Crovellawatch -n 1 nvidia-smi
... - oliversmexport CUDA_VISIBLE_DEVICES=$((( RANDOM % 8 )))
- Charlie Parker