• 検索結果がありません。

Vitis HLS での最適化手法

ドキュメント内 Vitis 高位合成ユーザー ガイド (ページ 194-200)

このセクションでは、Vitis HLS でパフォーマンスおよびエリアの目標を満たすマイクロアーキテクチャを生成するた めの、さまざまな最適化手法を説明します。Vitis HLS を使用すると、次を含むさまざまな最適化指示子をデザインに 適用できます。

タスクをパイプライン処理し、現在のタスクが終了する前に次のタスクを開始できるよう指定。

関数、ループ、および領域を完了するまでのターゲット レイテンシを指定。

使用されるリソース数を制限。

コードから継承または暗示された依存を無効にし、特定の演算を実行できるよう指定。たとえば、ビデオ ストリ ームのように初期データ値を削除または無視できる場合、パフォーマンスが改善できるのであれば、メモリの書 き込み前に読み出しできるようにします。

• I/O プロトコルを指定して、関数引数を同じ I/O プロトコルのほかのハードウェア ブロックに接続。

注記: サブ関数で使用される I/O プロトコルは Vitis HLS により自動的に決定されます。ポートにレジスタを付け るかどうかを指定することを除き、これらのポートを制御することはできません。

最適化手法は、その最適化が一般的にデザインに適用される状況で説明します。

スループットの最適化: 最適化を一般的に使用される順序で説明します。タスクのパイプライン処理によるパフ ォーマンスの向上、タスク間のデータフローの向上、パフォーマンスを制限する可能性のある問題を解決するた めの構造の最適化を示します。

レイテンシの最適化: レイテンシ制約とループ遷移の削除を使用して、演算を終了するのに必要なクロック サイク ル数を削減します。

エリアの最適化: 演算のインプリメント方法に焦点を置き、演算数を制御して、演算をハードウェアにインプリメ ントする方法を指定することにより、エリアを向上する手法を説明します。

ロジックの最適化: RTL のインプリメンテーションに影響する最適化について説明します。

最適化指示子をコンパイラ コンパイラとしてソース コードに直接追加するか、プラグマおよび指示子の追加 に説明 されているように、set_directive Tcl コマンドを使用して Tcl スクリプトに最適化指示子を含めてコンパイル中に ソリューションで使用されるようにすることができます。次の表に、Vitis HLS でプラグマまたは Tcl 指示子として使 用可能な最適化指示子を示します。

表 13: Vitis HLS の最適化指示子

指示子 説明

ALLOCATION 使用される演算、インプリメンテーション、または関数の数を制限します。これによりハードウ

ェア リソースが共有されるので、レイテンシが増加する可能性があります。

ARRAY_PARTITION 大型の配列を複数の配列または個別のレジスタに分割し、データへのアクセスを改善し、ブロッ

ク RAM のボトルネックを削除します。

ARRAY_RESHAPE 配列を多数の要素を含むものからワード幅の広いものに変更します。多数のブロック RAM を使

用せずにブロック RAM アクセスを向上するのに有益です。

BIND_OP RTL で演算に特定のインプリメンテーションを指定します。

表 13: Vitis HLS の最適化指示子 (続き)

指示子 説明

BIND_STORAGE RTL でストレージ エレメント、メモリに特定のインプリメンテーションを指定します。

DATAFLOW タスク レベルのパイプライン処理を有効にし、関数およびループが同時に実行されるようにしま

す。スループットおよびレイテンシの最適化に使用します。

DEPENDENCE ループ キャリー依存を克服し、ループをパイプライン処理できるようにする (またはより短い間

隔でパイプラインできるようにする) 追加情報を提供します。

DISAGGREGATE 構造体を個別の要素に分割します。

EXPRESSION_BALANCE 自動演算調整をオフにできます。

INLINE 関数をインライン展開し、このレベルの関数の階層を削除します。関数の境界を超えたロジック

最適化をイネーブルにし、関数呼び出しのオーバーヘッドを削減することにより、レイテンシ/間 隔を改善します。

INTERFACE 関数記述から RTL ポートをどのように作成するかを指定します。

LATENCY 最小および最大レイテンシ制約を指定します。

LOOP_FLATTEN 入れ子のループを 1 つのループに展開し、レイテンシを改善します。

LOOP_MERGE 連続するループを結合して、全体的なレイテンシを削減し、共有を増やして最適化を向上します。

LOOP_TRIPCOUNT 範囲が可変のループに使用されます。ループの反復回数の見積もりを指定します。これは合成に

は影響がなく、レポートにのみ影響します。

OCCURRENCE 関数またはループをパイプライン処理する際に、あるロケーションのコードがそれを含む関数ま

たはループのコードよりも低速で実行されることを指定します。

PIPELINE ループまたは関数内で演算をオーバーラップできるようにして、開始間隔を削減します。

RESET 特定のステート変数 (グローバルまたはスタティック) のリセットを追加または削除するために

使用します。

SHARED グローバル変数または関数引数配列が、複数のデータフロー プロセスで同期化の必要なしで共有

されることを指定します。

STABLE データフロー領域の開始と終了に同期化を生成する場合に、データフロー領域の変数入力または

出力を無視できることを指定します。

STREAM データフロー最適化中に特定の配列を FIFO または RAM メモリ チャネルとしてインプリメント

するよう指定します。hls::stream を使用している場合に、STREAM 最適化指示子を使用して hls::stream の設定を無効にします。

TOP 合成の最上位関数はプロジェクト設定で指定します。この指示子は、関数を合成の最上位として 指定するために使用できます。これにより、新しくプロジェクトを作成しなくても、同じプロジ ェクト内の別のソリューションを合成の最上位関数として指定できます。

UNROLL for ループを展開して、ループ本体のインスタンスを複数作成し、その命令が別々にスケジュー

ルできるようにします。

Vitis HLS では、最適化指示子に加え、合成結果のパフォーマンスに影響するコンフィギュレーション コマンドも多

数提供されています。コンフィギュレーション コマンドの使用方法は、コンフィギュレーション オプションの設定 を参照してください。次の表に、これらのコマンドの一部を示します。

表 14: Vitis HLS のコンフィギュレーション コマンド

GUI 指示子 説明

[Config Array Partition] グローバル配列を含めた配列の分割方法と、分割が配列ポートに影響するかどうかを指定します。

[Config Compile] 自動ループ パイプラインおよび浮動小数点の math 最適化など、合成特有の最適化を制御しま

す。

[Config Dataflow] データフロー最適化でのデフォルトのメモリ チャネルと FIFO の深さを指定します。

[Config Interface] 最上位関数の引数に関連付けられていない I/O ポートを制御し、最終的な RTL から未使用のポー

トが削除されるようにします。

表 14: Vitis HLS のコンフィギュレーション コマンド (続き)

GUI 指示子 説明

[Config Op] 指定した演算のデフォルト レイテンシとインプリメンテーションを設定します。

[Config RTL] ファイルおよびモジュールの命名、リセット形式、FSM エンコーディングを含めた出力 RTL を制

御できます。

[Config Schedule] 合成のスケジューリング段階中に使用するエフォート レベルおよび出力メッセージの詳細度合

いを決定します。

[Config Storage] 指定したストレージ タイプのデフォルト レイテンシとインプリメンテーションを設定します。

[Config Unroll] ループの展開に使用されるデフォルトのトリップカウントしきい値を設定します。

リセット動作の制御

リセット ポートは、リセット信号が適用されたときにリセット ポートに接続されたレジスタおよびブロック RAM を 初期値に戻すために FPGA で使用されます。RTL コンフィギュレーションで最も重要なのは、通常リセット動作の選 択です。

注記: リセット動作について説明する前に、初期化とリセットの違いを理解しておくことが重要です。詳細は、初期 化動作を参照してください。

RTL リセット ポートの存在と動作は、次の図に示すように config_rtl コマンドで制御されます。このコマンドに は、[Solution] → [Solution Settings] からアクセスできます。

図 65: RTL コンフィギュレーション

リセット設定では、リセットの極性を設定したり、リセットが同期か非同期かを設定できますが、[reset] オプション を使用すると、リセット信号が適用されたときにどのレジスタをリセットするかを制御することもできます。

重要: AXI4 インターフェイスがデザインで使用される場合は、config_rtl コンフィギュレーションの設定に関係 なく、リセット極性は自動的にアクティブ Low に変更されます。これは、AXI4 規格の要件です。

[reset] オプションには、次の 4 つの設定があります。

• [none]: デザインにリセットは追加されません。

ドキュメント内 Vitis 高位合成ユーザー ガイド (ページ 194-200)