インテル®高位合成 (HLS) コンパイラー プロ・エディション: ベスト・プラクティス・ガイド

ID 683152
日付 12/16/2019
Public
ドキュメント目次

4.2.1. ループのパイプライン処理

パイプライン処理は、並列化の一種です。アセンブリー・ラインのように、ループの複数のイタレーションを並行実行します。
次の基本ループについて検討します。このループには、3ステージと3イタレーションがあります。ループステージとは、ループ内で1クロックサイクルの間に発生する動作です。
図 6. 基本ループ (3ステージと3イタレーション)


このループの各ステージの実行に1クロックサイクルかかる場合、このループのレイテンシーは、9サイクルです。
次の図で示すパイプライン処理は、図 6 のループのものです。
図 7. パイプライン化ループ (3ステージと4イタレーション)


パイプライン化ループのレイテンシーは、3イタレーションで5クロックサイクル (かつ、4イタレーションで6サイクル) ですが、領域トレードオフはありません。2回目のクロックサイクル中、パイプライン・ループのStage 1ではイタレーション2を処理し、Stage 2ではイタレーション1を処理し、Stage 3は非アクティブです。

このループのパイプライン処理では、ループの開始間隔 (II) の値は1です。II の値が1ということは、1クロックサイクルの遅延が、連続した各ループのイタレーションが開始する間に存在するという意味です。

The インテル®HLSコンパイラー プロ・エディションでは、デフォルトでループのパイプライン処理を試みます。ループのパイプライン処理は、ループの展開と同じ一定のイタレーション回数の制約は受けません。

すべてのループが、図 7 で示されるループと同じ様にパイプライン処理できるわけではありません。特に、各イタレーションの依存する値が、前のイタレーションで計算された値である場合はそうです。

例えば、Stage 1のループが、前のループ・イタレーションのStage 3の処理中に計算された値に依存するとします。このような場合、2回目 (オレンジ色) のイタレーションによる実行は、1回目 (青色) のイタレーションがステージ Stage 3に到達するまでは開始できません。このような依存関係は、ループ搬送依存関係と呼ばれます。

この例では、ループのパイプライン処理は、II = 3で行われます。IIはループ・イタレーションのレイテンシーと同じであるため、ループは、実際にはパイプライン処理されません。ループの合計レイテンシーの見積もりは、次の数式ですることができます。

ここでは、 は、ループの実行にかかるサイクル数です。また、 iは、1回のループ・イタレーションの実行にかかるサイクル数です。

インテル®HLSコンパイラー プロ・エディションでは、ネストされたループのパイプライン処理をサポートします。このとき内部ループは展開しません。ネストされたループのレイテンシーを計算するとき、この式を再帰的に適用します。この再帰が意味するのは、II>1を持つことによる問題は、外側のループに対してよりも内側のループに対することです。したがって、アルゴリズムは、ほとんどの作業をII=1の内側のループで行う場合は、外側のループがII>1であっても、引き続き良好に機能します。