インテル® FPGA SDK for OpenCL™ コンパイラーは、NDRange カーネル内のステートメントがスレッド ID の順にスレッドによって実行されていることを保証します。スレッド依存のコントロールフローを含むプログラムで保証が確実に満たされていることを確認するため、コンパイラーはスレッド依存のコントロールフロー・パスの結合点に再注文の障壁を挿入します。このような障壁の構成に欠陥があると、前方に進展することなく、計算が障壁で停滞します。
チャネル操作により、このストールが発生する可能性もあります。
以下は「スレッド依存制御フロー構造」の例です。
グローバルスレッド ID を取得
int id = get_global_id(0);
境界を超えないことを確認してください
if (id < n)
c[id] = a[id] b[id];
ここでは、if ステートメントはスレッドに依存する制御フロー構造です。つまり、実行するスレッドによって異なります。
NDRange カーネルを再書き込みして、チャネル操作やスレッド依存のコントロール・フロー構造を含めないでください。
この問題は、今後のバージョンの インテル® FPGA SDK for OpenCL ソフトウェアで修正される予定です。