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

我正在寻找一个计算我的cuda设备核心数量的function。 我知道每个微处理器都有特定的核心,我的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; } 

每个多处理器的核心是唯一“缺失”的数据。 该数据不是直接在cudaDeviceProp结构中提供的,但可以根据已发布的数据和devProp.majordevProp.minor条目中的更多已发布数据进行推断,这些条目共同构成了设备的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不再支持这些设备类型

也许这可能会有所帮助。

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-/后/ 4414371 /#4414371

“有一个库helper_cuda.h,它包含一个例程_ConvertSMVer2Cores(int major,int minor),它接受GPU的计算能力级别,并从post中返回每个SM或SMX中的核心数(流处理器)。