0

openCL のカーネルからハードウェア モジュール (Verilog の説明) を生成する作業を行っています。私はこれについての記事を読んでいて、著者はカーネルに対していくつかの前処理を行います。前処理の最初のステップは次のとおりです。カーネル関数内の作業項目のシリアル化、彼らは次のように説明しました:

「ワークグループ内のワークアイテムは、カーネル関数内に同期操作が存在しない限り、任意の順序で実行できます。この観察に基づいて、ワークアイテムの実行をシリアライズします。ワークグループ内の抽象インデックス空間の次元の最大数が 3 である場合、カーネル関数を 3 つのネストされたループに変換します。各ループのネストは、対応する次元のワークアイテムを列挙し、その実行をシリアル化します。」

そして、彼らは次のような例を提供します:

int __kernel_indices[3];

__kernel_indices[2] = 0;
while (__kernel_indices[2]< __local_size[2]){
   __kernel_indices[1] = 0;
   while (__kernel_indices[1]< __local_size[1]){
      __kernel_indices[0] = 0;
      while (__kernel_indices[0]< __local_size[0]){

               //Kernel Body

      }
      __kernel_indices[0]++;
   }
   __kernel_indices[]++;
}
__kernel_indices[2]++;

シリアライゼーションの意味がわからないのですが、一度に実行されるワークアイテムは一つですか?または、その時点で 1 つの作業グループのみの作業項目が実行されますか?

投稿を読んでくれてありがとう。下手な英語でごめんなさい。

4

1 に答える 1

0

はい、上記のカーネルは、さまざまな作業項目を一緒に実行するのではなく、順番に実行します。私には、while ループが実行されるにつれて、ますます多くの作業項目が実行され始めているように見えます。これを理解するには、各ワークアイテムが 3 次元のインデックスを持っていると考えてください。

于 2012-07-25T22:06:48.387 に答える