こんにちは、私は 2Dimendions Grid と 1Dimensions ブロックを持っています:
dim3 dimGrid(K,N);
dim3 dimBlock(F);
一意のスレッド識別子を計算するにはどうすればよいですか? ありがとう
編集: 申し訳ありませんが、dimBlock は K ではありません。F の違い K の違い N
こんにちは、私は 2Dimendions Grid と 1Dimensions ブロックを持っています:
dim3 dimGrid(K,N);
dim3 dimBlock(F);
一意のスレッド識別子を計算するにはどうすればよいですか? ありがとう
編集: 申し訳ありませんが、dimBlock は K ではありません。F の違い K の違い N
ローカル スレッド ID:
unsigned ltid = threadIdx.x; // Varies from 0 to K-1
ブロック数は次のように計算できます。
unsigned num_blocks = blockIdx.y * gridDim.x + blockIdx.x;
現在のブロックの前のスレッド数:
unsigned boff = num_blocks * blockDim.x; // Multiples of K * N * K
現在のブロックの前のスレッドの数に現在のスレッド ID を追加すると、グローバルな一意の ID を取得できます。
unsigned gtid = ltid + boff;
編集
回答を修正しました。オリジナルは間違った仮定の下で書かれました。
明確にするために純粋に(他の答えも正しいですが、このアプローチは学習に役立つと思います)、2Dブロックとグリッドの特定のスレッドのグローバルインデックスは次の方法で見つけることができます:
int index_x = blockIdx.x * blockDim.x + threadIdx.x;
int index_y = blockIdx.y * blockDim.y + threadIdx.y;
int grid_width = gridDim.x * blockDim.x;
//get the global index
int global_idx = index_y * grid_width + index_x;
これは、ブロック サイズに 2 番目の次元を導入する場合に便利です。その場合は自動的に処理されます。
私が使用する計算は次のようになります。
int idx = threadIdx.x + (blockDim.x * ((gridDim.x * blockIdx.y) + blockIdx.x));
この質問に私が投稿した回答にも興味があるかもしれません。