当编写将在1D阵列的一个元素上运行的内核时,其具有可以是2到100百万的大尺寸N,或者来自具有相同尺寸的多个1D阵列的具有相同索引的一个元素N,计算内核网格大小的最佳方法是什么? 特别是,以下是最佳方式:
CPU部分:
cudaSetDevice(device);
cudaGetDeviceProperties(&deviceProp, device);
max_threads_per_block = deviceProp.maxThreadsPerBlock;
number_CUDA_cores = _ConvertSMVer2Cores(deviceProp.major, deviceProp.minor) * deviceProp.multiProcessorCount;
GPU部分:
if (N <= number_CUDA_cores) {
blocks = N;
threads_per_block = 1;
}
else {
blocks = number_CUDA_cores;
threads_per_block = (N + number_CUDA_cores - 1) / number_CUDA_cores;
if (threads_per_block > max_threads_per_block) {
blocks = (N + max_threads_per_block - 1) / max_threads_per_block;
threads_per_block = max_threads_per_block;
}
}
kernel<<<blocks, threads_per_block>>>( ..... )
同样,对于K20或K20x上N的大小为2到100,并且更好。
如果符合以下条件,答案会有所不同:
1)内核大多是直接代码
2)内核有很多if语句,并且它们可以在执行中分歧(这就是为什么我试图保持块尽可能小)。