Vitis HLS では、データフロー最適化を適用するために領域が変更されます。この結果のデータフロー ネットワークをより予測しやすくするため、AMD では、この領域 (正規領域と呼ばれる) 内のコードは正規形式を使用して記述することをお勧めします。データフロー最適化を適用するには、2 つの正規形式があります。
-
サブ関数がインライン展開されていない関数の正規形式。これらのサブ関数は、それ自体が関数領域内のデータフローであったり、ループ領域内のデータフローであったりします。また、変数の初期化 (コンストラクターによる自動的な初期化も含む)、またはプロセスへの値による表現の受け渡しは、正規形式には含まれないことに注意する必要もあります。Vitis HLS では、最も効果的な方法で結果のデータフローがインプリメントされますが、コードが正規の形式でない場合は、常に GUI データフロー ビューおよび協調シミレーションのタイムライン トレースをチェックして、正しいデータフローとなっていること、および達成されたパフォーマンスが適切であることを確認する必要があります。
void dataflow(Input0, Input1, Output0, Output1) { #pragma HLS dataflow UserDataType C0, C1, C2; // UserDataType can be scalars or arrays func1(Input0, Input1, C0, C1); // read Input0, read Input1, write C0, write C1 func2(C0, C1, C2); // read C0, read C1, write C2 func3(C2, Output0, Output1); // read C2, write Output0, write Output1 }
- ループ以外のコードがない関数で囲まれたループ本体内のデータフロー。
for
ループ (含まれる関数がインライン展開されていない) の場合、積分ループ変数は次のように設定する必要があります。- 初期値はループ ヘッダーで宣言され 0 に設定される。
- ループ境界は、ループを囲む関数の負以外の定数またはスカラー引数である。
- 1 ずつインクリメント。
- 次のとおり、データフロー プラグマはループ内にある必要あり。
void dataflow(Input0, Input1, Output0, Output1) { for (int i = 0; i < N; i++) { #pragma HLS dataflow UserDataType C0, C1, C2; // UserDataType can be scalars or arrays func1(Input0, Input1, C0, C1); // read Input0, read Input1, write C0, write C1 func2(C0, C0, read C1, C2); // read C0, read C0, read C1, write C2 func3(C2, Output0, Output1); // read C2, write Output0, write Output1 } }