3

質問にあるように、ブロックの 3D グリッドがある場合、1 つのスレッドのグローバルで一意のインデックスを取得する式は何ですか?

ブロック自体を 1 次元のままにします。

4

3 に答える 3

7
// unique block index inside a 3D block grid
const unsigned long long int blockId = blockIdx.x //1D
        + blockIdx.y * gridDim.x //2D
        + gridDim.x * gridDim.y * blockIdx.z; //3D

// global unique thread index, block dimension uses only x-coordinate
const unsigned long long int threadId = blockId * blockDim.x + threadIdx.x;
于 2012-07-19T22:37:03.207 に答える
1

パーティーには少し遅れましたが、ここでは、任意の数とサイズのブロック (2D も含む) をサポートするという点で、かなり一般的な方法でこれに通常アプローチする方法を示します。

// Compute the offset in each dimension
const size_t offsetX = blockDim.x * blockIdx.x + threadIdx.x;
const size_t offsetY = blockDim.y * blockIdx.y + threadIdx.y;
const size_t offsetZ = blockDim.z * blockIdx.z + threadIdx.z;

// Make sure that you are not actually outs
if (offsetX >= sizeX || offsetY >= sizeY || offsetZ >= sizeZ)
  return;

// Compute the linear index assuming that X,Y then Z memory ordering
const size_t idx = offsetZ * sizeX * sizeY + offsetY * sizeX + offsetX;

私は CUDA 忍者ではないことに注意してください。

于 2014-09-12T08:25:39.307 に答える