矢量算术运算 - 2023.2 简体中文

AI 引擎内核与计算图编程指南 (UG1079)

Document ID
UG1079
Release Date
2023-12-04
Version
2023.2 简体中文

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));

如需了解有关前乘运算的详细信息,请参阅 前乘运算