このセクションでは、AMD Vitis™ HLS でパフォーマンスおよびエリアの目標を満たすマイクロアーキテクチャを生成するための、さまざまな最適化手法を説明します。Vitis HLS を使用すると、次を含むさまざまな最適化指示子をデザインに適用できます。
- タスクをパイプライン処理し、現在のタスクが終了する前に次のタスクを開始できるよう指定。
- 関数、ループ、および領域を完了するまでのターゲット レイテンシを指定。
- 使用されるリソース数を制限。
- コードから継承または暗示された依存を無効にし、特定の演算を実行できるよう指定。たとえば、ビデオ ストリームのように初期データ値を削除または無視できる場合、パフォーマンスが改善できるのであれば、メモリの書き込み前に読み出しできるようにします。
- I/O プロトコルを指定して、関数引数を同じ I/O プロトコルのほかのハードウェア ブロックに接続。注記: サブ関数で使用される I/O プロトコルは Vitis HLS により自動的に決定されます。ポートにレジスタを付けるかどうかを指定することを除き、これらのポートを制御することはできません。
C/C++ のソース コードから RTL ハードウェア記述を合成する際のプロセスを理解するのに役立ちます。高位合成のスケジューリングおよびバインディングの理解 では、このプロセスの重要な点を詳細に説明し、どのように最適化すればよいかをよりよく理解できるようにしています。
最適化指示子は、さまざまな HLS プラグマをコンパイラ使用してコンパイラのプラグマとしてソース コードに直接追加することもできるほか、プラグマおよび指示子の追加 で説明されるように、指示子をコンフィギュレーション コマンドとして使用することもできます。次の表は、HLS コンパイラがプラグマまたはコンフィギュレーション コマンドとして使用可能な最適化指示子を示しています。
指示子 | 説明 |
---|---|
AGGREGATE | AGGREGATE プラグマは、構造体のすべての要素を 1 つの幅の広いベクターにグループ化し、構造体のすべてのメンバーを同時に読み出しおよび書き込みできるようにします。 |
ALIAS | ALIAS プラグマを使用すると、同じ DRAM バッファーにアクセスする複数ポインター間の距離を定義することで、Vitis HLS でデータ依存解析が有効になります。 |
ALLOCATION | 使用される演算、インプリメンテーション、または関数の数を制限します。これによりハードウェア リソースが共有されるので、レイテンシが増加する可能性があります。 |
ARRAY PARTITION | 大型の配列を複数の配列または個別のレジスタに分割し、データへのアクセスを改善し、ブロック RAM のボトルネックを削除します。 |
ARRAY_RESHAPE | 配列を多数の要素を含むものからワード幅の広いものに変更します。多数のブロック RAM を使用せずにブロック RAM アクセスを向上するのに有益です。 |
BIND_OP |
RTL で演算に特定のインプリメンテーションを指定します。 |
BIND_STORAGE |
RTL でストレージ エレメント、メモリに特定のインプリメンテーションを指定します。 |
DATAFLOW | タスク レベルのパイプライン処理を有効にし、関数およびループが同時に実行されるようにします。スループットおよびレイテンシの最適化に使用します。 |
DEPENDENCE | ループ キャリー依存を克服し、ループをパイプライン処理できるようにする (またはより短い間隔でパイプラインできるようにする) 追加情報を提供します。 |
DISAGGREGATE | 構造体を個別の要素に分割します。 |
EXPRESSION_BALANCE | 自動演算調整をオフにできます。 |
INLINE | 関数をインライン展開し、このレベルの関数の階層を削除します。関数の境界を超えたロジック最適化をイネーブルにし、関数呼び出しのオーバーヘッドを削減することにより、レイテンシ/間隔を改善します。 |
INTERFACE | 関数記述から RTL ポートをどのように作成するかを指定します。 |
LATENCY | 最小および最大レイテンシ制約を指定します。 |
LOOP_FLATTEN | 入れ子のループを 1 つのループに展開し、レイテンシを改善します。 |
LOOP_MERGE | 連続するループを結合して、全体的なレイテンシを削減し、共有を増やして最適化を向上します。 |
LOOP_TRIPCOUNT | 範囲が可変のループに使用されます。ループの反復回数の見積もりを指定します。これは合成には影響がなく、レポートにのみ影響します。 |
OCCURRENCE | 関数またはループをパイプライン処理する際に、あるロケーションのコードがそれを含む関数またはループのコードよりも低速で実行されることを指定します。 |
PERFORMANCE | ループに必要なトランザクション間隔を指定し、ツールに結果を得るための最適な方法を決定させます。 |
PIPELINE | ループまたは関数内で演算をオーバーラップできるようにして、開始間隔を削減します。 |
PROTOCOL | このコマンドは、コードの領域をプロトコル領域として指定します。プロトコル領域には、コードで明示的に指定されていなければ、Vitis HLS によりクロック動作は挿入されません。 |
RESET | 特定のステート変数 (グローバルまたはスタティック) のリセットを追加または削除するために使用します。 |
STABLE | データフロー領域の開始と終了に同期化を生成する場合に、データフロー領域の変数入力または出力を無視できることを指定します。 |
STREAM | データフロー最適化中に特定の配列を FIFO または RAM メモリ チャネルとしてインプリメントするよう指定します。hls::stream を使用している場合に、STREAM 最適化指示子を使用して hls::stream の設定を無効にします。 |
TOP | 合成の最上位関数はプロジェクト設定で指定します。この指示子は、関数を合成の最上位として指定するために使用できます。これにより、新しくプロジェクトを作成しなくても、同じプロジェクト内の別のソリューションを合成の最上位関数として指定できます。 |
UNROLL | for ループを展開して、ループ本体のインスタンスを複数作成し、その命令が別々にスケジュールできるようにします。 |
Vitis HLS では、最適化指示子に加え、合成結果のパフォーマンスに影響するコンフィギュレーション コマンドも多数提供されています。コンフィギュレーション コマンドの使用方法は、HLS コンフィギュレーション ファイルのコマンド を参照してください。次の表に、これらのコマンドの一部を示します。
GUI 指示子 | 説明 |
---|---|
配列パーティションの設定 | グローバル配列を含めた配列の分割方法と、分割が配列ポートに影響するかどうかを指定します。 |
コンパイル オプション | 自動ループ パイプラインおよび浮動小数点の math 最適化など、合成特有の最適化を制御します。 |
データフロー設定 | データフロー最適化でのデフォルトのメモリ チャネルと FIFO の深さを指定します。 |
インターフェイス コンフィギュレーション | 最上位関数の引数に関連付けられていない I/O ポートを制御し、最終的な RTL から未使用のポートが削除されるようにします。 |
演算子のコンフィギュレーション | 指定した演算のデフォルト レイテンシとインプリメンテーションを設定します。 |
RTL のコンフィギュレーション | ファイルおよびモジュールの命名、リセット制御などの出力 RTL を制御できます。 |
スケジュール設定 | 合成のスケジューリング段階中に使用するエフォート レベルおよび出力メッセージの詳細度合いを決定します。 |
ストレージの設定 | 指定したストレージ タイプのデフォルト レイテンシとインプリメンテーションを設定します。 |
展開設定 | ループの展開に使用されるデフォルトのトリップカウントしきい値を設定します。 |