stable
プラグマを使用すると、データフロー領域の入力または出力変数をマークして、それらの該当するタスク レベルの同期を削除できます (ユーザーがこの削除を本当に正しいと確認した場合のみ)。
void dataflow_region(int A[...], ...
#pragma HLS stable variable=A
#pragma HLS dataflow
proc1(...);
proc2(A, ...);
stable
プラグマがなく、A
が proc2
で読み出される場合、proc2
は、それが含まれるデータフロー領域で初期同期の一部になります。つまり、proc1
は proc2
も再開可能な状態になるまでは再開されないので、データフロー反復が重複されなくなり、パフォーマンスが落ちてしまうことがあります。stable
プラグマは、この同期が必ずしも正確性を保持するわけではないことを示しています。
stable
プラグマがある場合、コンパイラは次のような判断をします。
-
A
がproc2
で読み出される場合、読み出されるメモリ位置は依然としてアクセス可能で、dataflow_region
の実行中に、ほかのプロセスや呼び出したコンテキストで上書きされません。 -
A
がproc2
で書き込まれる場合、書き込まれたメモリ位置はdataflow_region
の実行中に、それらの定義前にほかのプロセスや呼び出したコンテキストによって読み出されません。
これは、データフロー領域がまだ開始していない場合や実行を終了していない場合にのみ、呼び出し元がこれらの変数をアップデートまたは読み出す場合によく使用されます。
つまり、データフロー最適化は、デザインのスループットを大幅に向上させることができる優れた最適化手法です。デザインで利用可能な並列処理の推論は HLS ツールに依存するため、設計者は、HLS ツールで容易に推論が実行されるようにコードを記述する必要があります。場合によっては、データフロー モデルとタスクチャネル モデルの両方を同じデザインで運用する必要があることもあります。次のセクションでは、このような混合モデルで構築可能なデザインについて説明します。