如何获得cuda设备中的核心数量?

时间:2015-09-11 19:12:14

标签: c cuda nvidia

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

我经常搜索一个属性函数来计算每个微处理器的核心数,但我不能。我使用下面的代码,但我仍然需要核心数量?

  • cuda 7.0
  • 程序语言C
  • visual studio 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;
}

4 个答案:

答案 0 :(得分:14)

每个多处理器的核心是唯一的"缺失"一块数据。该数据不是直接在cudaDeviceProp结构中提供的,但可以根据devProp.majordevProp.minor条目中的published datamore published data推断出来组成设备的CUDA 计算能力

这样的事情应该有效:

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) cores = mp * 128;
      else if (devProp.minor == 0) cores = mp * 64;
      else printf("Unknown device type\n");
      break;
     case 7: // Volta
      if (devProp.minor == 0) cores = mp * 64;
      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不再支持这些设备类型

答案 1 :(得分:2)

在linux中,您可以运行以下命令来获取CUDA内核数:

nvidia-settings -q CUDACores -t

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

答案 2 :(得分:1)

也许这可能会有所帮助。

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中的核心数量(流处理器)返回 - 从帖子。

答案 3 :(得分:1)

正如 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;