AI 引擎 API 提供的两个主要的矢量类型为矢量 (aie::vector
) 和累加器 (aie::accum
)。
矢量
矢量表示相同类型的元素集合,矢量以透明方式映射到 AI 引擎架构上支持的对应矢量寄存器。矢量按元素类型和元素数量加以参数化,支持定义 128b/256b/512b/1024b 矢量的任意组合,默认值为 512b。
矢量类型 | 大小 1 |
---|---|
int8 | 16/32/64/128 |
int16 | 8/16/32/64 |
int32 | 4/8/16/32 |
uint8 | 16/32/64/128 |
float | 4/8/16/32 |
cint16 | 4/8/16/32 |
cint32 | 2/4/8/16 |
cfloat | 2/4/8/16 |
|
例如,aie::vector<int32,16>
是含 16 个元素的 32 位整数矢量。矢量的每个元素都被称为一条通道。妥善利用寄存器,使用必要的最小位宽即可改善性能。
图 1. aie::vector<int32,16>
利用成员函数
real
和 imag
即可访问复数整数数据和复数浮点数据,以抽取数据的实数部分和虚数部分。实数部分存储在低位地址内,虚数部分存储在高位地址内。例如:cint8 ctmp={1,2};
// print real and imag values
printf("real=%d imag=%d\n",ctmp.real,ctmp.imag);
// store real and imag values
printf("ctmp mem storage=%llx\n",*(long long*)&ctmp);
cint32 ctmp2={3,4};
int32 *p_ctmp2=reinterpret_cast<int32*>(&ctmp2);
// print "real=3" and "imag=4"
printf("real=%d imag=%d\n",p_ctmp2[0],p_ctmp2[1]);
aie::vector
和 aie::accum
包含成员函数,可以执行类型强制转换、数据提取和插入以及索引。在后续章节中涵盖了有关这些操作的信息。
累加器
累加器表示相同类的元素集合,通常是通过乘法运算而获得的,它以透明方式映射到每个架构上支持的对应累加器寄存器。累加器通常可提供大量位数,允许您执行一长串运算,其中中间结果可能超出常规矢量类型的范围。累加器按元素类型以及元素数量来加以参数化。原生累加位会定义最小位数,AI 引擎 API 会将不同类型映射到支持该要求的最接近的原生累加器类型。例如,acc40
映射到 AI 引擎架构的 acc48
。
累加器类型 | acc32 | cacc32 | acc40 | cacc40 | acc48 | cacc48 | acc56 | cacc56 | acc64 | cacc64 | acc72 | cacc72 | acc80 | cacc80 | accfloat | caccfloat |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
原生累加位 | 48 | 80 | 32 |