ループの自動パイプライン - 2023.2 日本語

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

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

syn.compile.pipeline_loops コンフィギュレーション コマンドを使用すると、反復回数に基づくループの自動パイプライン処理をイネーブルにできます。トリップカウントが指定した制限よりも大きいループは、すべて自動的にパイプライン処理されます。デフォルトの制限数は 64 です。

次のようなコードがあるとします。

loop1: for (i = 0; i < 5; i++) {
   // do something 5 times ... 
} 

syn.compile.pipeline_loops コマンドを 4 に設定すると、for ループ (loop1) がパイプライン処理されます。これは、次のコードに示すように、PIPELINE プラグマを追加することと同じです。

loop1: for (i = 0; i < 5; i++) {
#pragma HLS PIPELINE II=1 
   // do something 5 times ... 
} 

ただし、入れ子のループの場合、ツールは最も内側のループから開始し、パイプライン処理できるかどうかを判断し、ループ ネストの上方向に移動していきます。次の例では、syn.compile.pipeline_loops のしきい値はまだ 4 で、最も内側のループ (loop1) がパイプライン処理されるようマークされています。次に、ループ ペアの親ループ (loop2) を評価したところ、これもパイプライン処理できることがわかりました。この場合、ツールは loop1loop2 に展開し、loop2 をパイプライン処理するようにマークします。この後、親ループ (loop3) に移動して、解析を繰り返します。

loop3: for (y = 0; y < 480; y++) {
   loop2: for (x = 0; x < 640; x++) {
      loop1: for (i = 0; i < 5; i++) {
         // do something 5 times ... 
      } 
   }
}

自動パイプライン処理を適用するべきでないループがデザインに含まれる場合は、そのループに PIPELINE 指示子を off 設定で適用します。この指示子を off に設定すると、ループの自動パイプライン処理は実行されなくなります。

重要: ツールでは、ユーザー指定の指示子をすべて実行された後に、syn.compile.pipeline_loops コマンドが適用されます。たとえば、ループにユーザー指定の UNROLL 指示子が適用される場合、このループがまず展開され、ループが削除される際に自動ループ パイプラインは適用されません。