解析が終了したら、関数のパフォーマンスを最適化する必要があることがほとんどです。パフォーマンスに問題がな くても、さらに改善の可能性はあります。このセクションでは、プロジェクトに最適化を適用するメカニズムについ て説明します。実行可能なさまざまなタイプの最適化については、Vitis HLS での最適化手法 を参照してください。
さまざまな HLS 指示子を使用して最適化指示子をコンパイラとしてソース コードに直接追加するか、
set_directive Tcl コマンドを使用して Tcl スクリプトに最適化指示子を含めてコンパイル中にソリューションで 使用されるようにすることができます。
Vitis HLS には、最適化プラグマおよび指示子に加え、シミュレーションおよび合成のデフォルト結果を管理するため
のコンフィギュレーション設定も多く含まれます。これらのコンフィギュレーション設定には、[Solution] → [Solution
Settings...] をクリックするとアクセスでき、[Add] をクリックすると追加できます。特定のコンフィギュレーション設
定の適用方法は、コンフィギュレーション コマンド を参照してください。
追加のソリューションの作成
Vitis HLS の最も一般的な使用方法では、初期デザインを作成し、結果を解析して、エリアおよびパフォーマンス要件 を満たすために最適化を実行します。これは通常繰り返し実行されるプロセスで、望ましい結果を得るためには複数 の段階および複数の最適化が必要です。ソリューションを使用すると、ツールを設定し、結果を向上するため関数に 指示子を追加し、結果を保存してほかのソリューションと比較するのに便利です。
追加のソリューションを作成するには、[Project] → [New Solution] をクリックするか、[New Solution] ツールバーボ
タン をクリックします。これにより、次の図に示す [Solution Wizard] ダイアログ ボックスが開きます。
図 31: [Solution Wizard] ダイアログ ボックス
[Solution Wizard] ダイアログ ボックスには、新規 Vitis HLS プロジェクトの作成 に説明されているオプションと、別 のソリューションから指示子と制約をコピーする [Copy directives and constraints from solution] というオプションが あります。複数のソリューションがある場合は、コピー元のソリューションを選択できます。新しいソリューション が作成されたら、最適化指示子を追加 (別のソリューションからコピーした場合は変更) できます。
プロジェクトに複数のソリューションがある場合は、通常コマンドは現在アクティブなソリューションに対して実行 されます。アクティブ ソリューションを指定するには、[Explorer] ビューでソリューションを右クリックし、[Set Active Solution] コマンドをクリックします。デフォルトでは、合成コマンドおよびシミュレーション コマンドはアク ティブ ソリューションをビルドし、指示子はアクティブ ソリューションに適用され、アクティブ ソリューションの レポートが開きます。プロジェクトに複数のソリューションがある場合は、正しいソリューションを指定しているこ とを確認してください。
ヒント: [Explorer] ビューでは、アクティブソリューションが太字の斜体で表示されます。
プラグマおよび指示子の追加
Vitis HLS プラグマおよび指示子を使用すると、コードの合成結果を制御できます。
• HLS プラグマはソースコードに追加し、最適化をイネーブル、または元のソースコードを変更します。コードは 合成するたびに指定したプラグマに従ってインプリメントされます。
• 最適化指示子 (set_directiveコマンド) は Tcl コマンドとして指定し、特定のソリューションやソリューション のセットに関連付けることができます。同じコードをさまざまなソリューションで合成できます。
重要: プラグマまたは指示子がほかのプラグマまたは指示子と競合する場合は、その競合が解決されるまで合成でエ ラーが返されます。たとえば、ARRAY_PARTITION および ARRAY_RESHAPE プラグマを同じ配列変数に割り当てる と、エラーになります。
プラグマまたは指示子をプロジェクトに追加するには、次の手順に従います。
1. Vitis HLS IDE の [Explorer] ビューで [Source] フォルダーの下のコードファイルをダブルクリックし、[Code Editor] ダイアログ ボックス、[Outline] ビュー、[Directive] ビューを開きます。
2. [Directive] ビューでソース コードにプラグマを追加します。このビューを使用すると、プロジェクトでプラグマ
および指示子を追加および管理しやすくなり、プラグマが正しく適切な位置に適用されます。このビューは、次 のように使用します。
a. ソース コードを開いた状態で [Directive] ビューのタブをクリックし、プラグマまたは指示子を追加するコー ドの関数、ループ、または機能を見つけます。
Vitis HLS は、[Directive] ビューで選択されているオブジェクトの適切なスコープに指示子を適用します。
b. [Directive] ビューでオブジェクトを右クリックし、[Insert Directive] をクリックします。次の図に示す Vitis
HLS の [Directive Editor] ダイアログ ボックスが開きます。
図 32: [Vitis HLS Directive Editor] ダイアログ ボックス
c. [Vitis HLS Directive Editor] ダイアログ ボックスを確認します。このダイアログ ボックスには、次のセクシ
ョンが含まれます。
• [Directive]: 適用する指示子またはプラグマを指定します。ドロップダウン リストに表示される使用可能 な指示子から選択します。
• [Destination]: プラグマをソース ファイルに追加するか、set_directive コマンドを Tcl スクリプト、
アクティブ ソリューションに関連付けられた指示子ファイルを追加するかを指定します。
ヒント: プロジェクトに 1 つしかソリューションがない場合は、それが常にアクティブになります。複数のソリュ ーションがある場合は、プロジェクトで指定のソリューションをアクティブにする必要があります。プロジェクト の [Explorer] ビューでソリューションを右クリックし、[Set Active Solution] コマンドをクリックします。ソリュー ション追加の詳細は、追加のソリューションの作成 を参照してください。
• [Options]: 現在選択している指示子に関連付けられている設定可能なオプションをリストします。
d. [OK] をクリックしてプラグマまたは指示子を適用します。
注記: 選択した指示子に関連する情報を表示するには、[Help] をクリックします。
スクリプトでの指示子の使用 vs. コードでのプラグマの使用
[Vitis HLS Directive Editor] ダイアログ ボックスの [Destination] セクションでは、次のデスティネーションのいずれ かを選択できます。
• [Directive File]: Vitis HLS は、指示子を Tcl コマンドとしてソリューション ディレクトリの directives.tcl ファイル に挿入します。
• [Source File]: Vitis HLS は、指示子をプラグマとして C ソース ファイルに直接挿入します。
次の表に、利点と欠点を示します。
表 2: Tcl 指示子 vs プラグマ
指示子の形式 利点 欠点
指示子ファイル (Tcl スクリプト) 各ソリューションに独立した指示子が含 まれます。デザインでさまざまな指示子 を試す場合に最適です。
ソリューションを合成し直すと、そのソリ ューションで指定した指示子のみが適用 されます。
C ソース ファイルをサードパーティに送 付またはアーカイブする場合は、
directives.tcl ファイルも含める必要があ ります。
結果を再作成するには
directives.tcl ファイルが必要です。
ソース コード (プラグマ) 最適化指示子は C ソース コードに埋め込 まれます。
C ソース ファイルをサードパーティに C IP として送付する場合に最適です。同じ 結果を再作成するのにほかのファイルは 必要ありません。
TRIPCOUNT および INTERFACE などの変 更されるる可能性が低い指示子に便利な 方法です。
最適化指示子がコードに埋め込まれてい ると、合成し直したときにそれらが自動的 にすべてのソリューションに適用されま す。
ヒント: Vitis コア開発キットを使用して C/C++ コードのハードウェア アクセラレーションを定義する際は、Tcl フ ァイルで指示子を使用するのではなく、ソース コードにプラグマを使用します。Vitis HLS ボトムアップ フロー (ま
たは Vitis カーネルフロー) では、指示子を使用して異なるソリューションを開発できますが、最終的な指示子をプ
ラグマに変換する必要があります。
プラグマ属性の値を指定する際、リテラル値 (1、55、3.14 など) を使用するか、#define を使用してマクロを渡すこ とができます。次の例では、プラグマをリテラル値で指定しています。
#pragma HLS ARRAY_PARTITION variable=k_matrix_val cyclic factor=5
次の例では、定義されているマクロを使用しています。
#define E 5
#pragma HLS ARRAY_PARTITION variable=k_matrix_val cyclic factor=E
適切なスコープへの指示子の適用
Vitis HLS GUI では特定のコード オブジェクトに指示子を適用できますが、指示子はそのオブジェクトを含むスコー プに追加されます。たとえば、Vitis HLS GUI では INTERFACE プラグマをインターフェイス オブジェクトに適用で きますが、指示子は最上位関数 (スコープ) に適用されます。インターフェイス ポート (オブジェクト) はその指示子内 で特定されます。
最適化指示子は、次のオブジェクトおよびスコープに適用できます。
• [Functions]: 指示子を関数に適用すると、Vitis HLS でその関数のスコープ内のオブジェクトすべてに指示子が適用
されます。プラグマの効果は、関数の次の階層レベルで停止し、サブ関数には適用されません。
ヒント: PIPELINE 指示子などの -recursive オプションを含む指示子は、階層で繰り返し適用できます。
• [Interfaces]: Vitis HLS で指示子が最上位関数に適用されます。最上位関数がインターフェイスを含むスコープで す。
• [Loops]: 指示子がループのスコープ内のすべてのオブジェクトに適用されます。
たとえばLOOP_MERGE指示子をループに適用すると、Vitis HLS では指示子がループ内のサブループに適用され、
ループ自体には適用されません。指示子が適用されたループは、同じ階層レベルの等価ループとは統合されませ ん。
• [Arrays]: 指示子は配列を含むスコープに適用されます。
グローバル変数への最適化指示子の適用
指示子は、スコープまたはスコープ内のオブジェクトにのみ適用できます。関数のスコープ外で宣言されるグローバ ル変数には直接適用できません。このため、グローバル変数に指示子を適用するには、次の手順を使用して手動で割 り当てる必要があります。
1. コード エディターでコードを開き、[Directive] ビューでグローバル変数を使用するスコープ (関数、ループ、ま たは領域) を選択します。
2. 右クリックして [Insert Directive] をクリックし、[Vitis HLS Directives Editor] ダイアログ ボックスを開きます。
3. 必要な指示子を選択して設定し、[OK] をクリックします。
4. [Directive] ビューで追加した指示子を見つけ、variable 名を手動で変更してグローバル変数に割り当てます。
クラス オブジェクトへの最適化指示子の適用
最適化指示子は、クラスで定義されるオブジェクトまたはスコープにも適用できます。違いは、通常クラスはヘッダ ー ファイルで定義されている点です。次のいずれかの方法でヘッダー ファイルを開きます。
• Vitis HLS GUI の [Explorer] ビューで Includes フォルダーを開き、ヘッダー ファイルをダブルクリックしてコー ド エディターで開きます。
• ソース コード ファイル内で、ヘッダー ファイルの #include 文の上にカーソルを置いて [Ctrl] キーを押し、ヘッ ダー ファイルをクリックしてコード エディターで開きます。
[Directives] タブにヘッダー ファイルのオブジェクトが表示され、指示子が適用できます。