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

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

6.4. コンピューティング・ユニット複製とカーネルSIMDベクトル化の組み合わせ

複製またはベクトル化されたOpenCLカーネルがFPGAに収まらない場合、コンピューティング・ユニットを複製してカーネルをベクトル化することによって、カーネルを変更できます。 カーネルのコンピューティング・ユニット数を変更するには、nnum_compute_units属性を含めます。そして、カーネルのベクトル化を使用するには、num_simd_work_items属性を含めます。

num_simd_work_items属性が16に設定されたカーネルがFPGAに収まらないケースを検討してください。より狭いSIMDカーネルコンピューティング・ユニットを複製することによってカーネルを修正すると、カーネルが適合するかもしれません。コンピューティング・ユニットの数とSIMD幅の最適なバランスを決定するには、いくつかの実験が必要になるかもしれません。たとえば、4レーン幅のSIMDカーネルコンピューティング・ユニットを3回複製すると、8レーン幅のSIMDカーネルコンピューティング・ユニットを2回複製するよりもスループットが向上する可能性があります。

次のコード例は、 OpenCL™コードでnum_compute_unitsおよびnum_simd_work_items属性を組み合わせる方法を示しています。

__attribute__((num_simd_work_items(4))) __attribute__((num_compute_units(3))) __attribute__((reqd_work_group_size(8,8,1))) __kernel void matrixMult(__global float * restrict C, __global float * restrict A, . . .

下の図は、上記のカーネルのデータフローを示しています。 num_compute_unitsは、3つの複製コンピューティング・ユニットを実装します。 num_simd_work_itemsは、4つのSIMD ベクタレーンを実装しています。

図 77. コンピューティング・ユニット複製とカーネルSIMDベクトル化を組み合わせることによるスループットの最適化


重要: また、リソース駆動型オプティマイザで、 num_compute_unitsnum_simd_work_itemsの最適な組合せを自動的に判別できるようにすることもできます。
重要: より小さなデザインよりもFPGA全体を満たすハードウェアデザインをコンパイルする方が時間がかかります。カーネル最適化を調整するときは、カーネルを再コンパイルする前に、SIMDベクタレーンの数を増やしてコンピューティング・ユニットを削除してください。