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

Complex 32-bit Vector Prepare API

#define vect_complex_s32_add_prepare vect_s32_add_prepare

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

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

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

另请参见:vect_s32_add_prepare()


#define vect_complex_s32_add_scalar_prepare vect_s32_add_prepare

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

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

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

另请参见:vect_s32_add_prepare()


#define vect_complex_s32_conj_mul_prepare vect_complex_s32_mul_prepare

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

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

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

另请参见:vect_complex_s32_mul_prepare()


void vect_complex_s32_macc_prepare()

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

此函数与vect_complex_s32_macc()结合使用,对32位BFP向量进行逐元素乘加。

此函数计算new_acc_expacc_shrb_shrc_shr,以最大化结果累加器向量的精度,同时不会导致最终值或中间值饱和。通常,调用者将这些输出传递给vect_complex_s32_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_complex_s32_headroom()来获取。或者,始终可以安全地使用值0(但可能会导致精度降低)。

调整输出指数:

如果需要特定的输出指数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, b_shr, c_shr;
vect_complex_s32_macc_prepare(&acc_exp, &acc_shr, &b_shr, &c_shr,
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;
b_shr += mant_shr;
c_shr += mant_shr;

// 现在可以在调用vect_complex_s32_macc()中使用acc_shr、b_shr和c_shr

在应用上述调整时,应保持以下条件:

  • acc_shr > -acc_hr (进一步向左移位可能会导致饱和)
  • b_shr => -b_hr (进一步向左移位可能会导致饱和)
  • c_shr => -c_hr (进一步向左移位可能会导致饱和)

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

参数:

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

另请参见:vect_complex_s32_macc()


#define vect_complex_s32_nmacc_prepare vect_complex_s32_macc_prepare

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

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

vect_complex_s32_macc_prepare()是一个宏,它为开发人员提供方便,并使代码更易读。

请参见:vect_complex_s32_macc_prepare()vect_complex_s32_nmacc()


#define vect_complex_s32_conj_macc_prepare vect_complex_s32_macc_prepare

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

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

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

另请参见:vect_complex_s32_macc_prepare()vect_complex_s32_conj_nmacc()


#define vect_complex_s32_conj_nmacc_prepare vect_complex_s32_macc_prepare

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

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

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

另请参见:vect_complex_s32_macc_prepare()vect_complex_s32_conj_nmacc()


void vect_complex_s32_mag_prepare()

获取vect_complex_s32_mag()vect_complex_s16_mag()所使用的输出指数和输入位移。

此函数与vect_complex_s32_mag()一起用于计算复数32位BFP向量的每个元素的幅值。

该函数计算 a_expb_shr

a_exp 是与尾数向量 aˉ\bar{a} 关联的指数,并且在计算 aˉ\bar{a} 的元素时选择以最大化精度。此函数选择的 a_exp 是根据输入向量的指数和头空间推导出的。

b_shrvect_complex_s32_mag() 所需的位移参数,以达到所选择的输出指数 a_exp

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

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

参数:

  • exponent_t *a_exp – [out] 输出与输出尾数向量 aˉ\bar{a} 关联的指数。
  • right_shift_t *b_shr – [out] vect_complex_s32_mag() 所使用的 bˉ\bar{b} 的有符号算术右移位。
  • const exponent_t b_exp – [in] 与输入尾数向量 bˉ\bar{b} 关联的指数。
  • const headroom_t b_hr – [in] 输入尾数向量 bˉ\bar{b} 的头空间。

另请参见:vect_complex_s32_mag()

调整输出指数:

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

exponent_t desired_exp = ...; // 先验已知值
right_shift_t new_b_shr = b_shr + (desired_exp - a_exp);

在应用上述调整时,应满足以下条件:b_hr + b_shr >= 0

使用比 b_shr 所需的更大值可能导致不必要的下溢或精度损失。


void vect_complex_s32_mul_prepare()

获取vect_complex_s32_mul()vect_complex_s32_conj_mul()使用的输出指数和输入位移。

该函数与vect_complex_s32_mul()结合使用,用于对两个复数32位BFP向量进行逐元素复数乘法运算。

该函数计算 a_expb_shrc_shr

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

  • b_shrc_shrvect_complex_s32_mul() 所需的移位参数,用于实现选择的输出指数 a_exp

  • b_expc_exp 是与输入尾数向量 Bˉ\bar BCˉ\bar C 相关联的指数。

  • b_hrc_hr 分别是 Bˉ\bar BCˉ\bar C 的头空间。如果 Bˉ\bar BCˉ\bar C 的头空间未知,可以调用 vect_complex_s32_headroom()获取。或者,始终可以安全地使用值 0(但可能会导致精度降低)。

调整输出指数:

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

exponent_t desired_exp = ...; // 先验已知的值
right_shift_t new_b_shr = b_shr + (desired_exp - a_exp);
right_shift_t new_c_shr = c_shr + (desired_exp - a_exp);

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

  • b_hr + b_shr >= 0
  • c_hr + c_shr >= 0

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

注意事项:

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

参数:

  • exponent_t *a_exp – [out] 输出尾数向量 Aˉ\bar A 相关的指数

  • right_shift_t *b_shr – [out] vect_complex_s32_mul() 使用的用于 Bˉ\bar B 的有符号算术右移位

  • right_shift_t *c_shr – [out] vect_complex_s32_mul() 使用的用于 Cˉ\bar C 的有符号算术右移位

  • 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 的头空间

另请参阅:


void vect_complex_s32_real_mul_prepare()

获取 vect_complex_s32_real_mul() 使用的输出指数和输入移位。

此函数与 vect_complex_s32_real_mul() 结合使用,执行复数32位BFP向量与实数32位BFP向量的逐元素乘法。该函数计算 a_expb_shrc_shr

参数:

  • exponent_t *a_exp – [out]aˉ\bar{a} 相关联的输出指数
  • right_shift_t *b_shr – [out] vect_complex_s32_real_mul() 使用的 bˉ\bar{b} 的有符号算术右移
  • right_shift_t *c_shr – [out] vect_complex_s32_real_mul() 使用的 cˉ\bar{c} 的有符号算术右移
  • 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(例如用于模拟定点运算),可以根据以下公式调整由此函数产生的 b_shrc_shr

exponent_t desired_exp = ...; // 先验已知值
right_shift_t new_b_shr = b_shr + (desired_exp - a_exp);
right_shift_t new_c_shr = c_shr + (desired_exp - a_exp);

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

  • b_hr + b_shr >= 0
  • c_hr + c_shr >= 0

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

备注:

  • 使用此函数的输出,一个本来应为 INT32_MIN 的输出尾数将饱和为 -INT32_MAX。这是由VPU采用的对称饱和逻辑引起的硬件特性。这是一个通常不太可能发生的边界情况,当它发生时会产生1个最低有效位的误差。

vect_complex_s32_real_scale_prepare

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

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

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

参见:


void vect_complex_s32_scale_prepare()

获取vect_complex_s32_scale()所使用的输出指数和输入位移。

此函数与vect_complex_s32_scale()配合使用,用于将复数32位BFP向量与复数32位标量进行复数乘法运算。该函数计算a_expb_shrc_shr

参数:

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

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

  • right_shift_t *c_shr – [out]vect_complex_s32_scale()使用的 cˉ\bar{c} 的有符号算术右移位数

  • 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(例如,用于模拟定点算术),可以根据以下方式调整此函数产生的 b_shrc_shr

exponent_t desired_exp = ...; // 事先已知的值
right_shift_t new_b_shr = b_shr + (desired_exp - a_exp);
right_shift_t new_c_shr = c_shr + (desired_exp - a_exp);

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

  • b_hr + b_shr >= 0
  • c_hr + c_shr >= 0

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

注意:

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

void vect_complex_s32_squared_mag_prepare()

获取vect_complex_s32_squared_mag()所使用的输出指数和输入位移。

此函数与vect_complex_s32_squared_mag()配合使用,用于计算复数32位BFP向量的每个元素的平方幅值。该函数计算a_expb_shr

参数:

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

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

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

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

调整输出指数:

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

exponent_t desired_exp = ...; // 事先已知的值
right_shift_t new_b_shr = b_shr + (desired_exp - a_exp);

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

  • b_hr + b_shr >= 0

使用比 b_shr 严格所需的更大值可能会导致不必要的下溢或精度损失。


#define vect_complex_s32_sub_prepare vect_s32_add_prepare

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

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

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

另请参见:vect_s32_add_prepare()


void vect_complex_s32_sum_prepare()

获取用于vect_complex_s32_sum()的输出指数和输入移位。

此函数与vect_complex_s32_sum()一起用于计算复数32位BFP向量的元素和。

该函数计算 a_expb_shr

a_exp 是由 vect_complex_s32_sum() 返回的64位尾数 aa 的指数,并且必须选择足够大的 a_exp 来避免在计算 aa 时饱和。为了最大化精度,该函数选择 a_exp 为已知的避免饱和的最小指数。该函数选择的 a_exp 是根据输入向量的指数和头空间派生的。

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

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

b_hrbˉ\bar b 的头空间。如果 bˉ\bar b 的头空间未知,可以使用vect_complex_s32_headroom()计算。或者,始终可以安全地使用值 0(但可能导致精度降低)。

length 是输入尾数向量 bˉ\bar b 中的元素数量。

调整输出指数:

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

exponent_t desired_exp = ...; // 先验已知值
right_shift_t new_b_shr = b_shr + (desired_exp - a_exp);

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

  • b_hr + b_shr >= 0

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

参数:

  • exponent_t *a_exp – [out] 输出尾数 aa 相关的指数

  • right_shift_t *b_shr – [out] vect_complex_s32_sum() 使用的用于 bˉ\bar b 的有符号算术右移

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

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

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

另请参见:vect_complex_s32_sum