我有一台带有2个GPU的计算机;我写了一个CUDA C程序,我需要以某种方式告诉它我想只在2个图形卡中的1个上运行它。我需要输入什么命令,应该如何使用?我相信与cudaSetDevice有关的某种方式,但是我真的找不到如何使用它。
从的文档中cudaSetDevice
应该非常清楚,但是让我提供以下代码片段。
bool IsGpuAvailable()
{
int devicesCount;
cudaGetDeviceCount(&devicesCount);
for(int deviceIndex = 0; deviceIndex < devicesCount; ++deviceIndex)
{
cudaDeviceProp deviceProperties;
cudaGetDeviceProperties(&deviceProperties, deviceIndex);
if (deviceProperties.major >= 2
&& deviceProperties.minor >= 0)
{
cudaSetDevice(deviceIndex);
return true;
}
}
return false;
}
这就是我遍历所有可用GPU(cudaGetDeviceCount
)的方式,以寻找计算能力至少为2.0的第一个。如果找到了这样的设备,那么我就使用了cudaSetDevice
所有的CUDA计算,都是在该特定设备上执行的。如果不执行,则cudaSetDevice
CUDA应用程序将在第一个GPU上执行,即具有deviceIndex == 0
哪个GPU的那个取决于哪个GPU在哪个PCIe插槽中。
编辑:
在用注释澄清您的问题之后,在我看来,应该适合您根据设备名称选择设备。如果不确定实际的GPU名称,请运行以下代码,该代码会将所有GPU的名称打印到控制台中:
int devicesCount;
cudaGetDeviceCount(&devicesCount);
for(int deviceIndex = 0; deviceIndex < devicesCount; ++deviceIndex)
{
cudaDeviceProp deviceProperties;
cudaGetDeviceProperties(&deviceProperties, deviceIndex);
cout << deviceProperties.name << endl;
}
然后,选择要用于计算的GPU的名称,假设它是"GTX XYZ"
。从您的main
方法中调用以下方法,多亏了它,所有CUDA内核都将在name为的设备上执行"GTX XYZ"
。您还应该检查返回值-true
如果找到了具有该名称的设备,false
否则:
bool SetGPU()
{
int devicesCount;
cudaGetDeviceCount(&devicesCount);
string desiredDeviceName = "GTX XYZ";
for(int deviceIndex = 0; deviceIndex < devicesCount; ++deviceIndex)
{
cudaDeviceProp deviceProperties;
cudaGetDeviceProperties(&deviceProperties, deviceIndex);
if (deviceProperties.name == desiredDeviceName)
{
cudaSetDevice(deviceIndex);
return true;
}
}
return false;
}
当然,您必须将desiredDeviceName
变量的值更改为所需的值。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句