矢量数据类型 - 2023.2 简体中文

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

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

AI 引擎 API 提供的两个主要的矢量类型为矢量 (aie::vector) 和累加器 (aie::accum)。

矢量

矢量表示相同类型的元素集合,矢量以透明方式映射到 AI 引擎架构上支持的对应矢量寄存器。矢量按元素类型和元素数量加以参数化,支持定义 128b/256b/512b/1024b 矢量的任意组合,默认值为 512b。

表 1. 受支持的矢量类型和大小
矢量类型 大小 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
  1. 粗体的整数是 AI 引擎中支持的数据类型的原生矢量大小。例如,aie::broadcast((cfloat){1,1}) 等效于 aie::broadcast<cfloat,8>((cfloat){1,1}),其中指定 <cfloat,8> 属于可选操作,因为它是 cfloat 数据类型的原生矢量大小。

例如,aie::vector<int32,16> 是含 16 个元素的 32 位整数矢量。矢量的每个元素都被称为一条通道。妥善利用寄存器,使用必要的最小位宽即可改善性能。

图 1. aie::vector<int32,16>

利用成员函数 realimag 即可访问复数整数数据和复数浮点数据,以抽取数据的实数部分和虚数部分。实数部分存储在低位地址内,虚数部分存储在高位地址内。例如:
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::vectoraie::accum 包含成员函数,可以执行类型强制转换、数据提取和插入以及索引。在后续章节中涵盖了有关这些操作的信息。

累加器

累加器表示相同类的元素集合,通常是通过乘法运算而获得的,它以透明方式映射到每个架构上支持的对应累加器寄存器。累加器通常可提供大量位数,允许您执行一长串运算,其中中间结果可能超出常规矢量类型的范围。累加器按元素类型以及元素数量来加以参数化。原生累加位会定义最小位数,AI 引擎 API 会将不同类型映射到支持该要求的最接近的原生累加器类型。例如,acc40 映射到 AI 引擎架构的 acc48

表 2. 受支持的累加器类型和大小
累加器类型 acc32 cacc32 acc40 cacc40 acc48 cacc48 acc56 cacc56 acc64 cacc64 acc72 cacc72 acc80 cacc80 accfloat caccfloat
原生累加位 48 80 32