データ幅
パフォーマンスに関しては、インプリメンテーションに必要なデータ幅が重要な要素の 1 つです。ツールはアルゴリズム全体にポート幅を伝搬します。アルゴリズム記述から開始した場合は特に、C/C++/OpenCL API コードで、デザインのポートにも、整数型などの大型データ型のみが使用されることがあります。ただし、アルゴリズムが完全にコンフィギャラブルなインプリメンテーションにマップされていくと、10 ビットまたは 12 ビットなどのより小型のデータ型で十分なこともあります。このため、最適化中に HLS 合成レポートで基本的な演算のサイズを確認することをお勧めします。
通常は、Vitis コア開発キットでアルゴリズムを FPGA にマップする際、C/C++/OpenCL API 構造を理解て動作依存を抽出するため、多くの処理が必要になります。このマップを実行するため、Vitis 開発キットによりソース コードが演算ユニットに分割され、FPGA にマップされます。これらの演算ユニット (ops) の数およびサイズには、さまざまな要素が影響します。
次の図では、基本的な演算とそのビット幅がレポートされています。
アルゴリズム記述でよく使用される典型的なビット幅 (16、32、64 ビット) を探して、C/C++/OpenCL API ソースからの関連する演算にこれほどのビット幅が本当に必要なのかを検証します。演算が小さいほど計算時間も短くなるので、これによりアルゴリズムのインプリメンテーションが大幅に改善する可能性があります。
固定小数点の演算
アプリケーションによっては、ほかのハードウェア アーキテクチャ用に最適化されているというだけの理由で、浮動小数点計算が使用されているものがあります。深層学習のようなアプリケーションに固定小数点演算を使用すると、精度を同程度に保ちながら、消費電力とエリアを大幅に節約できます。
マクロ演算
より大型の計算エレメントを考慮すると有益な場合もあります。ツールでは、ソース コードが残りのソース コードとは別に実行され、アルゴリズムが周囲の演算を考慮せずに FPGA にマップされます。この場合、Vitis テクノロジで演算の境界が維持され、特定のコードに対して実質的にマクロ演算が作成されます。これには、次の原則が使用されます。
- マップ プロセスに対する演算局所性
- 経験則のための複雑性の削減
これにより、結果が大きく異なるものになることがあります。C/C++ では、マクロ演算は #pragma HLS inline
off
を使用すると作成されます。 OpenCL
API では、関数を定義する際に次の属性を指定しないことにより、同様のマクロ演算を生成できます。
__attribute__((always_inline))
詳細は、pragma HLS inline を参照してください。
最適化済みライブラリの使用
OpenCL 仕様には、多数の数学ビルトイン関数が含まれます。native_
接頭辞が付いた数学ビルトイン関数はすべて 1 つまたは複数のネイティブ デバイス命令にマップされ、通常は対応する関数 (native_
接頭語なし) よりも優れたパフォーマンスになります。これらの関数の精度と入力範囲 (場合による) は、インプリメンテーションで定義されます。Vitis テクノロジでは、これらの native_
ビルトイン関数に対して、ザイリンクス FPGA 用にエリアおよびパフォーマンスを最適済みの Vivado HLS ツールの Math ライブラリに含まれる同等の関数が使用されます。
native_
ビルトイン関数または HLS ツールの Math ライブラリを使用することをお勧めします。