我正在寻找一个计算我的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;
}
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)
(在浏览器中编码)
"核心"是一个营销术语.我认为最常见的含义是将其与SM中的SP单位等同起来.这就是我在这里所展示的意义.我也省略了cc 1.x设备,因为CUDA 7.0和CUDA 7.5不再支持这些设备类型
小智 5
在linux中,您可以运行以下命令来获取CUDA内核数:
nvidia-settings -q CUDACores -t
Run Code Online (Sandbox Code Playgroud)
要在C语言中获取此命令的输出,请使用popen函数。