【问题标题】:How to select a GPU with CUDA?如何选择带有 CUDA 的 GPU?
【发布时间】:2015-01-23 14:52:02
【问题描述】:

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

【问题讨论】:

  • 问题可能有点不清楚,您实际上是“想在 2 个显卡中的一个上运行它”还是“想在 2 个显卡中的第一个上运行它”?因为第一个要求已经得到满足,除非您创建的应用程序强制使用所有可用的 GPU。
  • 我要做的只是选择我想要的显卡:在我的情况下是第二张。
  • 第二张卡的具体情况如何?你要根据什么信息来选择呢?计算能力还是其他?
  • 我想根据cuda核心的数量来选择它...基本上我需要使用最强大的l
  • 核心数确实不是一个很好的衡量标准...看到GTX 580 的核心数几乎是GTX 660 的两倍,而GTX 580 在性能方面更胜一筹。这是费米和开普勒之间发生架构变化的结果。

标签: cuda gpu


【解决方案1】:

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 变量的值更改为所需的值。

【讨论】:

  • 所以我应该在我的主程序中复制这些行,然后在内核调用之前输入“cudaSetDevice”?
  • @FedericoGentile 请参阅我回答的 EDIT 部分,它应该可以解决您的情况。
  • 开个玩笑……我识别gpu名称的第一部分工作正常;但是,当我尝试第二部分时,它说 bool 有问题:它说它缺少一个“;”但我看不到在哪里!
  • HerecudaSetDevice 处理线程时的一些有用信息。
【解决方案2】:

在网上更仔细地搜索,我发现这行代码在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);
}

【讨论】:

    猜你喜欢
    • 2014-10-23
    • 2019-06-17
    • 2011-05-17
    • 1970-01-01
    • 2018-08-29
    • 2013-09-19
    • 1970-01-01
    • 2011-04-14
    • 2018-08-24
    相关资源
    最近更新 更多