【问题标题】:How can I get number of Cores in cuda device?如何获取 cuda 设备中的核心数?
【发布时间】:2015-12-08 10:28:08
【问题描述】:

我正在寻找一个计算我的 cuda 设备核心数量的函数。我知道每个微处理器都有特定的内核,而我的 cuda 设备有 2 个微处理器。

我进行了很多搜索以找到一个计算每个微处理器内核数的属性函数,但我找不到。我使用下面的代码,但我仍然需要内核数?

  • cuda 7.0
  • 程序语言 C
  • 视觉工作室 2013

代码:

void printDevProp(cudaDeviceProp devProp)
{   printf("%s\n", devProp.name);
printf("Major revision number:         %d\n", devProp.major);
printf("Minor revision number:         %d\n", devProp.minor);
printf("Total global memory:           %u", devProp.totalGlobalMem);
printf(" bytes\n");
printf("Number of multiprocessors:     %d\n", devProp.multiProcessorCount);
printf("Total amount of shared memory per block: %u\n",devProp.sharedMemPerBlock);
printf("Total registers per block:     %d\n", devProp.regsPerBlock);
printf("Warp size:                     %d\n", devProp.warpSize);
printf("Maximum memory pitch:          %u\n", devProp.memPitch);
printf("Total amount of constant memory:         %u\n",   devProp.totalConstMem);
return;
}

【问题讨论】:

标签: c cuda nvidia


【解决方案1】:

每个多处理器的内核是唯一“缺失”的数据。该数据未直接在cudaDeviceProp 结构中提供,但可以根据published datamore published datadevProp.majordevProp.minor 条目中推断出来,它们共同构成了CUDA 计算能力 的设备。

这样的事情应该可以工作:

#include "cuda_runtime_api.h"
// you must first call the cudaGetDeviceProperties() function, then pass 
// the devProp structure returned to this function:
int getSPcores(cudaDeviceProp devProp)
{  
    int cores = 0;
    int mp = devProp.multiProcessorCount;
    switch (devProp.major){
     case 2: // Fermi
      if (devProp.minor == 1) cores = mp * 48;
      else cores = mp * 32;
      break;
     case 3: // Kepler
      cores = mp * 192;
      break;
     case 5: // Maxwell
      cores = mp * 128;
      break;
     case 6: // Pascal
      if ((devProp.minor == 1) || (devProp.minor == 2)) cores = mp * 128;
      else if (devProp.minor == 0) cores = mp * 64;
      else printf("Unknown device type\n");
      break;
     case 7: // Volta and Turing
      if ((devProp.minor == 0) || (devProp.minor == 5)) cores = mp * 64;
      else printf("Unknown device type\n");
      break;
     case 8: // Ampere
      if (devProp.minor == 0) cores = mp * 64;
      else if (devProp.minor == 6) cores = mp * 128;
      else printf("Unknown device type\n");
      break;
     default:
      printf("Unknown device type\n"); 
      break;
      }
    return cores;
}

(在浏览器中编码)

“核心”是一个营销术语。在我看来,最常见的含义是将其与 SM 中的 SP 单位等同起来。这就是我在这里展示的意思。我也省略了 cc 1.x 设备,因为 CUDA 7.0 和 CUDA 7.5 不再支持这些设备类型

pythonic 版本是here

【讨论】:

  • 我的设备是 GeForce GT 740M,它有 384 个 CUDA 核心,但是打印具有上述其他属性的 cuda 核心的正确查询功能是什么?
  • 没有 CUDA 核心属性。你必须使用我描述的方法来计算它。
  • 为什么将 mp 与 192、32、128 相乘? 192是什么意思
  • 我在回答中用“已发布数据”字样链接的文档(点击它!)解释了这些数字。这不是一个句子,所以你需要阅读几个部分/段落。 32 和 48 号描述为here,192 号表示为here,128 号表示为here
【解决方案2】:

在linux中你可以运行以下命令来获取CUDA核心的数量:

nvidia-settings -q CUDACores -t

要在 C 中获取此命令的输出,请使用 popen 函数。

【讨论】:

    【解决方案3】:

    正如 Vraj Pandya 已经说过的,nvidia 的 cuda-samples github repository 上的 Common/helper_cuda.h 文件中有一个函数 (_ConvertSMVer2Cores),它提供了这个功能。您只需将其结果与 GPU 的多处理器数量相乘即可。

    只是想提供一个当前链接。

    #include <cuda.h>
    #include <cuda_runtime.h>
    #include <helper_cuda.h> // You need to place this file somewhere where it can be
                             // found by the linker. 
                             // The file itself seems to also require the 
                             // `helper_string.h` file (in the same folder as 
                             // `helper_cuda.h`).
    
    int deviceID;
    cudaDeviceProp props;
    
    cudaGetDevice(&deviceID);
    cudaGetDeviceProperties(&props, deviceID);
        
    int CUDACores = _ConvertSMVer2Cores(props.major, props.minor) * props.multiProcessorCount;
    

    【讨论】:

      【解决方案4】:

      也许这可能会有所帮助。

      https://devtalk.nvidia.com/default/topic/470848/cuda-programming-and-performance/what-39-s-the-proper-way-to-detect-sp-cuda-cores-count-per-sm-/post/4414371/#4414371

      "有一个库 helper_cuda.h 包含一个例程 _ConvertSMVer2Cores(int major, int minor) 采用计算能力级别 GPU 的数量并返回每个 SM 或 SMX 中的核心(流处理器)数" - 来自帖子。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-12-10
        • 2014-05-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多