对内部函数 (as_[Type]()
) 进行类型强制转换即可在相同大小的矢量类型与标量类型之间进行类型强制转换。类型强制转换对于累加器矢量类型也有效。通常,尽可能使用最小的数据类型将有助于减小寄存器溢出并改善性能。例如,如果 48 位累加器 (acc48) 可满足设计要求,那么首选使用它,而不是更大的 80 位累加器 (acc80)。
注释:
acc80
矢量数据类型占用 2 条相邻的 48 位通道。标准 C 语言类型强制转换也可以使用,并且在几乎所有情况下其工作方式都相同,如以下示例所示。
aie::vector<int16,8> iv;
aie::vector<cint16,4> cv=as_v4cint16(iv);
aie::vector<cint16,4> cv2=*(aie::vector<cint16,4>*)&iv;
aie::accum<acc80,8> cas_iv;
aie::accum<acc48,8> cas_cv=as_v8cacc48(cas_iv);
其中已内建相应硬件支持,可支持浮点到定点 (float2fix()
) 和定点到浮点 (fix2float()
) 转换。例如,定点平方根、平方根倒数和倒数都是使用浮点精度来实现的,并且在函数前后均使用 fix2float()
和 float2fix()
转换。
在此示例中使用的是标量引擎,因为平方根函数和倒数函数并未矢量化。这可通过观察函数原型的输入数据类型来验证:
float _sqrtf(float a) //scalar float operation
int sqrt(int a,...) //scalar integer operation
请注意,输入数据类型为标量类型 (int),而并非矢量类型 (vint)。
根据调用的函数,转换函数(fix2float
和 float2fix
)可由矢量引擎或标量引擎来处理。请注意数据返回类型与数据实参类型之间的差异:
float fix2float(int n,...) //Uses the scalar engine
v8float fix2float(aie::vector<int32,8> ivec,...) //Uses the vector engine
注释: 对于
float2fix
,有两种类型的实现,即,float2fix_safe
(默认)和 float2fix_fast
,其中 float2fix_safe
实现可提供更严格的数据类型检查。您可定义 FLOAT2FIX_FAST
宏,使 float2fix
选择 float2fix_fast
实现。