set_directive_performance - 2023.2 日本語

Vitis 高位合成ユーザー ガイド (UG1399)

Document ID
UG1399
Release Date
2023-12-18
Version
2023.2 日本語

説明

ヒント: set_directive_performance は、ループとループ ネストに適用され、パフォーマンスを決定するためには、既知のループ トリップカウントが必要です。ループに tripcount 変数が含まれる場合は、set_directive_loop_tripcount も指定する必要があります。

set_directive_performance を使用すると、ループの連続した開始間のクロック サイ クル数を定義する高位レベルの制約 (target_ti または target_tl) を指定し、目的の結果を得るために必要な下位レベルの UNROLL、PIPELINE、ARRAY_PARTITION、および INLINE 指示子をツールで推論できます。set_directive_performance を指定される値は必ず達成されとは限らず、あくまでもターゲットです。

target_ti は、ループの連続した開始間隔、またはループの最初の反復の開始と、次のループの最初の反復の開始の間の間隔です。次のコード例では、target_ti=TL1 の連続する 2 回の反復間の L2 ループ開始の目標間隔が 100 サイクルである必要があることを示しています。

const int T = 100;
L1: for (int i=0; i<N; i++)
  L2: for (int j=0; j<M; j++){
pragma HLS performance target_ti=T
   ...
   }

target_tl は、ループの開始から終了までの間隔、またはループの最初の反復の開始からループの最後の反復の完了までの間隔です。たとえば、前述のコード例の場合、target_tl=T は、L1 の 1 回の反復間の L2 ループの目標完了が 100 サイクルである必要があることを示しています。

注記: set_directive_inline は、II=1 を実現するパイプライン処理されたループ内の関数に自動的に適用され、スループットを向上させます。II=1 でパイプラインを推論する PERFORMANCE プラグマや指示子を適用した場合、自動インライン最適化もトリガーされます。特定の関数に対してこのインライン最適化をディスエーブルにするには、set_directive_inline off を使用します。

トランザクション間隔は、ループの開始間隔 (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>function/loop_label 形式でループを指定します。

オプション

-target_ti=<value>
反復を完了するためのループのクロック サイクル数として定義されたターゲット トランザクション間隔を指定します。トランザクション間隔とは、ループがトランザクションの処理を開始してから、次のトランザクションの処理を開始するまでの時間のことです。<value> は、整数、浮動小数点、または定数式として指定できます。この式は、ツールによって整数に変換されます。
注記: 切り捨てがあった場合は、警告メッセージが表示されます。
-target_tl=<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