結論 - パフォーマンスの改善方法 - 2023.2 日本語

Vitis 高位合成ユーザー ガイド (UG1399)

Document ID
UG1399
Release Date
2023-12-18
Version
2023.2 日本語

この資料で説明する設計概念には、列計算モデルは、モジュラー ユニットまたはタスク内でのステートと順次実行をカプセルにして、並列プログラミングのため、より単純なプログラミング モデルを実行しやすくする、という 1 つの主な基本原理があります。タスクはストリーム (同期および通信用) と一緒に接続されます。ストリームには、FIFO や PIPO など、さまざまなタイプのチャネルのことです。ステート/ロジックを区分化することで、ツール (コンパイラやスケジューラなど) がアプリケーションのどの部分をいつどこで実行するか、より簡単に把握できるようになります。ストリーム ベースのプロセッシングが普及しつつある 2 つ目の理由は、並列実行で従来のマルチスレッド ベースのフォーク/ジョイン ビューを分割できるからです。タスクレベルのパイプライン処理と命令レベルのパイプライン処理をイネーブルにすることで、現在のフォーク/ジョイン モデルで可能な操作よりも多くの同時処理を実行できます。この追加の並列処理が、今日の FPGA デバイスで利用可能なハードウェアを活用する上で重要となっています。パイプライン並列処理をイネーブルにするのと同じように、ストリーミングを使用しても、設計者が並列プログラミングを最初から困難にするロックや競合状態などを心配することなく、並列アプリケーションを構築できます。

最後に、リコンフィギャラブル FPGA プラットフォームでパフォーマンスを達成する方法として、次の大まかな動作を示すチェックリストを実行することをお勧めします。

  • CPU 用に記述されたソフトウェアと FPGA 用に記述されたソフトウェアは、根本的に異なります。パフォーマンスを犠牲にすることなく、CPU と FPGA プラットフォーム間でポータブルなコードを記述することはできません。このため、FPGA 用にかなり異なるソフトウェアを記述する必要があります。
  • プロジェクトの開始時から、ソース コードの変更を機能的に検証できるフローを確立します。基準モデルに対してソフトウェアをテストする、またはゴールデン ベクターを使用するのが一般的な方法です。
  • まず、デザインのマクロ アーキテクチャから始めます。プロデューサーとコンシューマーのパラダイムを使用してソリューションをモデリングすることを検討してください。
  • デザインのマクロ アーキテクチャを特定したら、必要なアクティビティ タイムライン (水平軸が時間を表す) を描画し、各関数が複数のイテレーション (または呼び出し) で互いに関連して実行されるタイミングを示します。これにより、デザイン内で想定される並列を把握し、最終的に達成された結果と比較できます。多くの場合、HLS の GUI を使用すると、達成された並列処理を視覚化できるようになっています。
  • プログラムのコーディングまたはリファクタリングは、マクロ アーキテクチャとアクティビティ タイムラインが正しく構築されてから開始します。
  • 一般的な規則として、HLS コンパイラは関数呼び出しからタスク レベルの並列処理のみを推論します。このため、ハードウェアで同時に実行する必要がある順次コード ブロック (ループなど) は、専用の関数に含める必要があります。
  • 元のアルゴリズムを、ストリームを介して相互に通信する小さなコンポーネントに分解/分割します。これにより、デザイン内のデータフローを理解しやすくなります。
    • モジュール コンポーネントが小さいほど、並列処理を改善するのに必要な場合に複製できるという利点があります。
    • 非常に広いビット幅の通信チャネルは、使用しないようにしてください。このような幅の広いチャネルをいくつかの小さなチャネルに分解すると、FPGA デバイスのインプリメンテーションに役立ちます。
    • 大きな関数 (手動で記述するか、小さい関数をインライン展開生成) には、ツールで処理が困難な単純ではない制御パスが含まれることがあります。より単純な制御パスを持つ小さな関数の方が、FPGA デバイスのインプリメンテーションがしやすくなります。
    • 各関数内に単一のループ ネスト (HLS ツールで推論可能な固定ループ境界、または HLS ツールに手動でループ トリップカウント情報を提供する) を含めるようにしてください。これにより、スループットの測定と最適化がかなりしやすくなります。これはすべてのデザインに適用できるわけではありませんが、ほとんどの場合に使用できる方法です。
  • スループット - デザインの各段階で必要となる処理速度に関する全体的なビジョンを持つことが重要です。これは、FPGA 向けアプリケーションの記述方法に影響します。
    • デザイン内のクリティカル パス (たとえば、ABD や ACD などのクリティカルなタスク レベル パス) について検討し、このクリティカル パスのどの部分がボトルネックになる可能性があるかを調べます。デザインをシミュレーションし、個々のタスクがどのようにパイプライン処理されるか、およびパスの異なるブランチがスループットに関してアライメントされていないかどうかを確認します。HLS の GUI ツールやシミュレーション波形ビューアーを使用すると、このようなスループットの問題を視覚化できます。
    • ストリーム ベースの通信により、プロデューサーが生産を開始直後にコンシューマーは処理を開始できるので、オーバーラップ実行が可能になります (並列処理とスループットが向上します)。
    • プロデューサー タスクとコンシューマー タスクを止まらずに常に実行し続けるためには、パイプライン処理やストリームの適切なサイズ設定などの手法を使用して、各タスクの実行を可能な限り迅速に実行できるように最適化します。
  • 同期に対するストリーミング チャネルの粒度 (およびオーバーヘッド) を考慮する必要があります。PIPO チャネルを使用すると、デッドロックを心配することなくタスクの実行をオーバーラップさせることができます。また、明示的な手動ストリーミング FIFO チャネルを使用すると、オーバーラップした実行を (PIPO よりも) 早く開始できますが、デッドロックを回避するために FIFO サイズを慎重に調整する必要があります。
  • 合成可能な C/C++ コーディング スタイルについて説明します。
  • HLS コンパイラで生成されたレポートを使用して、最適化プロセスをガイドします。

上記のチェックリストは、ときどき参照できるように、近くに保管しておいてください。これは、パフォーマンス目標を達成するデザインの構築に必要なデザイン アクティビティ全体を要約したものです。

次に考慮すべきもう 1 つの重要な点は、アクセラレーションされた関数またはカーネルのインターフェイスです。カーネルの外部へのインタフェースは、最終的なシステム デザインの重要な要素です。カーネルは、より大きなデザインに接続したり、大規模なカーネル システム内のほかのカーネルと通信したり、システム外のメモリやデバイスと通信したりする必要がある可能性があります。M_AXI インターフェイスを使用したデザインのベスト プラクティス の別のチェックリストには、アクセラレーション カーネルの外部インターフェイスを設計する際に考慮すべき項目を示しています。