我正在寻找一个计算我的cuda设备核心数的功能.我知道每个微处理器都有特定的内核,而我的cuda设备有2个微处理器.
我经常搜索一个属性函数来计算每个微处理器的核心数,但我不能.我使用下面的代码,但我还需要核心数量?
码:
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;
}
Rob*_*lla 16
每个多处理器的核心是唯一"缺失"的数据.该数据不是直接在cudaDeviceProp结构中提供的,但可以根据发布的数据和来自和条目的更多发布数据来推断,这些数据共同构成了设备的CUDA 计算能力.devProp.majordevProp.minor
这样的事情应该有效:
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 and Turing
      if ((devProp.minor == 0) || (devProp.minor == 5)) 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不再支持这些设备类型
小智 5
在linux中,您可以运行以下命令来获取CUDA内核数:
nvidia-settings -q CUDACores -t
要在C语言中获取此命令的输出,请使用popen函数。