【发布时间】:2017-01-31 15:00:28
【问题描述】:
在多 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。
我查看了相关问题,how to choose designated GPU to run CUDA program?,但deviceQuery 命令不在 CUDA 8.0 bin 目录中。除了$CUDA_VISIBLE_DEVICES$,我看到其他帖子都提到了环境变量$CUDA_DEVICES,但是这些都没有设置,我没有找到如何使用它的信息。
虽然与我的问题没有直接关系,但使用 nbody -device=1 我能够让应用程序在 GPU 1 上运行,但使用 nbody -numdevices=2 并不能在 GPU 0 和 1 上运行。
我正在使用 bash shell、CentOS 6.8、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的行为。正确的环境变量名称中没有$。 -
您需要了解有关您正在使用的 bash shell 的更多信息。这:
CUDA_VISIBLE_DEVICES=1不会永久设置环境变量(事实上,如果这就是你在命令行上的全部内容,它真的没有任何用处。)。这:export CUDA_VISIBLE_DEVICES=1将在该会话的其余部分永久设置它。您可能想研究环境变量在 bash 中是如何工作的,以及各种命令如何影响它们,以及持续多长时间。 -
deviceQuery随 CUDA 8 提供,但您必须构建它。如果您阅读 CUDA 8 linux 安装指南,它将解释如何构建deviceQuery -
在 /usr/local/cuda/bin 中有一个 cuda-install-samples-
.sh 脚本,如果未安装示例,您可以使用该脚本。然后,在 NVIDIA_Samples 安装目录的 1_Utilities 文件夹中,您将找到 deviceQuery。只需在该文件夹中调用 make 即可为您编译它。如果我没记错的话,它会将二进制文件复制到同一个文件夹中。 -
应该是
watch -n 1 nvidia-smi...