如何 select 带有 CUDA 的 GPU?

How to select a GPU with CUDA?

我有一台带 2 个 GPU 的计算机;我写了一个 CUDA C 程序,我需要以某种方式告诉它我想 运行 它只在 2 个显卡中的 1 个上;我需要输入什么命令,我应该如何使用它?我相信这与 cudaSetDevice 有某种关系,但我真的不知道如何使用它。

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 在哪个 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" 的设备上执行。您还应该检查 return 值 - 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 变量的值更改为所需的值。

在网上仔细搜索,我发现了这行代码,selectPC中安装的所有设备中具有更多核心的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);
}