【发布时间】:2012-01-09 06:16:50
【问题描述】:
我正在从外部连接到 GPU 集群,但我不知道如何选择运行我的 CUDA 程序的设备。
我知道集群中有两个 Tesla GPU,我想从中选择一个。
有什么想法吗?当有许多连接到您的计算机时,您如何选择要使用的设备?
【问题讨论】:
标签: cuda
我正在从外部连接到 GPU 集群,但我不知道如何选择运行我的 CUDA 程序的设备。
我知道集群中有两个 Tesla GPU,我想从中选择一个。
有什么想法吗?当有许多连接到您的计算机时,您如何选择要使用的设备?
【问题讨论】:
标签: cuda
在运行时 API 中选择设备的规范方法是使用 cudaSetDevice。这将配置运行时在指定设备上执行惰性上下文建立。在 CUDA 4.0 之前,这个调用实际上并没有建立上下文,它只是告诉运行时要尝试和使用哪个 GPU。从 CUDA 4.0 开始,此调用将在调用时在指定的 GPU 上建立上下文。还有cudaChooseDevice,它将在可用设备中进行选择,以找到符合呼叫者提供的标准的设备。
您可以使用cudaGetDeviceCount 枚举系统上可用的GPU,并使用cudaGetDeviceProperties 检索它们的详细信息。 SDK deviceQuery 示例显示了如何执行此操作的完整详细信息。
但是,您可能需要注意如何在多 GPU 系统中选择 GPU,具体取决于主机和驱动程序配置。在 Linux 和 Windows TCC 驱动程序中,都存在将 GPU 标记为“计算排他性”的选项,这意味着驱动程序将每次将每个 GPU 限制为一个活动上下文,或者禁止计算,这意味着没有 CUDA 程序可以在该设备上建立上下文。如果您的代码尝试在计算禁止设备或正在使用的计算独占设备上建立上下文,则结果将是无效设备错误。在策略是使用计算排他性的多 GPU 系统中,正确的方法不是尝试选择特定的 GPU,而只是允许隐式发生惰性上下文建立。驱动程序将自动选择一个空闲的 GPU 供您的代码运行。通过使用cudaGetDeviceProperties 调用读取cudaDeviceProp.computeMode 字段,可以检查任何设备的计算模式状态。请注意,您可以随意检查不可用或禁止的 GPU 并查询它们的属性,但任何需要建立上下文的操作都会失败。
请参阅所有这些 calls 的运行时 API 文档
【讨论】:
CUDA_VISIBLE_DEVICES 环境变量。 (devblogs.nvidia.com/parallelforall/…)
您可以将环境变量 CUDA_VISIBLE_DEVICES 设置为以逗号分隔的设备 ID 列表,以使应用程序只能看到这些设备。使用它来屏蔽设备或更改设备的可见性顺序,以便 CUDA 运行时以特定顺序枚举它们。
【讨论】: