syn.directive.bind_op - 2023.2 日本語

Vitis 統合ソフトウェア プラットフォームの資料: アプリケーション アクセラレーション開発 (UG1393)

Document ID
UG1393
Release Date
2023-12-13
Version
2023.2 日本語

説明

ヒント: このプラグマまたは指示子は、DSP のマルチ演算マッチング (MULADD、AMA、ADDMUL、および該当する減算演算) には関係ありません。実際、演算子を DSP に割り当てる際に BIND_OP を使用すると、HLS コンパイラが複数の演算式をマッチングできなくなることがあります。

Vitis HLS では、コードのさまざまな演算が特定ハードウェア リソース (またはインプリメンテーション) を使用してインプリメントされます。使用するリソースは自動的に決定されますが、syn.op を定義すると、演算子のコンフィギュレーション で説明するように、インプリメンテーションを指定できます。

syn.directive.bind_op コマンドは、指定した変数に対し、演算 (たとえば muladdsub) を RTL で特定のインプリメンテーション (impl) にマップする必要があるこということを指示します。たとえば、syn.directive.bind_op コマンドを使用すると、特定の乗算 (mul) を DSP ではなくデバイス ファブリックにインプリメントするよう指定できます。

syn.directive.bind_oplatency オプションを使用すると、レイテンシを指定することもできます。

重要: latency オプションを使用するには、使用可能な複数段のインプリメンテーションを演算に含める必要があります。HLS ツールでは、基本的な算術演算 (加算、減算、乗算、除算) およびすべての浮動小数点演算に複数段インプリメンテーションが提供されています。

構文

syn.directive.bind_op=[OPTIONS] <location> <variable>
  • <location>: 変数を含める場所を function[/label] の形式で指定します。
  • <variable>: 割り当てる変数を指定します。この場合の変数は、この指示子のターゲットである演算の結果が割り当てられた変数のことです。

オプション

op=<value>
指定したインプリメンテーション リソースにマップする演算を定義します。サポートされる機能演算は、muladdsub などです。

サポートされる浮動小数点演算は、faddfsubfdivfexpflogfmulfrsqrtfrecipfsqrtdadddsubddivdexpdlogdmuldrsqrtdrecip, dsqrthaddhsubhdivhmul、および hsqrt などです。

ヒント: 浮動小数点演算には、単精度 (f)、倍精度 (d)、および半精度 (h) があります。
impl=<value>
指定した演算に使用するインプリメンテーションを定義します。
機能演算にサポートされるインプリメンテーションは、fabricdsp などです。
浮動小数点演算にサポートされるインプリメンテーションは、fabricmeddspfulldspmaxdspprimitivedsp などです。
注記: primitivedsp は、Versal デバイスでのみ使用可能です。
latency=<int>
演算のインプリメンテーションのデフォルト レイテンシを定義します。有効なレイテンシは、op および impl の指定によって異なります。デフォルトは -1 で、Vitis HLS によりレイテンシが選択されます。
次の表に、演算、サポートされるインプリメンテーション、レイテンシの組み合わせを示します。
表 1. サポートされる機能演算、インプリメンテーション、レイテンシの組み合わせ
動作 インプリメンテーション 最小レイテンシ 最大レイテンシ
add fabric 0 4
add dsp 0 4
mul fabric 0 4
mul dsp 0 4
sub fabric 0 4
sub dsp 0 0
ヒント: dcmp などの比較演算子は LUT にインプリメントされるため、ファブリック外部にインプリメントしたり、DSP にマップしたりすることはできません。このため、config_op または bind_op コマンドでは設定できません。
表 2. サポートされる浮動小数点演算、インプリメンテーション、レイテンシの組み合わせ
動作 インプリメンテーション 最小レイテンシ 最大レイテンシ
fadd fabric 0 13
fadd fulldsp 0 12
fadd primitivedsp 0 3
fsub fabric 0 13
fsub fulldsp 0 12
fsub primitivedsp 0 3
fdiv fabric 0 29
fexp fabric 0 24
fexp meddsp 0 21
fexp fulldsp 0 30
flog fabric 0 24
flog meddsp 0 23
flog fulldsp 0 29
fmul fabric 0 9
fmul meddsp 0 9
fmul fulldsp 0 9
fmul maxdsp 0 7
fmul primitivedsp 0 4
fsqrt fabric 0 29
frsqrt fabric 0 38
frsqrt fulldsp 0 33
frecip fabric 0 37
frecip fulldsp 0 30
dadd fabric 0 13
dadd fulldsp 0 15
dsub fabric 0 13
dsub fulldsp 0 15
ddiv fabric 0 58
dexp fabric 0 40
dexp meddsp 0 45
dexp fulldsp 0 57
dlog fabric 0 38
dlog meddsp 0 49
dlog fulldsp 0 65
dmul fabric 0 10
dmul meddsp 0 13
dmul fulldsp 0 13
dmul maxdsp 0 14
dsqrt fabric 0 58
drsqrt fulldsp 0 111
drecip fulldsp 0 36
hadd fabric 0 9
hadd meddsp 0 12
hadd fulldsp 0 12
hsub fabric 0 9
hsub meddsp 0 12
hsub fulldsp 0 12
hdiv fabric 0 16
hmul fabric 0 7
hmul fulldsp 0 7
hmul maxdsp 0 9
hsqrt fabric 0 16

次の例は、関数 foo の変数 c の乗算をインプリメントするのに、ファブリック ロジックを使用する 2 段のパイプライン乗算器を指定します。

int foo (int a, int b) {
int c, d;
c = a*b;
d = a*c;
return d;
}
syn.directive.bind_op コマンドは次のとおりです。
syn.directive.bind_op=op=mul impl=fabric latency=2 foo c
ヒント: 変数 d には syn.directive.bind_op が指定されていないため、HLS ツールで使用するインプリメンテーションが選択されます。