pragma HLS loop_flatten - 2024.1 日本語

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

Document ID
UG1399
Release Date
2024-07-03
Version
2024.1 日本語

説明

入れ子のループを 1 つのループ階層にフラット化し、レイテンシを改善します。

RTL インプリメンテーションでは、外側のループから内側のループに、内側のループから外側のループに移動するのに 1 クロック サイクルかかります。入れ子のループをフラットにすると、それらを 1 つのループとして最適化できるので、クロック サイクル数を削減でき、ループ本文のロジックをさらに最適化することが可能です。

ループ階層内の一番内側にあるループの本体に LOOP_FLATTEN プラグマを適用します。完全または半完全ループのみをこの方法でフラットにできます。

完全ループの入れ子
  • 最内ループのみにループ本体の内容が含まれます。
  • ループ文の間に指定されるロジックはありません。
  • すべてのループ範囲は定数です。
半完全ループの入れ子
  • 最内ループのみにループ本体の内容が含まれます。
  • ループ文の間に指定されるロジックはありません。
  • 最外ループの範囲は変数にできます。
不完全ループの入れ子
内側のループの範囲が変数であったり、ループ本体が内側のループにのみ含まれているとは限らない場合、コードの構造を変更するか、ループ本体内のループを展開して、完全ループの入れ子を作成してみてください。

構文

C ソースの入れ子のループ内に配置します。

#pragma HLS loop_flatten off

説明:

off
オプションのキーワードで、フラット化がされないようにできるほか、指定ロケーション内の一部のループはフラット化せず、それ以外のループをフラット化したりできます。
重要: LOOP_FLATTEN プラグマまたは指示子を使用すると、最適化がイネーブルになります。off を使用すると、ディスエーブルになります。

例 1

関数 foo 内の loop_1 と、ループ階層でこれより上にあるすべてのループ (完全または半完全) を 1 つのループにフラット化します。プラグマを loop_1 の本体に記述します。

void foo (num_samples, ...) {
  int i;
  ...
  loop_1: for(i=0;i< num_samples;i++) {
   #pragma HLS loop_flatten
   ...
    result = a + b;
  }
}

例 2

loop_1 でループがフラット化されないようにします。

loop_1: for(i=0;i< num_samples;i++) {
   #pragma HLS loop_flatten off
   ...