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

AI 引擎内核编码 最佳实践指南 (UG1079)

Document ID
UG1079
Release Date
2022-05-25
Version
2022.1 简体中文

AI 引擎 API 支持对 2 个矢量或者对 1 个标量和 1 个矢量执行基本算术运算(对标量和矢量的每个元素执行运算)。它还支持在累加器上对标量或矢量执行加法或减法。此外,它支持对乘法进行累加。这些运算包括:

  • aie::mul

    返回一个累加器,其中包含 2 个矢量的逐元素乘法,或者返回一个值和一个矢量的所有元素。

  • aie::negmul

    返回一个累加器,其中包含 2 个矢量的逐元素乘法的取反,或者返回一个值和一个矢量的所有元素。

  • aie::mac

    对矢量(或标量)和累加器执行乘加。

  • aie::msc

    对矢量(或标量)和累加器执行乘减。

  • aie::add

    返回一个矢量,其中包含 2 个矢量的逐元素加法,或者返回一个值和一个矢量的所有元素。或者在累加器上添加标量或矢量。

  • aie::sub

    返回一个矢量,其中包含 2 个矢量的逐元素减法,或者返回一个值和一个矢量的所有元素。或者在累加器上减去标量或矢量。

矢量和累加器必须为相同大小,并且其类型必须兼容。例如:

aie::vector<int32,8> va=window_readincr_v<8>(data1);
aie::vector<int32,8> vb=window_readincr_v<8>(data2);
aie::accum<acc80,8> vm=aie::mul(va,vb);
aie::accum<acc80,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);
aie::vector<int32,8> vsub2=aie::sub(va,(int32)10);//scalar and vector can switch placement
aie::vector<int32,8> vadd2=aie::add((int32)10,va);//scalar and vector can switch placement

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

aie::accum<acc80,8> vmac=aie::mac(vm,va,vb);
aie::accum<acc80,8> vmsc=aie::msc(vm,va,vb);
aie::accum<acc80,8> vmac2=aie::mac(vm,va,(int32)10);//scalar and vector can switch placement
aie::accum<acc80,8> vmsc2=aie::msc(vm,(int32)10,vb);//scalar and vector can switch placement

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<cfloat,16> cf;
aie::vector<int16,16> va_abs=aie::abs(va);
aie::vector<int32,16> ca_abs=aie::abs_square(ca);
aie::vector<float,16> cf_abs=aie::abs_square(cf);
aie::vector<cint16,16> ca_conj=aie::conj(ca);
aie::vector<int16,16> va_neg=aie::neg(va);
aie::accum<acc48,16> va_sq=aie::mul_square(va);

aie::vector<int32,8> vc;
aie::vector<int32,8> vd;
aie::accum<acc80,8> vm;
aie::accum<acc80,8> vmac3=aie::mac_square(vm,vc);//vmac3[i]=vm[i]+vc[i]*vc[i];
aie::accum<acc80,8> vmsc3=aie::msc_square(vm,vd);//vmsc3[i]=vm[i]-vd[i]*vd[i];

对于前乘运算,也支持操作数。在某些 AI 引擎架构上,某些运算可能与乘法一起折叠为一条指令。例如:

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

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