説明
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