説明
Vitis HLS では、ループの同じ反復内での依存 (ループ独立依存) と、ループの異なる反復間の依存 (ループ運搬依存) が検出されます。
これらの依存は、演算がいつスケジューリングされるか、特に関数およびループのパイプライン処理の影響を受けます。
- ループ独立依存
- 同じ要素が 1 つのループ反復内でアクセスされます。
for (i=0;i<N;i++) { A[i]=x; y=A[i]; }
- ループ運搬依存
- 同じ要素が異なるループ反復からアクセスされます。
for (i=0;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