2017-07-20 1 views
2

私はOpenCLの初心者で、単純なCUDA関数をOpenCLに変換しようとしています。彼らは事業のインデックスを取得するには、以下のスニペットを使用しましたCUDA機能では、CUDAとOpenCL:OpenCLの(blockIdx.x + blockIdx.y * gridDim.x)* blockDim.x + threadIdx.xとは何ですか?

int id = (blockIdx.x + blockIdx.y*gridDim.x) * blockDim.x + threadIdx.x; 

は、OpenCLの上記の(0)と同等get_global_idていますか?

int id = get_global_id(0); 
+3

短い答えはいいえです。はい/いいえの答えよりも何かを覚えていましたか? – talonmies

+0

@talonmiesもしそうでなければ、私はこれを達成するための代替的なアプローチを見つけたいと思います。 – Avis

答えて

4

私は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のような同等のワークグループ(ブロック)とグローバル次元でカーネルをエンキューしたと仮定しています。

+0

最後の式が正しいかどうか分かりません。 'get_global_id(1)'はおそらく 'get_group_id(1)'でなければなりません。 – talonmies

+0

@talonmies質問の深い点検をしているようです。私はそれを修正する - 私はブロックサイズが質問者のケースでy方向に1かもしれないと思うが、それ以外の場合、IDを取得するのは奇妙なことに思える。 – pmdj

+0

@talonmies私は 'get_global_id(1)* get_global_size(0)+ get_global_id(0)'が他の人にとってより有用なものだと思うので、その効果を説明し、元のものを修正しました。 – pmdj

関連する問題