更新、抽取和移位 - 2023.2 简体中文

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

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

upd_v()upd_w()upd_x() 内部函数是专为更新矢量寄存器的某些部分而提供的,用于执行 128 位 (v)、256 位 (w) 和 512 位 (x) 更新。

注释: 更新会以新数据覆盖更大的矢量中的一部分,矢量其余部分则保持活动。此更大的矢量中保持活动的部分在执行多次更新期间均保持不变。如有过多矢量保持非必要活动状态,那么可能发生寄存器溢出,并影响性能。

同样,ext_v()ext_w()ext_x() 内部函数是专为抽取矢量的某些部分而提供的。

upd_elem()ext_elem() 内部函数是专为更新或抽取个别元素而提供的。如果加载或存储的值并非位于连续存储器位置中,并且需要多个时钟周期才能完成一个矢量的加载或存储,则必须使用这些值。在以下示例中,矢量 v1 的第 0 个元素会以 a 的值来加以更新,该值为 100。

int a = 100;
v4int32 v1 = upd_elem(undef_v4int32(), 0, a);

另一个重要的用法是将数据移至标量单元并执行倒数或平方根运算。在以下示例中,将抽取矢量 vf 的第 0 个元素并将其存储在标量变量 f 中。

v4float vf;
float f=ext_elem(vf,0);
float i_f=invsqrt(f);

shft_elem() 内部函数可用于更新矢量,方法是在矢量开始位置插入新的元素,并将其他元素移位 1。

累加器寄存器可由 ups 内部函数从矢量寄存器进行更新。并且,累加器寄存器也可由 upd_hiupd_lo 内部函数进行半更新。
//From v16int32 to v16acc48
v16int32 v;
v16acc48 acc = upd_lo(acc, ups(ext_w(v, 0), 0)); 
acc = upd_hi(acc, ups(ext_w(v, 1), 0));