説明
set_directive_performance は、テスト対象デザイン (DUT) の最上位関数全体にグローバルに適用されます。また、ループレベルの PERFORMANCE 指示子としてループに適用することも可能です。
Vitis HLS の set_directive_performance 指示子は、デザインの全体的なパフォーマンス目標を定義するメカニズムを提供し、合成ツールの最適化エフォートを示します。この指示子は、デザインの最上位 (カーネル/IP) とデザイン内の特定のループ レベルの 2 つの異なる範囲に適用できます。
最上位 PERFORMANCE 指示子
カーネルまたは IP の最上位関数に set_directive_performance 指示子を適用することで、目標とするスループットを達成することに重点を置いて、全体的なパフォーマンス目標を指定できます。この指示子をカーネルの最上位関数に適用すると、HLS ツールがデザイン全体のパフォーマンス解析を実行します。この解析では、指定されたパフォーマンス目標を達成できるかどうかを判断するために、全体的なデザインの構造を評価します。全体的な目標とこの解析に基づいて、ツールは、デザイン階層内の個々のループとループ ネストに対して、適切なループレベル パフォーマンス指示子を自動的に推論します。
ループレベル PERFORMANCE 指示子
set_directive_performance 指示子を特定のループまたはループ ネストに直接適用することで、そのループまたはループ ネストの特定のセクションに対してパフォーマンス目標を定義できます。ループレベル PERFORMANCE 指示子を使用すると、ループの連続した開始間のクロック サイクル数を定義する高位の制約 target_ti を指定し、目的の結果を得るために必要な下位の UNROLL、PIPELINE、ARRAY_PARTITION、および INLINE 指示子をツールで推論できます。PERFORMANCE 指示子で指定される値は必ず達成されるとは限らず、あくまでもターゲットです。
set_directive_performance 指示子は、最上位 (関数全体/DUT) とループ レベルの両方に適用可能で、target_ti パラメーターを使用して、パフォーマンス目標に向けた最適化を指示します。
-
target_ti(ターゲット開始間隔): DUT またはループの連続した開始間のクロック サイクル数を定義します。- 最上位 PERFORMANCE 指示子:
-
最上位に適用される場合、
target_tiは、関数の実行開始から次の関数の実行開始までの目標間隔を指定します。60 フレーム/秒 (FPS) のフレーム レートを目標とする画像処理デザインの最上位 PERFORMANCE 指示子を計算する例を考えてみましょう。60 FPS のフレーム レートを達成するためには、関数/DUT は 1/60 秒以内に再開し、新しいフレームを読み出す準備が整っている必要があります。 - ターゲット TI = 1/FPS = 1/60 ~= 16.67 ミリ秒。
- これは、60 フレーム/秒 (FPS) の目標を維持するために、関数/DUT が 16.7 ミリ秒以内に再開し、新しいフレームを読み出す準備が整っている必要があることを示しています。
- ループレベル PERFORMANCE 指示子:
-
ループレベルに適用される場合、
target_tiは、外側ループの連続する反復における最初の反復の開始から次の反復の開始までの目標間隔を指定します。次の例では、ループL2でtarget_ti=Tが設定されている場合、L1の反復におけるループL2の実行開始から、L1の次の反復におけるループL2の実行開始までのTサイクルの間隔をターゲットとします。 -
const int T = 100; L1: for (int i=0; i<N; i++) L2: for (int j=0; j<M; j++) { directive HLS performance target_ti=T ... }
トランザクション間隔は、ループの開始間隔 (II) に反復回数 (tripcount) を掛けた値 (target_ti = II * loop tripcount) になります。逆に、target_ti は FreqHz/毎秒ごとの演算になります。
たとえば、呼び出しごとに 1 つのフレームを処理する画像処理関数のスループット目標が 60 fps の場合、関数のターゲット スループットは毎秒 60 呼び出しになります。クロック周波数が 180 MHz の場合、target_ti は、関数呼び出しごとに 180M/60 なので、300 万クロックサイクルになります。
構文
ループの指示子を指定します。
set_directive_performance <location> [OPTIONS]
説明:
<location> は、最上位関数またはループを指定します。
オプション
-
-target_ti=<value> - 反復を完了するためのループのクロック サイクル数として定義されたターゲット トランザクション間隔を指定します。トランザクション間隔とは、ループがトランザクションの処理を開始してから、次のトランザクションの処理を開始するまでの時間のことです。<value> は、整数、浮動小数点、または定数式として指定できます。この式は、ツールによって整数に変換されます。注記: 切り捨てがあった場合は、警告メッセージが表示されます。
- unit=[sec | cycle]
-
target_tiまたはtarget_tlの値に対する単位を指定します。単位は秒かクロック サイクルで指定できます。単位が秒の場合は、ナノ秒 (ns)、ピコ秒 (ps)、マイクロ秒 (us) を指定できます。
例 1
func 関数の loop_1 というループは、ターゲット トランザクション間隔を 4 クロック サイクルにするように指定されています。
set_directive_performance func/loop_1 -target_ti=4