説明
この指示子は、C/C++ の記述内で、すべての処理を順次実行します。set_directive_allocation などのリソースを制限する指示子を指定しない場合、Vitis HLS でレイテンシを最小限に抑え、同時実行性を向上するよう処理されます。ただし、データ依存性のためにこれが制限されることがあります。たとえば、配列にアクセスする関数またはループは、完了する前に配列への読み出し/書き込みアクセスをすべて終了する必要があります。そのため、そのデータを消費する次の関数またはループの演算を開始できません。
ただし、前の関数またはループがすべての演算を完了する前に、次の関数またはループの演算を開始できるようにすることは可能です。syn.directive.dataflow は関数またはループにデータフロー最適化を実行し、RTL インプリメンテーションの同時実行性を向上します。syn.directive.dataflow が指定されると、HLS ツールは順次関数やループ間のデータフローを解析し、チャネルを作成します。チャネルには、ピンポン RAM または FIFO が使用されます。これにより、コンシューマー関数またはループは、プロデューサー関数またはループの完了前に動作を開始できます。関数またはループを並列に動作させることができるため、レイテンシが低減し、RTL のスループットが向上します。
syn.dataflow.xxx コマンドは、データフロー設定 で説明されるように、syn.directive.dataflow で使用されるデフォルトのメモリ チャネルと FIFO の深さを指定します。開始間隔 (II) を指定しない場合、Vitis はその値を最小化し、データが利用可能になりしだい処理を開始します。DATAFLOW 最適化が機能するようにするには、データがデザイン内のタスク間を途切れずに流れる必要があります。特に、次のような状況には注意が必要です。
- シングル プロデューサー コンシューマー違反
- タスク間のフィードバック
- タスクの条件付き実行
- 複数の exit 条件を持つループ
なお、DATAFLOW 最適化は、デフォルトでは階層的には適用されません。サブ関数やループに、DATAFLOW 最適化によって効果が見込まれる追加タスクが含まれている場合は、そのループとサブ関数に最適化を適用してください。また、サブ関数をインライン処理することもできます。
構文
syn.directive.dataflow=<location> disable_start_propagation
-
<location>: データフロー最適化を実行する場所をfunction[/label]の形式で指定します。 -
disable_start_propagation: 開始トークンを内部プロセスに伝搬する開始 FIFO の作成をディスエーブルにします。このような FIFO がパフォーマンスのボトルネックとなることがあります。
例
次の例では、関数 foo 内に DATAFLOW 最適化を指定しています。
syn.directive.dataflow=foo