加速计算

CUDA Pro 技巧:使用 CUDA_VISIBLE_DEVICES 控制 GPU 的可见性

 

作为 CUDA 开发人员,您通常需要控制应用程序使用的设备。克里斯·梅森在 Accelerware 博客上发表了一篇简短但很贴心的帖子,他写道:

Acceleware Logo您的 CUDA 应用程序需要针对特定的 GPU 吗?如果您正在编写启用 GPU 的代码,您通常会使用设备查询来选择所需的 GPUs 。然而,一个快速而简单的测试解决方案是使用环境变量 CUDA_VISIBLE_DEVICES 来限制 CUDA 应用程序看到的设备。如果您试图共享节点上的资源,或者希望启用 GPU 的可执行文件以特定的 GPU 为目标,那么这将非常有用

正如 Chris 指出的,健壮的应用程序应该使用 CUDA API 在运行时枚举和选择具有适当功能的设备。要了解如何操作,请阅读 CUDA 编程指南中的 设备标识 部分。但是 CUDA_VISIBLE_DEVICES 环境变量可以方便地将执行限制到特定设备或设备集,以便进行调试和测试。您还可以使用它来控制没有源代码的应用程序的执行,或者在一台机器上启动一个程序的多个实例,每个实例都有自己的环境和一组可见的设备。

要使用它,请将 CUDA_VISIBLE_DEVICES 设置为逗号分隔的设备 ID 列表,以使应用程序只看到这些设备。请注意,您可以使用此技术来屏蔽设备或更改设备的可见性顺序,以便 CUDA 运行时按特定顺序枚举它们。

在我们即将发布的带有统一内存的 CUDA 6 版本中, CUDA_VISIBLE_DEVICES 是有用的(参见我的 统一内存上的帖子 )。统一内存允许多个 GPUs 和 CPU 共享一个托管内存空间。 GPUs 之间的统一内存要求 GPUs 全部支持 对等内存访问 ,但在某些系统中,这种情况并非如此, GPUs 是不同型号的,或者它们连接到 PCI express 总线上的不同 I / O 控制器集线器。如果 GPUs 不是所有 P2P 兼容的,那么使用 cudaMallocManaged() 的分配将返回到 设备映射主机内存 (也称为“零拷贝”内存)。通过 PCI express 访问此内存,并且具有更低的带宽和更高的延迟。为了避免这种回退,您可以使用 CUDA_VISIBLE_DEVICES 限制应用程序在单个设备或一组与 P2P 兼容的设备上运行。

 

Tags