Intel® FPGA SDK for OpenCL™: ベスト・プラクティス・ガイド

ID 683521
日付 12/08/2017
Public
ドキュメント目次

6.3.1. コンピューティング・ユニット複製対カーネルSIMDベクトル化

ほとんどの場合、 num_simd_work_items属性を実装して、 num_compute_units属性を使用する前にデータ処理の効率を上げる必要があります。

num_compute_units属性とnum_simd_work_items属性の両方は、 Intel® FPGA SDK for OpenCL™オフライン・コンパイラーがカーネルを実装するために使用するハードウェアの量を増やすことによってスループットを向上させます。num_compute_units属性は、ワークグループのスケジュールを設定できるコンピューティング・ユニットの数を変更し、カーネルがグローバルメモリーにアクセスする回数も変更します。対照的に、 num_simd_work_items属性は、コンピューティング・ユニットが単一のワークグループで並列に実行できる作業量を変更します。 num_simd_work_items属性は、各SIMD ベクタレーンでコントロールロジックを共有することによって、コンピューティング・ユニットのデータパスのみを複製します。

通常、num_simd_work_items属性を使用すると、num_compute_units属性を使用して同じ目標を達成するより効率的なハードウェアにつながります。num_simd_work_items属性を使用すると、オフライン・コンパイラーでメモリーアクセスを結合することもできます。

図 76. コンピューティング・ユニット複製対カーネルSIMDベクトル化


大域メモリーと競合する複数のコンピューティング・ユニッは、望ましくないメモリー・アクセス・パターンにつながる可能性があります。num_simd_work_itemsnum_compute_units属性の代わりに属性を導入することにより、望ましくないメモリー・アクセス・パターンを変更することができます。また、num_simd_work_itemsは、潜在的に属性num_compute_unitsがオファーを属性同等のカーネル演算ユニットの重複と同じ演算スループットを提供しています。

次のような状況では、 num_simd_work_items属性をカーネルに実装することはできません。

  • num_simd_work_itemsに指定する値は、 2,4,8または16ではありません。
  • reqd_work_group_sizeの値はnum_simd_work_itemsで割り切れません。

    たとえば、50が4で割り切れないため、次の宣言は正しくありません。

    __attribute__((num_simd_work_items(4))) __attribute__((reqd_work_group_size(50,0,0)))
  • 複雑な制御フローを持つカーネル。別のWork-Itemは、(例えば、制御パスがget_global_IDまたはget_local_IDに依存)異なる制御経路をたどるするカーネルをベクトル化することはできません。

カーネルコンパイル時に、オフライン・コンパイラーは、ベクトル化最適化の実装が成功したかどうかを通知するメッセージを発行します。報告されたベクトル化係数がnum_simd_work_items属性に指定した値と一致すると、カーネルのベクトル化は成功します。