API 操作示例 - 2023.2 简体中文

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

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

以下示例会取两个包含 rva 中的实数和 rvb 中的虚数(类型为 aie::vector<int32,8>)的矢量,并按需使用偏移来交织其中的值以创建一个新的复数矢量。

aie::vector<int32,8> rva,rvb;
auto rv=aie::interleave_zip(rva,rvb,1);
aie::vector<cint32,8> cv=aie::concat(rv.first.cast_to<cint32>(),rv.second.cast_to<cint32>());

以下示例演示了如何抽取矢量 cv 中类型为 aie::vector<cint32,8> 的实数和虚数部分。

aie::vector<cint32,8> cv;
aie::vector<int32,16> re_im=cv.cast_to<int32>();
aie::vector<int32,8> re=aie::filter_even(re_im,1);
aie::vector<int32,8> im=aie::filter_odd(re_im,1);

aie::broadcast 可用于将矢量的每个元素设为给定值。以下示例显示了如何将矢量中的全部 8 个元素都设为一个常量值。

// set all elements to 100
aie::vector<int32,8> v1=aie::broadcast<int32,8>(100); 

以下示例显示了如何使用 aie::broadcast 来重复设置矢量中的多个值。

alignas(aie::vector_decl_align) int16 init_data[16]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};

// set 0 1 2 3 repeatedly into buff
aie::vector<int16,32> buff=aie::broadcast<cint32,8>(*(cint32*)init_data).cast_to<int16>();

以下示例显示了如何将 rva 中的首个元素乘以 rvb 中的首个元素。这种方法对于矢量乘以常量值很有效。

aie::vector<int32,8> rva,rvb;
aie::accum<acc80,8> acc = aie::mul(rva,rvb[0]);

以下示例显示了如何将 rva 中的首个元素乘以 rvb 中其对应的元素。

aie::vector<int32,8> va,vb;
aie::accum<acc80,8> acc=aie::mul(va,vb);

以下示例显示了如何使用 mmul 内部函数对 int8 x int8 数据类型执行矩阵乘法,假定以行为主的格式来执行数据存储。

// Z_{2x8} * X_{8x8} = A_{2x8}
aie::vector<int8,16> Z;
aie::vector<int8,64> X;
aie::mmul<2,8,8,int8,int8> m;
m.mul(Z,X);

// Z_{4x8} * X_{8x4} = A_{4x4}
aie::vector<int8,32> Z;
aie::vector<int8,32> X;
aie::mmul<4,8,4,int8,int8> m;
m.mul(Z,X);

如需了解有关矢量通道置换更多信息,请参阅 AI 引擎内部函数用户指南(UG1078)