AI 引擎架构提供了乘法指令,可对输入实参执行额外运算。AI 引擎 API 提供了多种类型的变体,包括可封装现有矢量的变体、可封装元素引用的累加器的变体,以及可传递到乘法函数中的变体,而无需为每一种可能的组合添加一种变体。随后,此 API 将根据硬件支持把各项运算合并为单一指令,或者先对矢量应用运算然后再执行乘法。
前乘运算是一种特殊的空运算,仅返回其封装的原始对象。其中包括:
-
op_abs
-
op_add
-
op_conj
-
op_max
-
op_min
-
op_none
-
op_sub
-
op_sign
-
op_zero
以下示例旨在演示如何对矢量 a
的绝对值执行逐元素乘法以及如何对矢量 b
执行共轭。
aie::accum<cacc48,16> foo(aie::vector<int16,16> a, aie::vector<cint16,16> b){
aie::accum<cacc48,16> ret;
ret = aie::mul(aie::op_abs(a), aie::op_conj(b));
return ret;
}
以下代码用于通过累加器的动态归零和数据矢量的动态符号来执行累加:
alignas(aie::vector_decl_align) int16 data[16]=0,-1,2,-3,4,-5,6,-7,8,-9,10,-11,12,-13,14,-15};
aie::vector<int16,16> a=aie::load_v<16>(data);
aie::vector<int16,16> b=aie::load_v<16>(data);
aie::accum<acc48,16> ret;
bool is_zero=true;
bool is_sign=true;
ret = aie::mac(aie::op_zero(ret,is_zero),aie::op_sign(a,is_sign), aie::op_sign(b,is_sign));
// print the "ret" values
aie::print(ret,true,"ret=");