如何用CUDA选择GPU?

时间:2015-01-23 14:52:03

标签: cuda gpu gpu-programming

我有一台带2个GPU的电脑;我写了一个CUDA C程序,我需要以某种方式告诉它我只想在2张图形卡中的1张上运行它;我需要键入什么命令以及如何使用它?我相信某种方式与 cudaSetDevice 有关,但我无法真正找到如何使用它。

2 个答案:

答案 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);
}