运行CUDA可执行文件时如何选择设备?

10
我正在从外部连接到一个GPU集群,但我不知道如何选择要在其上运行CUDA程序的设备。
我知道该集群中有两个Tesla GPU,并且我想选择其中一个。
有什么建议吗?当计算机连接多个设备时,如何选择要使用的设备?
2个回答

14
选择运行时API中设备的规范方式是使用cudaSetDevice。这将配置运行时在指定设备上执行惰性上下文建立。在CUDA 4.0之前,此调用实际上并没有建立上下文,它只通知运行时尝试使用哪个GPU。自CUDA 4.0以来,此调用将在调用时在指定的GPU上建立上下文。还有cudaChooseDevice,它会从可用设备中选择一个与调用者提供的标准匹配的设备。
您可以使用cudaGetDeviceCount枚举系统上可用的GPU,并使用cudaGetDeviceProperties检索其详细信息。SDK deviceQuery示例显示了如何执行此操作的完整详细信息。
但是,您可能需要注意,在多GPU系统中如何选择GPU,这取决于主机和驱动程序配置。在Linux和Windows TCC驱动程序中,存在将GPU标记为“计算排他”(compute exclusive)的选项,这意味着驱动程序将每个GPU限制为一次活动上下文,或“计算禁止”(compute prohibited),这意味着没有CUDA程序可以在该设备上建立上下文。如果您的代码尝试在计算被禁止的设备上或正在使用的计算独占设备上建立上下文,则结果将是无效的设备错误。在使用计算排他性的多GPU系统中,正确的方法不是尝试选择特定的GPU,而只是允许惰性上下文建立隐式发生。驱动程序将自动为您的代码选择一个空闲GPU运行。可以通过使用cudaGetDeviceProperties调用读取cudaDeviceProp.computeMode字段来检查任何设备的计算模式状态。请注意,您可以自由地检查不可用或被禁止的GPU并查询其属性,但是任何需要上下文建立的操作都将失败。
有关所有这些调用的运行时API文档,请参见此处

4
另一种解决方案是使用CUDA_VISIBLE_DEVICES环境变量。(https://devblogs.nvidia.com/parallelforall/cuda-pro-tip-control-gpu-visibility-cuda_visible_devices/) - Soravux

5
你可以设置环境变量CUDA_VISIBLE_DEVICES,将设备ID的列表以逗号分隔,只使得这些设别对应用程序可见。使用此功能可以掩盖设备或更改设备的可见顺序,以便CUDA运行时按特定顺序枚举它们。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接