2012-01-09 134 views

回答

9

在运行时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

+3

另一种解决方案是使用'CUDA_VISIBLE_DEVICES'环境变量。 (https://devblogs.nvidia.com/parallelforall/cuda-pro-tip-control-gpu-visibility-cuda_visible_devices/) – Soravux 2016-09-07 20:39:46

1

运行时API文档,你可以设置环境变量CUDA_VISIBLE_DEVICES以逗号分隔的设备ID列表仅做这些设备可见的应用程序。使用它可以屏蔽设备或更改设备的可见性顺序,以便CUDA运行时按特定顺序枚举它们。