数据置换和 MAC 示例 - 2023.2 简体中文

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

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

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

v8cint32 cv = as_v8cint32(select16(0xaaaa, concat(rva, rvb),
		0, 0x03020100, 0x07060504,  8, 0x30201000, 0x70605040));

以下示例演示了如何抽取矢量 cv 中类型为 v8cint32 的实数和虚数部分。

v16int32 re_im  = shuffle16(as_v16int32(cv), 0, 0xECA86420, 0xFDB97531);  
v8int32 re = ext_w(re_im, 0);  
v8int32 im = ext_w(re_im, 1);

Shuffle(乱序)内部函数可用于对矢量中的元素进行重新排序或者将所有元素设为相同值。部分内部函数仅在更大的寄存器上进行操作,但这些内部函数都能轻松用于更小的寄存器。以下示例显示了如何实现函数以将矢量中的全部 4 个元素都设为一个常量值。

v4int32 v2 = ext_v(shuffle16(xset_v(0, v1), 0 ,0, 0), 0);

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

v8acc80 acc = lmul8(concat(rva,undef_v8int32()),0,0x76543210,rvb,0,0x00);

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

acc = lmul8(concat(rva, undef_v8int32()),0,0x76543210,rvb,0,0x76543210);
acc = lmul8(upd_w(undef_v16int32(),0,rva),0,0x76543210,rvb,0,0x76543210);

以下示例显示了如何使用 mul 内部函数对 int8 x int8 数据类型执行矩阵乘法,假定数据存储是基于行来执行的。

//Z_{2x8} * X_{8x8} = A_{2x8}
mul16(Xbuff, 0, 0x11101110, 16, 0x3120, Zbuff, 0, 0x44440000, 2, 0x3210);
//Z_{4x8} * X_{8x4} = A_{4x4}
mul16(Xbuff, 0, 0x00000000, 8, 0x3120, Zbuff, 0, 0xCC884400, 2, 0x3210);

如果内核具有多个 mulmac 内部函数,请尝试在各种用例中,使 xoffsetszoffsets 参数保持不变,使 xtsartzstart 参数保持不同。这样有助于防止栈上出现配置寄存器溢出。

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