应该很清楚的文档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 插槽中。
EDIT:
在评论中澄清您的问题后,在我看来,您应该适合根据设备名称来选择设备。如果您不确定实际的 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
变量到期望值。