キャスト組み込み関数 (as_[Type]()
) を使用すると、同じサイズのベクター型またはスカラー型間のキャストを実行できます。キャストは、アキュムレータ ベクター型でも実行できます。通常は、できるだけ最小のデータ型を使用することで、レジスタ溢れを減らし、パフォーマンスを向上させることができます。たとえば、48 ビット アキュムレータ (acc48) がデザイン要件を満たす場合、より大きな 80 ビット アキュムレータ (acc80) よりもそちらを使用することをお勧めします。
注記:
acc80
ベクター データ型は、隣接する 2 つの 48 ビット レーンを使用します。標準 C キャストも使用でき、次の例に示すように、ほとんどすべての場合で同じように動作します。
aie::vector<int16,8> iv;
aie::vector<cint16,4> cv=as_v4cint16(iv);
aie::vector<cint16,4> cv2=*(aie::vector<cint16,4>*)&iv;
aie::accum<acc80,8> cas_iv;
aie::accum<acc48,8> cas_cv=as_v8cacc48(cas_iv);
浮動小数点から固定小数点 (float2fix()
) および固定小数点から浮動小数点 (fix2float()
) への変換用のハードウェア サポートが組み込まれています。たとえば、固定小数点平方根、逆平方根、および反転は、浮動小数点精度でインプリメントされ、関数の前後で fix2float()
および float2fix()
変換が使用されます。
注記:
AI エンジンの浮動小数点は、IEEE 規格に完全に準拠していません。例外については、
『Versal アダプティブ SoC AI エンジン アーキテクチャ マニュアル』 (AM009) を参照してください。
この例では、平方根と反転関数はベクター化できないので、スカラー エンジンが使用されています。これは、関数プロトタイプの入力のデータ型からわかります。
float _sqrtf(float a) //scalar float operation
int sqrt(int a,...) //scalar integer operation
入力のデータ型は、ベクター型 (vint) ではなく、スカラー型 (int) です。
変換関数 (fix2float
、float2fix
) は、呼び出された関数によって、ベクター エンジンまたはまたはスカラー エンジンのいずれかで処理できます。データ戻り値の型とデータ引数の型の違いに注意してください。
float fix2float(int n,...) //Uses the scalar engine
v8float fix2float(aie::vector<int32,8> ivec,...) //Uses the vector engine
注記:
float2fix
の場合、float2fix_safe
(デフォルト) と float2fix_fast
という 2 つのインプリメンテーション タイプがあり、float2fix_safe
インプリメンテーションには、より厳密なデータ型チェックが含まれます。FLOAT2FIX_FAST
マクロを定義すると、float2fix
で float2fix_fast
インプリメンテーションが選択されるようにできます。