我正在寻找一个计算我的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;
}
答案 0 :(得分:14)
每个多处理器的核心是唯一的"缺失"一块数据。该数据不是直接在cudaDeviceProp
结构中提供的,但可以根据devProp.major
和devProp.minor
条目中的published data和more 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)
答案 2 :(得分:1)
也许这可能会有所帮助。
"有一个包含例程的库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;