ループのパイプライン処理 - 2021.2 Japanese

Vitis 統合ソフトウェア プラットフォームの資料: アプリケーション アクセラレーション開発 (UG1393)

Document ID
UG1393
Release Date
2022-03-29
Version
2021.2 Japanese

ループのパイプライン処理 に説明されているように、ループをパイプライン処理すると、ループの反復を時間的にオーバーラップさせることができます。反復を同時に実行できるようにすると、リソースを反復間で共有でき (リソース使用量を削減)、展開されないループと比較して実行時間が短くなります。

パイプライン処理を C/C++ でイネーブルにするには、 pragma HLS pipeline を使用します。

#pragma HLS PIPELINE

OpenCL API では、xcl_pipeline_loop 属性を使用します。

__attribute__((xcl_pipeline_loop))
注記: OpenCL API では、ループのパイプライン処理に xcl_pipeline_workitems を使用する方法もあります。ワーク アイテム ループは明示的に記述されないので、これらのループをパイプライン処理するにはこの属性が必要です。
__attribute__((xcl_pipeline_workitems))

この例の場合、HLS プロジェクトのスケジュール ビューアーの表示は次のようになります。

図 1. スケジュール ビューアーに表示されたパイプライン処理済みのループ

全体的な見積もりは次のようになります。

図 2. パフォーマンス見積もり

ループの各反復のレイテンシは 2 サイクルなので、オーバーラップする反復は 1 つだけです。これにより、総レイテンシは処理前の 1/2 の 257 サイクルになります。ループ展開よりも少ないリソースでレイテンシを削減できます。

ほとんどの場合、ループのパイプライン処理だけで全体的なパフォーマンスを改善できますが、パイプライン処理がどれだけ効率的かはループの構造によって異なります。一般的な制限事項は次のとおりです。

  • メモリ ポートまたはプロセス チャネルなどのようにリソースに限りがある場合、反復のオーバーラップ (開始間隔) が制限されます。
  • ループ運搬依存 (1 つの反復で計算された変数条件が次の反復に影響する) により、パイプラインの II が増加することがあります。

これらは高位合成中にレポートされ、スケジュール ビューアーで確認できます。最高のパフォーマンスを得るには、コードを修正してこれらの制限要素を取り除くか、依存性を取り除く (配列のメモリ インプリメンテーションを再構築、依存を完全になくすなど) ようにツールに命令する必要があります。