AI 引擎 API 支持对 2 个矢量或者对 1 个标量和 1 个矢量执行基本算术运算(对标量和矢量的每个元素执行运算)。它还支持在累加器上对标量或矢量执行加法或减法。此外,它还支持乘积累加 (MAC)。这些运算包括:
-
aie::mul
- 返回一个累加器,其中包含 2 个矢量的逐元素乘法,或者一个矢量和一个标量的乘积。
-
aie::negmul
- 返回一个累加器,其中包含 2 个矢量的逐元素乘法的负值,或者一个矢量和一个标量的乘积的负值。
-
aie::mac
- 对矢量(或标量)和累加器执行乘加。
-
aie::msc
- 对矢量(或标量)和累加器执行乘减。
-
aie::add
- 返回一个矢量,其中包含 2 个矢量的逐元素加法,或者将一个标量值与每个矢量组件相加。或者在累加器上添加标量或矢量。
-
aie::sub
- 返回一个矢量,其中包含 2 个矢量的逐元素减法,或者从每个矢量组件减去某一个标量值。或者在累加器上减去标量或矢量。
矢量和累加器必须为相同大小,并且其类型必须兼容。例如:
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 引擎架构上,某些运算可能与乘法一起折叠为一条指令。例如:
aie::vector<cint16,16> ca,cb;
aie::accum<cacc48,16> acc=aie::mul(aie::op_conj(ca),aie::op_conj(cb));
如需了解有关前乘运算的详细信息,请参阅 前乘运算。