问题
I am looking for a function that count number of core of my cuda device. I know each microprocessor have specific cores, and my cuda device has 2 microprocessors.
I searched a lot to find a property function that count number of cores per microprocessor but I couldn't. I use the code below but I still need number of cores?
- cuda 7.0
- program language C
- visual studio 2013
Code:
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;
}
回答1:
The cores per multiprocessor is the only "missing" piece of data. That data is not provided directly in the cudaDeviceProp
structure, but it can be inferred based on published data and more published data from the devProp.major
and devProp.minor
entries, which together make up the CUDA compute capability of the device.
Something like this should work:
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;
}
(coded in browser)
"cores" is a bit of a marketing term. The most common connotation in my opinion is to equate it with SP units in the SM. That is the meaning I have demonstrated here. I've also omitted cc 1.x devices from this, as those device types are no longer supported in CUDA 7.0 and CUDA 7.5
回答2:
In linux you can run the following command to get the number of CUDA cores:
nvidia-settings -q CUDACores -t
To get the output of this command in C, use the popen function.
回答3:
Maybe this might help a bit more.
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
"there is a library helper_cuda.h which contains a routine _ConvertSMVer2Cores(int major, int minor) which takes the compute capability level of the GPU and returns the number of cores (stream processors) in each SM or SMX" -from the post.
来源:https://stackoverflow.com/questions/32530604/how-can-i-get-number-of-cores-in-cuda-device