説明
Vitis HLS は、ループ内の依存関係を検出します。同一ループ反復内の依存関係は「ループ独立依存」と呼ばれます。異なるループ反復間の依存関係は「ループ運搬依存」と呼ばれます。
関数やループのパイプライン処理などで演算をスケジューリングする際、これらの依存関係に影響が出ます。
- ループ独立依存
- 1 回のループ反復内で同じ要素にアクセスする場合に発生します。
for (i=1;i<N;i++) { A[i]=x; y=A[i]; } - ループ運搬依存
- 異なるループ反復で同じ要素にアクセスする場合に発生します。
for (i=1;i<N;i++) { A[i]=A[i-1]*2; }
特定の状況では、依存関係解析が過度に保守的になり、偽の依存関係を除外できないことがあります。その例として、変数に依存する配列インデックスを使用する場合や、外部要件により制約が必要な場合 (例: 2 つの入力が同じインデックスを共有しないようにする必要がある場合) があげられます。syn.directive.dependence コマンドを使用すると、依存を明示的に定義し、偽依存をなくすことができます。
重要: 偽依存でないものを偽依存と指定すると、ハードウェアが正しく機能しなくなる可能性があります。依存性 (true または false) が正しいことを確認してから指定してください。
構文
syn.directive.dependence=[OPTIONS] <location>
-
<location> - 依存を定義する場所を
function[/label]というフォーマットで指定します。
オプション
-
class=(array | pointer) - 依存を明確にする必要がある変数のクラスを指定します。このオプションは、
variableオプションが使用されているときは使用できません。 -
variable=<variable> - 依存指示子を適用する変数を指定します。このオプションは、
classオプションが使用されているときは使用できません。重要: 関数引数がm_axiインターフェイスでほかの引数とバンドルでまとめられている場合は、その関数引数にdependenceを指定できません。これは、関数のm_axiインターフェイスのデフォルト設定です。また、構造体が分割されていない場合、構造体の要素に依存は指定できません。 -
dependent=(true | false) - 依存を使用する必要があるか (
true)、削除するか (false) を指定します。指定しない場合、値が指定されていないことを示す警告メッセージが表示され、falseが指定されているのと同様に処理されます。 -
direction=(RAW | WAR | WAW) -
注記: ループ運搬依存にのみ関係します。依存の方向を指定します。
-
RAW(Read-After-Write - 真の依存) - 書き込み命令により値が書き込まれ、その値が読み出し命令で使用されます。
-
WAR(Write-After-Read - アンチ依存) - 読み出し命令で値が取得され、その値が書き込み命令で上書きされます。
-
WAW(Write-After-Write - 出力依存) - 2 つの書き込み命令により、特定の順序で同じロケーションに書き込みが実行されます。
-
-
distance=<integer> -
注記:配列アクセスの反復間隔を指定します。
-dependentがtrueに設定されているループ運搬依存でのみ使用します。 -
type=(intra | inter) - 依存のタイプを指定します。
- 同じループ反復内 (
intra)。 - 異なるループ反復間 (
inter) (デフォルト)。
- 同じループ反復内 (
例
次の例は、関数 func の loop_1 の同じ反復内での Var1 間の依存を削除します。
syn.directive.dependence=variable=Var1 type=intra \
dependent=false func/loop_1
関数 func の loop_2 内にあるすべての配列の依存により、Vitis HLS で同じループ反復内のすべての読み出しが書き込みの後に実行されるように設定されます。
syn.directive.dependence=class=array type=intra \
dependent=true direction=RAW func/loop_2