CUDA:如何计算网格大小

时间:2013-03-20 21:51:33

标签: cuda

当编写将在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语句,并且它们可以在执行中分歧(这就是为什么我试图保持块尽可能小)。

0 个答案:

没有答案