データフロー最適化の正規形式 - 2021.2 Japanese

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

Document ID
UG1393
Release Date
2022-03-29
Version
2021.2 Japanese
ザイリンクスでは、正規形式を使用してデータフロー領域内でコードを記述することをお勧めしています。関数およびループのデータフロー最適化には、正規形式があります。
  • 関数: 関数内のデータフローの正規形式のコーディング ガイドラインは、次のとおりです。
    1. データフロー領域内では、次のタイプの変数のみを使用します。
      1. ローカルの非スタティック スカラー/配列/ポインター変数。
      2. ローカルのスタティック hls::stream 変数。
    2. 関数呼び出しは、データを前方向にのみ送信します。
    3. 配列または hls::stream には、プロデューサー関数 1 つと コンシューマー関数 1 つのみが含まれます。
    4. 関数引数 (データフロー領域外から入ってくる変数) は読み出されるか書き込まれますが、両方が実行されることはありません。読み出しと書き込みを同じ関数引数で実行する場合は、読み出しが書き込みよりも前に発生する必要があります。
    5. ローカル変数 (前方向へのデータ転送する変数) は読み出しよりも前に書き込まれる必要があります。

    次のコード例は、関数内のデータフローの正規形式を示しています。上記のコードでは、最初の関数 (func1) で入力が読み出され、最後の関数 (func3) で出力が書き込まれます。各関数で作成された出力値は、次の関数に入力パラメーターとして渡されます。

    void dataflow(Input0, Input1, Output0, Output1) {
      UserDataType C0, C1, C2;
      #pragma HLS DATAFLOW
      func1(read Input0, read Input1, write C0, write C1);
      func2(read C0, read C1, write C2);
      func3(read C2, write Output0, write Output1);
    }
  • ループ: ループ本体内のデータフローの正規形式のコーディング ガイドラインには、上記で定義される関数のコーディング ガイドラインが含まれるほか、次も指定されます。
    1. 初期値は 0。
    2. ループ条件は、ループ変数と定数、またはループ本体内で変化しない変数との比較結果で決まります。
    3. 1 ずつインクリメント。

    次のコード例は、ループ内のデータフローの正規形式を示しています。

    void dataflow(Input0, Input1, Output0, Output1) {
    	 		UserDataType C0, C1, C2;
    	 		for (int i = 0; i < N; ++i) {
                      #pragma HLS DATAFLOW
    	             func1(read Input0, read Input1, write C0, write C1);
    	             func2(read C0, read C0, read C1, write C2);
    	             func3(read C2, write Output0, write Output1);
    	           }
    }