ベクター算術演算 - 2023.2 日本語

AI エンジン カーネルおよびグラフ プログラミング ガイド (UG1079)

Document ID
UG1079
Release Date
2023-12-04
Version
2023.2 日本語

AI エンジン API では、2 つのベクターまたは 1 つのスカラーと 1 つのベクター (スカラーとベクターの各要素に演算を実行) に対する基本的な算術演算がサポートされています。アキュムレータでのスカラーまたはベクターの加算または減算もサポートされます。さらに、積和 (MAC) もサポートされます。次の演算があります。

aie::mul
2 つのベクターの要素ごとの乗算または 1 つのベクターと 1 つのスカラー値の積を含むアキュムレータを返します。
aie::negmul
2 つのベクターの要素ごとの乗算の否定または 1 つのベクターと 1 つのスカラー値の積の否定を含むアキュムレータを返します。
aie::mac
ベクター (またはスカラー) およびアキュムレータに対する積和。
aie::msc
ベクター (またはスカラー) およびアキュムレータに対する乗減算。
aie::add
2 つのベクターの要素ごとの加算または 1 つのベクターの各コンポーネントと 1 つのスカラー値の加算を含むベクターを返します。または、アキュムレータにスカラーまたはベクターを加算します。
aie::sub
2 つのベクターの要素ごとの減算または 1 つのベクターの各コンポーネントからの 1 つのスカラー値の減算を含むベクターを返します。または、アキュムレータからスカラーまたはベクターを減算します。

ベクターとアキュムレータは同じサイズで、データ型に互換性があることが必要です。次に例を示します。

aie::vector<int32,8> va,vb;
aie::accum<acc64,8> vm=aie::mul(va,vb);
aie::accum<acc64,8> vm2=aie::mul((int32)10,vb);
aie::vector<int32,8> vsub=aie::sub(va,vb);
aie::vector<int32,8> vadd=aie::add(va,vb);

// vsub2[i]=va[i]-10
aie::vector<int32,8> vsub2=aie::sub(va,(int32)10);

// vsub2[i]=10+va[i] 
aie::vector<int32,8> vadd2=aie::add((int32)10,va);  

aie::accum<acc64,8> vsub_acc=aie::sub(vm,(int32)10);
aie::accum<acc64,8> vsub_acc2=aie::sub(vm,va);
aie::accum<acc64,8> vadd_acc=aie::add(vm,(int32)10);
aie::accum<acc64,8> vadd_acc2=aie::add(vm,vb);

aie::accum<acc64,8> vmac=aie::mac(vm,va,vb);
aie::accum<acc64,8> vmsc=aie::msc(vm,va,vb);

// scalar and vector can switch placement
aie::accum<acc64,8> vmac2=aie::mac(vm,va,(int32)10);

// scalar and vector can switch placement 
aie::accum<acc64,8> vmsc2=aie::msc(vm,(int32)10,vb);

AI エンジン API では、ベクターまたは要素単位の平方の累積に対する算術演算がサポートされています。次のものが含まれます。

aie::abs
指定したベクターの各要素の絶対値を計算します。
aie::abs_square
指定した複素ベクターの各要素の絶対平方を計算します。
aie::conj
指定した複素ベクターの各要素の共役値を計算します。
aie::neg
符号付き型のベクターでは、指定したベクターと要素は同じで符号が反転されたベクターが返されます。入力のデータ型符号なしの場合は、入力ベクターが返されます。
aie::mul_square
入力ベクターの要素ごとの平方を含む、要求されたタイプのアキュムレータを返します。
aie::mac_square
指定のアキュムレータと入力ベクターの要素ごとの平方の加算を含むアキュムレータを返します。
aie::msc_square
指定のアキュムレータと入力ベクターの要素ごとの平方の減算を含むアキュムレータを返します。

ベクターとアキュムレータは同じサイズで、データ型に互換性があることが必要です。次に例を示します。

aie::vector<int16,16> va;
aie::vector<cint16,16> ca;
aie::vector<int16,16> va_abs=aie::abs(va);
aie::vector<int32,16> ca_abs=aie::abs_square(ca);
aie::vector<cint16,16> ca_conj=aie::conj(ca);
aie::vector<int16,16> va_neg=aie::neg(va);
aie::accum<acc32,16> va_sq=aie::mul_square(va);

aie::vector<int32,8> vc,vd;
aie::accum<acc64,8> vm=aie::mul(vc,vd);

// vmac3[i]=vm[i]+vc[i]*vc[i];
aie::accum<acc64,8> vmac3=aie::mac_square(vm,vc);

// vmsc3[i]=vm[i]-vd[i]*vd[i];
aie::accum<acc64,8> vmsc3=aie::msc_square(vm,vd);

オペランドも前乗算演算でサポートされます。一部の AI エンジン アーキテクチャでは、特定の演算を乗算と共に 1 つの命令にまとめることができます。次に例を示します。

aie::vector<cint16,16> ca,cb;
aie::accum<cacc48,16> acc=aie::mul(aie::op_conj(ca),aie::op_conj(cb));

前乗算演算の詳細は、前乗算演算 を参照してください。