Skip to main content
欢迎来到PAWPAW技术文档网站了解更多信息

16-bit Vector Prepare API

#define vect_s16_add_prepare vect_s32_add_prepare

获取调用vect_s16_add()所需的输出指数和位移。

计算vect_s16_add()的位移和指数的逻辑与vect_s32_add()完全相同。

该宏提供给开发人员作为便利,并使代码更易读。

另请参阅:vect_s32_add_prepare()


#define vect_s16_add_scalar_prepare vect_s32_add_prepare

获取调用vect_s16_add_scalar()所需的输出指数和位移。

计算vect_s16_add_scalar()的位移和指数的逻辑与vect_s32_add()完全相同。

该宏提供给开发人员作为便利,并使代码更易读。

另请参阅:vect_s32_add_prepare()


void vect_s16_clip_prepare()

获取用于调用vect_s16_clip()的输出指数、输入位移和修改的边界。

此函数与vect_s16_clip()一起使用,将32位BFP向量的元素限制在指定范围内。

此函数计算 a_expb_shrlower_boundupper_bound

a_exp 是由 vect_s32_clip() 计算的与 16 位尾数向量 aˉ\bar{a} 相关的指数。

b_shrvect_s16_clip() 需要的位移参数,以实现输出指数 a_exp

lower_boundupper_bound 是指示下界和上界的 16 位尾数。这些值由此函数修改,应将结果值传递给 vect_s16_clip()

b_exp 是与输入尾数向量 bˉ\bar{b} 相关的指数。

bound_exp 是与限制边界 lower_boundupper_bound 相关的指数。

b_hr 是尾数向量 bˉ\bar{b} 的头空间。如果未知,可以使用 vect_s16_headroom() 获取。或者,始终可以安全地使用值 0(但可能会导致精度降低)。

参数:

  • exponent_t* a_exp – [out] 输出尾数向量 aˉ\bar{a} 的指数

  • right_shift_t* b_shr – [out] vect_s32_clip() 使用的 bˉ\bar{b} 的带符号算术右移位移量

  • int16_t* lower_bound – [inout] 剪切范围的下界

  • int16_t* upper_bound – [inout] 剪切范围的上界

  • const exponent_t b_exp – [in] 输入尾数向量 bˉ\bar{b} 的指数

  • const exponent_t bound_exp – [in] 剪切边界 lower_boundupper_bound 的指数

  • const headroom_t b_hr – [in] 输入尾数向量 bˉ\bar{b} 的头空间

另请参阅:vect_s16_clip()


void vect_s16_inverse_prepare()

获取用于调用vect_s16_inverse()的输出指数和缩放参数。

此函数与vect_s16_inverse()一起使用,计算16位BFP向量元素的倒数。

此函数计算 a_expscale

a_exp 是与输出尾数向量 aˉ\bar{a} 相关的指数,并且必须选择以避免输入向量的最小元素溢出,因为倒数后成为最大的输出元素。为了最大化精度,此函数选择 a_exp 为已知的最小指数,以避免饱和。此函数选择的 a_exp 是从输入向量的指数和最小元素派生的。

scalevect_s16_inverse() 使用的缩放参数,以实现所选的输出指数。

b[] 是输入尾数向量 bˉ\bar{b}

b_exp 是与输入尾数向量 bˉ\bar{b} 相关的指数。

length 是向量 bˉ\bar{b} 中的元素数量。

参数:

  • exponent_t* a_exp – [out] 输出向量 aˉ\bar{a} 的指数

  • unsigned* scale – [out] 计算倒数时要应用的缩放因子

  • const int16_t b[] – [in] 输入向量 bˉ\bar{b}

  • const exponent_t b_exp – [in] bˉ\bar{b} 的指数

  • const unsigned length – [in] 向量 bˉ\bar{b} 中的元素数量

另请参阅:vect_s16_inverse()


void vect_s16_macc_prepare()

获取vect_s16_macc()所需的输出指数和位移。

此函数与vect_s16_macc()配合使用,用于对16位BFP向量进行逐元素乘累加运算。

该函数计算new_acc_expacc_shrbc_sat,以在不导致最终值或中间值饱和的情况下,最大限度地提高累加器向量的精度。通常,调用者将把这些输出传递给vect_s16_macc()的相应输入。

acc_exp是操作前与累加器尾数向量 aˉ\bar{a} 相关联的指数,而new_acc_exp是与更新后的累加器向量对应的指数。

b_expc_exp分别是与复数输入尾数向量 bˉ\bar{b}cˉ\bar{c} 相关联的指数。

acc_hrb_hrc_hr分别是 aˉ\bar{a}bˉ\bar{b}cˉ\bar{c} 的头空间。如果这些向量中任何一个的头空间未知,可以通过调用vect_s16_headroom()来获取。或者,始终可以安全地使用值0(但可能会导致精度降低)。

参数:

  • exponent_t* new_acc_exp – [out] 输出尾数向量 aˉ\bar{a}(累加后)的指数
  • right_shift_t* acc_shr – [out] 用于vect_s16_macc()aˉ\bar{a} 的有符号算术右移位
  • right_shift_t* bc_sat – [out] 用于vect_s16_macc()中元素 bkb_kckc_k 的无符号算术右移位
  • const exponent_t acc_exp – [in] 输入尾数向量 aˉ\bar{a}(累加前)的指数
  • const exponent_t b_exp – [in] 输入尾数向量 bˉ\bar{b} 的指数
  • const exponent_t c_exp – [in] 输入尾数向量 cˉ\bar{c} 的指数
  • const headroom_t acc_hr – [in] 输入尾数向量 aˉ\bar{a}(累加前)的头空间
  • const headroom_t b_hr – [in] 输入尾数向量 bˉ\bar{b} 的头空间
  • const headroom_t c_hr – [in] 输入尾数向量 cˉ\bar{c} 的头空间

调整输出指数:

如果需要特定的输出指数 desired_exp 用于结果(例如,用于模拟定点算术),则可以根据以下方式调整此函数生成的 acc_shrbc_sat

// 假设在某处已设置
exponent_t acc_exp, b_exp, c_exp;
headroom_t acc_hr, b_hr, c_hr;
exponent_t desired_exp;

...

// 调用 prepare
right_shift_t acc_shr, bc_sat;
vect_s16_macc_prepare(&acc_exp, &acc_shr, &bc_sat,
acc_exp, b_exp, c_exp,
acc_hr, b_hr, c_hr);

// 修改结果
right_shift_t mant_shr = desired_exp - acc_exp;
acc_exp += mant_shr;
acc_shr += mant_shr;
bc_sat += mant_shr;

// 现在可以使用 acc_shr 和 bc_sat 调用 vect_s16_macc()

在应用上述调整时,应满足以下条件:

  • bc_sat >= 0bc_sat无符号 右移位)
  • acc_shr > -acc_hr(进一步左移可能导致饱和)

用户需要确保任何此类修改不会导致饱和或不可接受的精度损失。


#define vect_s16_nmacc_prepare vect_s16_macc_prepare

获取调用vect_s16_nmacc()所需的输出指数和位移。

计算vect_s16_nmacc()的位移和指数的逻辑与vect_s16_macc_prepare()完全相同。

提供此宏是为了方便开发人员,并使代码更易读。

另请参阅:vect_s16_macc_prepare()vect_s16_nmacc()


void vect_s16_mul_prepare()

获取vect_s16_mul()所使用的输出指数和输出右移量。

此函数与vect_s16_mul()配合使用,用于对两个16位BFP向量进行逐元素乘法运算。

该函数计算a_expa_shr

a_exp是与尾数向量 aˉ\bar{a} 相关联的指数,必须选择足够大的值,以避免计算 aˉ\bar{a} 元素时的溢出。为了最大化精度,该函数选择a_exp作为已知的最小指数,以避免饱和(参见下面的异常说明)。此函数选择的a_exp是根据输入向量的指数和头空间派生出来的。

a_shr是应用于输入元素的32位乘积的算术右移量,以实现所选择的输出指数a_exp

b_expc_exp分别是与输入尾数向量 bˉ\bar{b}cˉ\bar{c} 相关联的指数。

b_hrc_hr分别是 bˉ\bar{b}cˉ\bar{c} 的头空间。如果 bˉ\bar{b}cˉ\bar{c} 的头空间未知,可以通过调用vect_s16_headroom()来获取。或者,始终可以安全地使用值0(但可能会导致精度降低)。

参数:

  • exponent_t* a_exp – [out] vect_s16_mul()的输出元素的指数

  • right_shift_t* a_shr – [out] 提供给vect_s16_mul()的右移量

  • const exponent_t b_exp – [in]bˉ\bar{b} 相关联的指数

  • const exponent_t c_exp – [in]cˉ\bar{c} 相关联的指数

  • const headroom_t b_hr – [in] bˉ\bar{b} 的头空间

  • const headroom_t c_hr – [in] cˉ\bar{c} 的头空间

调整输出指数:

如果需要结果的特定输出指数 desired_exp(例如,用于模拟定点算术),可以根据以下方式调整此函数生成的 a_shr

exponent_t a_exp;
right_shift_t a_shr;
vect_s16_mul_prepare(&a_exp, &a_shr, b_exp, c_exp, b_hr, c_hr);
exponent_t desired_exp = ...; // 先验已知值
a_shr = a_shr + (desired_exp - a_exp);
a_exp = desired_exp;

在应用上述调整时,应满足以下条件:

  • a_shr >= 0

请注意,如果对 a_shr 使用比严格要求的更小的值,可能会导致饱和,而使用较大的值可能会导致不必要的下溢或精度损失。

注意事项:

  • 使用此函数的输出时,原本将为 INT16_MIN 的输出尾数将饱和为 -INT16_MAX。这是由VPU采用的对称饱和逻辑造成的,属于硬件特性。这是一个通常不太可能发生的特殊情况,当发生时会产生1个LSb的误差。

void vect_s16_scale_prepare()

获取vect_s16_scale()函数使用的输出指数和输出右移量。

此函数与vect_s16_scale()一起使用,用于将16位BFP向量 bˉ2b_exp\bar{b} \cdot 2^{b\_exp} 乘以16位标量 c2c_expc \cdot 2^{c\_exp}。结果是另一个16位BFP向量 aˉ2a_exp\bar{a} \cdot 2^{a\_exp}

该函数计算 a_expa_shr

a_exp 是与尾数向量 aˉ\bar{a} 关联的指数,必须选择足够大以避免计算 aˉ\bar{a} 元素时的溢出。为了最大化精度,该函数选择 a_exp 为已知以避免饱和的最小指数(参见下面的异常)。此函数选择的 a_exp 是根据输入关联的指数和头空间来确定的。

a_shrvect_complex_s16_scale() 应用于输入元素的32位乘积的算术右移量,以实现选择的输出指数 a_exp

b_expc_exp 分别是与 bˉ\bar{b}cc 关联的指数。

b_hrc_hr 分别是 bˉ\bar{b}cc 的头空间。如果 bˉ\bar{b}cc 的头空间未知,可以通过调用 vect_s16_headroom() 来获取。或者,始终可以安全地使用值 0(但可能会导致精度降低)。

调整输出指数:

如果需要结果的特定输出指数 desired_exp(例如用于模拟定点算术),可以根据以下方式调整此函数生成的 a_shr

exponent_t a_exp;
right_shift_t a_shr;
vect_s16_scale_prepare(&a_exp, &a_shr, b_exp, c_exp, b_hr, c_hr);
exponent_t desired_exp = ...; // 先验已知值
a_shr = a_shr + (desired_exp - a_exp);
a_exp = desired_exp;

在应用上述调整时,应满足以下条件:

  • a_shr >= 0

请注意,使用比 a_shr 严格必要的更小值可能导致饱和,而使用较大的值可能导致不必要的下溢或精度损失。

注意事项:

  • 使用此函数的输出,否则将为 INT16_MIN 的输出尾数将饱和为 -INT16_MAX。这是由VPU使用的对称饱和逻辑引起的硬件特性。这是一个通常不太可能发生的边界情况,当发生时会产生1个LSb的误差。

参数:

  • exponent_t *a_exp – [out] vect_s16_scale() 的输出元素的指数
  • right_shift_t *a_shr – [out] 提供给 vect_s16_scale() 的右移量
  • const exponent_t b_exp – [in]bˉ\bar{b} 关联的指数
  • const exponent_t c_exp – [in]cc 关联的指数
  • const headroom_t b_hr – [in] bˉ\bar{b} 的头空间
  • const headroom_t c_hr – [in] cc 的头空间

另请参见:vect_s16_scale


void vect_s16_sqrt_prepare()

获取vect_s16_sqrt()函数使用的输出指数和移位参数。

该函数与vect_s16_sqrt()配合使用,用于计算16位BFP向量元素的平方根。

该函数计算 a_expb_shr

a_exp 是与输出尾数向量 aˉ\bar{a} 相关联的指数,应选择使结果精度最大化的 a_exp。为此,该函数选择 a_exp 作为已知最小指数,以避免结果尾数向量 aˉ\bar{a} 的饱和。它是根据输入BFP向量的指数和头空间推导出来的。

b_shrvect_s16_sqrt() 所需的移位参数,以实现所选择的输出指数 a_exp

b_exp 是与输入尾数向量 bˉ\bar{b} 相关联的指数。

b_hrbˉ\bar{b} 的头空间。如果未知,可以使用vect_s16_headroom()来获取。或者,始终可以安全地使用值 0(但可能会导致精度降低)。

调整输出指数:

如果需要特定的输出指数 desired_exp 用于结果(例如,用于模拟定点算术),可以根据以下方式调整此函数生成的 b_shr

exponent_t a_exp;
right_shift_t b_shr;
vect_s16_mul_prepare(&a_exp, &b_shr, b_exp, c_exp, b_hr, c_hr);
exponent_t desired_exp = ...; // 事先已知的值
b_shr = b_shr + (desired_exp - a_exp);
a_exp = desired_exp;

在应用上述调整时,应满足以下条件:

  • b_hr + b_shr >= 0

请注意,使用比 b_shr 严格必要的更小值可能会导致饱和,而使用较大的值可能会导致不必要的下溢或精度损失。

此外,如果使用比必要的更大指数,将需要更大的 depth 参数(参见 vect_s16_sqrt())以实现相同的精度,因为结果是逐位计算的,从最高有效位开始。

参数:

  • exponent_t *a_exp – [out] vect_s16_sqrt()的输出指数
  • right_shift_t *b_shr – [out] 应用于 bˉ\bar{b} 元素的右移位数
  • const exponent_t b_exp – [in] bˉ\bar{b} 的指数
  • const right_shift_t b_hr – [in] bˉ\bar{b} 的头空间

另请参阅: vect_s16_sqrt()


#define vect_s16_sub_prepare vect_s32_add_prepare

获取调用vect_s16_sub()所需的输出指数和移位。

计算vect_s16_sub()的移位和指数的逻辑与vect_s32_add()相同。

提供此宏是为了方便开发人员,并使代码更可读。

另请参阅:vect_s32_add_prepare()