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 つの作業グループのみの作業項目が実行されますか?
投稿を読んでくれてありがとう。下手な英語でごめんなさい。