从documentation of cudaSetDevice 应该很清楚,但让我提供以下代码 sn-p。
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) 来寻找 Compute Capability 至少为 2.0 的第一个。如果找到了这样的设备,那么我使用了cudaSetDevice,所以所有的 CUDA 计算都在那个特定的设备上执行。如果不执行 cudaSetDevice,您的 CUDA 应用程序将在第一个 GPU 上执行,即带有 deviceIndex == 0 的那个,但是哪个特定的 GPU 取决于哪个 GPU 在哪个 PCIe 插槽中。
编辑:
在 cmets 中澄清了您的问题后,在我看来,根据其名称选择设备应该适合您。如果您不确定您的实际 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 内核都将在名称为"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 变量的值更改为所需的值。