私はCUDA(のみOpenCLの)に慣れていないんだけど、それは次のような等価です。
get_group_id(uint dimindx)
とblockIdx.[xyz]
get_local_size(uint dimindx)
とblockDim.[xyz]
get_local_id(uint dimindx)
とthreadIdx.[xyz]
get_num_groups(uint dimindx)
およびgridDim.[xyz]
それぞれ
.x
、
.y
、または
.z
に対応する、0、1、又は2である
。
get_global_id(0)
はget_group_id(0) * get_local_size(0) + get_local_id(0)
と同じです。したがって、上記の同等値が実際には正しいと仮定すると、blockIdx.x * blockDim.x + threadIdx.x
と同じになります。 (等価的.Yとインデックス1、および.Zを持つインデックス2用)
同じID値を取得するには、私はあなたがおそらくこのような何かしたいと思う:
int id = get_group_id(1) * get_global_size(0) + get_global_id(0);
注オリジナルのCUDAコードのことを明示的にはthreadIdx.y
を考慮していません。あなたのblockDim.y
が1であるか、ブロック内の一番上の項目(現在のスレッドに対応する項目ではない)に到達しようとしているからです。前式に
int id = get_global_id(1) * get_global_size(0) + get_global_id(0);
これはもちろん同等である場合:
より一般的なシナリオは、2D要素のアレイを含む緩衝液中配列に現在の作業項目のインデックスを取得するために考えられget_local_size(1)
は1です(ブロックの高さは1です)。
上記の説明はすべて、CUDAのような同等のワークグループ(ブロック)とグローバル次元でカーネルをエンキューしたと仮定しています。
短い答えはいいえです。はい/いいえの答えよりも何かを覚えていましたか? – talonmies
@talonmiesもしそうでなければ、私はこれを達成するための代替的なアプローチを見つけたいと思います。 – Avis