0

2 から数億の大きな次元 N を持つ 1D 配列の 1 つの要素、または同じ次元 N を持つ複数の 1D 配列からの同じインデックスを持つ 1 つの要素のいずれかで動作するカーネルを作成する場合、カーネルのグリッド サイズを計算する最適な方法は? 特に、最適な方法は次のとおりです。

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 以上の 2 から数億の N のサイズでうまく機能する必要があります。

次の場合、答えは異なりますか?

1) カーネルはほとんどストレート コードです。

2) カーネルには多くの if ステートメントがあり、実行中に分岐する可能性があります (そのため、ブロックをできるだけ小さく保とうとしています)。

4

0 に答える 0