我有一台带2个GPU的电脑;我写了一个CUDA C程序,我需要以某种方式告诉它我只想在2张图形卡中的1张上运行它;我需要键入什么命令以及如何使用它?我相信某种方式与 cudaSetDevice 有关,但我无法真正找到如何使用它。
答案 0 :(得分:6)
documentation of 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取决于哪个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内核都将在名为"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
变量的值更改为所需的值。
答案 1 :(得分:1)
在互联网上仔细搜索,我发现这行代码选择了在PC中安装的所有设备中具有更多内核的GPU。
int num_devices, device;
cudaGetDeviceCount(&num_devices);
if (num_devices > 1) {
int max_multiprocessors = 0, max_device = 0;
for (device = 0; device < num_devices; device++) {
cudaDeviceProp properties;
cudaGetDeviceProperties(&properties, device);
if (max_multiprocessors < properties.multiProcessorCount) {
max_multiprocessors = properties.multiProcessorCount;
max_device = device;
}
}
cudaSetDevice(max_device);
}