FPGA SDK for OpenCL™ コンパイラーは、NDRange カーネル内のステートメントがスレッド識別子の順にスレッドによって実行されることを保証します。スレッド依存の制御フローを含むプログラムで保証を確実に満たすために、スレッド依存制御フロー パスの結合ポイントにコンパイラによって並べ替えバリアが挿入されます。このようなバリアの構成に欠陥があると、計算がバリアで失速し、前進する可能性がなくなります。
チャネル操作もこのストールの原因となる可能性があります。
次に、"スレッド依存の制御フロー構造" の例を示します。
グローバルスレッド ID の取得
int id = get_global_id(0);
範囲外にならないようにしてください
if (id < n)
c[id] = a[id] b[id];
ここで、if ステートメントはスレッドに依存する制御フロー構造であり、どのスレッドが実行するかによって異なります。
NDRange カーネルを書き直して、チャネル操作やスレッド依存の制御フロー構造を含まないようにします。