16-bit Vector Prepare API
#define vect_s16_add_prepare vect_s32_add_prepare
获取调用vect_s16_add()所需的输出指数和位移。
计算vect_s16_add()的位移和指数的逻辑与vect_s32_add()完全相同。
该宏提供给开发人员作为便利,并使代码更易读。
#define vect_s16_add_scalar_prepare vect_s32_add_prepare
获取调用vect_s16_add_scalar()所需的输出指数和位移。
计算vect_s16_add_scalar()的位移和指数的逻辑与vect_s32_add()完全相同。
该宏提供给开发人员作为便利,并使代码更易读。
void vect_s16_clip_prepare()
获取用于调用vect_s16_clip()的输出指数、输入位移和修改的边界。
此函数与vect_s16_clip()一起使用,将32位BFP向量的元素限制在指定范围内。
此函数计算 a_exp、b_shr、lower_bound 和 upper_bound。
a_exp 是由 vect_s32_clip() 计算的与 16 位尾数向量 相关的指数。
b_shr 是 vect_s16_clip() 需要的位移参数,以实现输出指数 a_exp。
lower_bound 和 upper_bound 是指示下界和上界的 16 位尾数。这些值由此函数修改,应将结果值传递给 vect_s16_clip()。
b_exp 是与输入尾数向量 相关的指数。
bound_exp 是与限制边界 lower_bound 和 upper_bound 相关的指数。
b_hr 是尾数向量 的头空间。如果未知,可以使用 vect_s16_headroom() 获取。或者,始终可以安全地使用值 0(但可能会导致精度降低)。
参数:
-
exponent_t* a_exp– [out] 输出尾数向量 的指数 -
right_shift_t* b_shr– [out]vect_s32_clip()使用的 的带符号算术右移位移量 -
int16_t* lower_bound– [inout] 剪切范围的下界 -
int16_t* upper_bound– [inout] 剪切范围的上界 -
const exponent_t b_exp– [in] 输入尾数向量 的指数 -
const exponent_t bound_exp– [in] 剪切边界lower_bound和upper_bound的指数 -
const headroom_t b_hr– [in] 输入尾数向量 的头空间
另请参阅:vect_s16_clip()
void vect_s16_inverse_prepare()
获取用于调用vect_s16_inverse()的输出指数和缩放参数。
此函数与vect_s16_inverse()一起使用,计算16位BFP向量元素的倒数。
此函数计算 a_exp 和 scale。
a_exp 是与输出尾数向量 相关的指数, 并且必须选择以避免输入向量的最小元素溢出,因为倒数后成为最大的输出元素。为了最大化精度,此函数选择 a_exp 为已知的最小指数,以避免饱和。此函数选择的 a_exp 是从输入向量的指数和最小元素派生的。
scale 是 vect_s16_inverse() 使用的缩放参数,以实现所选的输出指数。
b[] 是输入尾数向量 。
b_exp 是与输入尾数向量 相关的指数。
length 是向量 中的元素数量。
参数:
-
exponent_t* a_exp– [out] 输出向量 的指数 -
unsigned* scale– [out] 计算倒数时要应用的缩放因子 -
const int16_t b[]– [in] 输入向量 -
const exponent_t b_exp– [in] 的指数 -
const unsigned length– [in] 向量 中的元素数量
另请参阅:vect_s16_inverse()
void vect_s16_macc_prepare()
获取vect_s16_macc()所需的输出指数和位移。
此函数与vect_s16_macc()配合使用,用于对16位BFP向量进行逐元素乘累加运算。
该函数计算new_acc_exp、acc_shr和bc_sat,以在不导致最终值或中间值饱和的情况下,最大限度地提高累加器向量的精度。通常,调用者将把这些输出传递给vect_s16_macc()的相应输入。
acc_exp是操作前与累加器尾数向量 相关联的指数,而new_acc_exp是与更新后的累加器向量对应的指数。
b_exp和c_exp分别是与复数输入尾数向量 和 相关联的指数。
acc_hr、b_hr和c_hr分别是 、 和 的头空间。如果这些向量中任何一个的头空间未知,可以通过调用vect_s16_headroom()来获取。或者,始终可以安全地使用值0(但可能会导致精度降低)。
参数:
exponent_t* new_acc_exp– [out] 输出尾数向量 (累加后)的指数right_shift_t* acc_shr– [out] 用于vect_s16_macc()中 的有符号算术右移位right_shift_t* bc_sat– [out] 用于vect_s16_macc()中元素 和 的无符号算术右移位const exponent_t acc_exp– [in] 输入尾数向量 (累加前)的指数const exponent_t b_exp– [in] 输入尾数向量 的指数const exponent_t c_exp– [in] 输入尾数向量 的指数const headroom_t acc_hr– [in] 输入尾数向量 (累加前)的头空间const headroom_t b_hr– [in] 输入尾数向量 的头空间const headroom_t c_hr– [in] 输入尾数向量 的头空间
调整输出指数:
如果需要特定的输出指数 desired_exp 用于结果(例如,用于模拟定点算术),则可以根据以下方式调整此函数生成的 acc_shr 和 bc_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 >= 0(bc_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_exp和a_shr。
a_exp是与尾数向量 相关联的指数,必须选择足够大的值,以避免计算 元素时的溢出。为了最大化精度,该函数选择a_exp作为已知的最小指数,以避免饱和(参见下面的异常说明)。此函数选择的a_exp是根据输入向量的指数和头空间派生出来的。
a_shr是应用于输入元素的32位乘积的算术右移量,以实现所选择的输出指数a_exp。
b_exp和c_exp分别是与输入尾数向量 和 相关联的指数。
b_hr和c_hr分别是 和 的头空间。如果 或 的头空间未知,可以通过调用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] 与 相关联的指数 -
const exponent_t c_exp– [in] 与 相关联的指数 -
const headroom_t b_hr– [in] 的头空间 -
const headroom_t c_hr– [in] 的头空间
调整输出指数:
如果需要结果的特定输出指数 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向量 乘以16位标量 。结果是另一个16位BFP向量 。
该函数计算 a_exp 和 a_shr。
a_exp 是与尾数向量 关联的指数,必须选择足够大以避免计算 元素时的溢出。为了最大化精度,该函数选择 a_exp 为已知以避免饱和的最小指数(参见下面的异常)。此函数选择的 a_exp 是根据输入关联的指数和头空间来确定的。
a_shr 是 vect_complex_s16_scale() 应用于输入元素的32位乘积的算术右移量,以实现选择的输出指数 a_exp。
b_exp 和 c_exp 分别是与 和 关联的指数。
b_hr 和 c_hr 分别是 和 的头空间。如果 或 的头空间未知,可以通过调用 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] 与 关联的指数const exponent_t c_exp– [in] 与 关联的指数const headroom_t b_hr– [in] 的头空间const headroom_t c_hr– [in] 的头空间
另请参见:vect_s16_scale
void vect_s16_sqrt_prepare()
获取vect_s16_sqrt()函数使用的输出指数和移位参数。
该函数与vect_s16_sqrt()配合使用,用于计算16位BFP向量元素的平方根。
该函数计算 a_exp 和 b_shr。
a_exp 是与输出尾数向量 相关联的指数,应选择使结果精度最大化的 a_exp。为此,该函数选择 a_exp 作为已知最小指数,以避免结果尾数向量 的饱和。它是根据输入BFP向量的指数和头空间推导出来的。
b_shr 是 vect_s16_sqrt() 所需的移位参数,以实现所选择的输出指数 a_exp。
b_exp 是与输入尾数向量 相关联的指数。
b_hr 是 的头空间。如果未知,可以使用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] 应用于 元素的右移位数const exponent_t b_exp– [in] 的指数const right_shift_t b_hr– [in] 的头空间
另请参阅: vect_s16_sqrt()
#define vect_s16_sub_prepare vect_s32_add_prepare
获取调用vect_s16_sub()所需的输出指数和移位。
计算vect_s16_sub()的移位和指数的逻辑与vect_s32_add()相同。
提供此宏是为了方便开发人员,并使代码更可读。