我从外部连接到GPU群集,我不知道如何选择运行我的CUDA程序的设备。
我知道群集中有两个Tesla GPU,我想选择其中一个。
任何想法如何?如果有多台设备连接到计算机,您如何选择要使用的设备?
答案 0 :(得分:10)
在运行时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来运行您的代码。通过使用cudaDeviceProp.computeMode
调用阅读cudaGetDeviceProperties
字段,可以检查任何设备的计算模式状态。请注意,您可以自由检查不可用或禁止的GPU并查询其属性,但任何需要上下文建立的操作都将失败。
请参阅所有这些calls
的运行时API文档答案 1 :(得分:3)
您可以将环境变量CUDA_VISIBLE_DEVICES
设置为以逗号分隔的设备ID列表,以仅使应用程序可以看到这些设备。使用它来屏蔽设备或更改设备的可见性顺序,以便CUDA运行时按特定顺序枚举它们。