パイプラインのフラッシュとパイプラインのタイプ - 2023.2 日本語

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

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

パイプラインのフラッシュ

パイプライン処理は、パイプラインにデータが入力され続けられる限り継続して実行されます。処理するデータがなければ、パイプラインは一時停止します。これを次の図に示します。Input Data Valid 信号が Low になり、有効な入力データがないことが示されています。この信号が High になって処理するデータが新しく入ってきたことを示すと、パイプラインは動作を再開します。

図 1. 一時停止するループのパイプライン

場合によっては、空にできる (フラッシュできる) パイプラインが必要なこともあります。このために、flush オプションが提供されています。パイプラインをフラッシュすると、パイプラインの開始時にデータ valid 信号によりデータがないことが示されたときに、新しい入力の読み出しが停止し、最後の入力が処理されてパイプラインから出力されるまで、処理が継続されてその後の各パイプライン段が閉鎖されます。

後述するように、ツールは任意のパイプライン処理されたループまたは関数に使用する正しいパイプライン形式を自動的に選択します。ただし、syn.compile.pipeline_style コンフィギュレーション コマンドを使用してデフォルトのパイプライン形式を指定することで、このデフォルト動作を変更できます。

また、PIPELINE プラグマや指示子を使用して、関数やループのパイプライン形式を指定することもできます。このオプションは、特定のスコープのプラグマまたは指示子に適用され、syn.compile.pipeline_style 割り当てられたグローバル デフォルト設定は変更されません。

stp および flp タイプのパイプラインには、作成されたハードウェア パイプラインがさまざまな種類のブロッキング信号を使用してパイプラインを停止させる、標準的なパイプライン ロジックが採用されています。特に物理ステージ数が多く、膨大なデータを処理するパイプラインでは、これらのブロッキング信号によりネットのファンアウト数が大きくなることがよくあります。ファンアウトの大きいネットが作成されると、RTL/論理合成または配置配線時に修正できないタイミング クロージャの問題が発生する主な原因となります。この問題を解決するために、フリーランニング パイプライン (または frp) と呼ばれる新しいタイプのパイプライン インプリメンテーションが作成されています。フリーランニング パイプラインは、ブロッキング信号で動作するパイプラインを処理するのに最も効果的なアーキテクチャです。その理由は次のとおりです。

  • レジスタ イネーブルへのブロッキング信号の接続を完全に排除している
  • 完全なフラッシュ可能パイプラインであり、無効なトランザクションをバブリングできる
  • ファンアウトを (フロップ間で) 分散させる従来のアーキテクチャとは異なり、ファンアウトを削減できる
  • フロップ クローニングのような合成および/または配置配線の最適化には依存しない
  • これにより、ファンアウト数の削減と共に、配線長を短縮した構造を実現し、配置配線に役立つ

一方で、このファンアウトの削減には次の理由でコストがかかります。

  • ブロッキング出力ポートに必要な FIFO バッファーのサイズにより、追加のリソースが必要となる
  • このようなブロッキング出力ポートにおけるマルチプレクサーの遅延
  • フォワード プレッシャー トリガーの早期検証による潜在的なパフォーマンスへの影響
重要: フリーランニング パイプライン (frp) は、DATAFLOW 領域内からのみ呼び出すことができます。frp 形式は、シーケンシャル領域またはパイプライン領域で呼び出されるループには適用できません。

パイプラインのタイプ

次の表に、ツールで使用可能な 3 つのタイプのパイプラインの概要を示します。ツールは、任意のパイプライン処理されたループまたは関数に使用する適切なパイプライン形式を自動的に選択します。hls::tasks を用いてパイプラインを使用すると、デッドロックを回避するためにフラッシュ パイプライン (FLP) 形式が自動的に選択されます。パイプライン制御に大きなファンアウトが必要で、かつその他のフリーランニング要件が満たされている場合、ツールはファンアウト数を制限するためにフリーランニング パイプライン (FRP) 形式を選択します。上記のどちらにも当てはまらない場合は、標準パイプライン (STP) 形式が選択されます。

表 1. パイプラインのタイプ
名前 ストール パイプライン フリーランニング/フラッシュ可能パイプライン フラッシュ可能パイプライン
ユース ケース
  • パイプライン制御のファンアウトが大きいことによるタイミング問題がない場合
  • フラッシュ可能である必要がない場合 (ストールによるパフォーマンスやデッドロック問題などがない場合)
  • パイプライン制御からレジスタ イネーブルへのファンアウトのためにタイミングを改善する必要がある場合
  • パフォーマンスを改善するか、デッドロックを回避するため、フラッシュ可能である必要がある場合
  • データフロー領域からのみ呼び出すことができる。
パフォーマンスを改善するか、デッドロックを回避するため、フラッシュ可能である必要がある場合
プラグマ/指示子 #pragma HLS pipeline style=stp #pragma HLS pipeline style=frp #pragma HLS pipeline style=flp
グローバル設定 syn.compile.pipeline_style=stp (デフォルト) syn.compile.pipeline_style=frp syn.compile.pipeline_style=flp
欠点
  • フラッシュできないので、次が発生する可能性あり
    • データフローで発生するデッドロックが多くなる
    • 次のイテレーションへの入力がない場合、既に計算済みの出力が送信されない
  • パイプライン制御のファンアウトが大きいことによるタイミング問題
  • FIFO が出力に追加されたためにリソースが少し増加
  • 少なくとも 1 つのブロッキング I/O (ストリームまたは ap_hs) 必要。
  • すべてのパイプライン処理のシナリオと I/O タイプに対応しているわけではない。
  • II が大きくなることあり
  • II>1 の場合、共有が少ないためリソース使用量が増加
利点
  • デフォルトのパイプライン。使用に制限はありません。
  • 通常は全体的なリソース使用量が最低になります。
  • 次のためタイミングは良くなります。
    • より小さいファンアウト
    • よりシンプルなパイプライン制御ロジック
  • フラッシュ可能
  • フラッシュ可能
  • デッドロック状態の回避
重要: フラッシング パイプライン (flp ) には、syn.compile.enable_auto_rewind コンフィギュレーション コマンドもイネーブルの場合、PIPELINE プラグマまたは指示子で指定された巻き戻し (rewind) オプションを使用できます。