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