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

32-Bit Vector Chunk (8-Element) API

int32_t chunk_s32_dot()

计算两个向量块的内积。

该函数计算向量块 bˉ\bar{b}cˉ\bar{c} 的内积。

从概念上讲,bˉ\bar{b} 的元素可以具有任意数量的小数位(整数、定点数、BFP向量的尾数),只要它们都是相同的。cˉ\bar{c} 的元素是Q2.30的定点数值。返回的值 aa 的小数位数与 bˉ\bar{b} 相同。

仅返回和的最低32位。

操作:

ak=0VPU_INT32_EPV1(round(bkck230))a \leftarrow \sum_{k=0}^{VPU\_INT32\_EPV-1} \left( round\left( \frac{b_k\cdot{}c_k}{2^{30}} \right) \right)

参数:

  • const int32_t b[VPU_INT32_EPV] – [in] 输入块 bˉ\bar{b}
  • const q2_30 c[VPU_INT32_EPV] – [in] 输入块 cˉ\bar{c}

返回值: aa

参考性能:

chunk_s32_dot


void chunk_s32_log()

计算32位值的向量块的自然对数。

该函数计算向量块 bˉ\bar{b} 中的每个元素的自然对数。结果以Q8.24值的8个元素块 aˉ\bar{a} 形式返回。

b\_exp 是与 bˉ\bar{b} 元素关联的指数。

任何输入 bk0b_k \le 0 将导致相应的输出 ak=INT32_MINa_k = INT32\_MIN

操作:

ak{log(bk2b_exp)bk>0INT32_MIN否则其中 k{0..VPU_INT32_EPV1}a_k \leftarrow \begin{cases} log(b_k\cdot{}2^{b\_exp}) & b_k > 0 \\ INT32\_MIN & \text{否则} \\ \end{cases} \qquad\text{其中 }k \in \{0..VPU\_INT32\_EPV-1\}

参数:

  • q8_24 a[VPU_INT32_EPV] – [out] 输出向量块 aˉ\bar{a}
  • const int32_t b[VPU_INT32_EPV] – [in] 输入向量块 bˉ\bar{b}
  • const exponent_t b_exp – [in]bˉ\bar{b} 关联的指数

异常: 如果 ba 不是双字对齐的,则引发 ET_LOAD_STORE 异常。

参考性能:

chunk_s32_log


void chunk_float_s32_log()

计算 float_s32_t 向量块的自然对数。

该函数计算向量块 bˉ\bar{b} 中的每个 VPU_INT32_EPV 元素的自然对数。结果以Q8.24值的8个元素块 aˉ\bar{a} 形式返回。

任何输入 bk0b_k \le 0 将导致相应的输出 ak=INT32_MINa_k = INT32\_MIN

操作:

ak{log(bk)bk>0INT32_MIN否则其中 k{0..VPU_INT32_EPV1}a_k \leftarrow \begin{cases} log(b_k) & b_k > 0 \\ INT32\_MIN & \text{否则} \\ \end{cases} \qquad\text{其中 }k \in \{0..VPU\_INT32\_EPV-1\}

参数:

  • q8_24 a[VPU_INT32_EPV] – [out] 输出向量块 aˉ\bar{a}
  • const float_s32_t b[VPU_INT32_EPV] – [in] 输入向量块 bˉ\bar{b}

异常: 如果 ba 不是双字对齐的,则引发 ET_LOAD_STORE 异常。

参考性能:

chunk_float_s32_log


void chunk_q30_power_series()

在Q2.30值的向量块上计算幂级数。

该函数用于计算向量块(VPU_INT32_EPV 元素向量) bˉ\bar{b} 的幂级数求和。bˉ\bar{b} 包含Q2.30值。cˉ\bar{c} 是一个包含要与 bˉ\bar{b} 的幂相乘的系数的向量,并且可以具有任何关联的指数。输出是向量块 aˉ\bar{a},其指数与 cˉ\bar{c} 相同。

c[] 是一个形状为 (term_count, VPU_INT32_EPV) 的数组,其中第二个轴上的值在所有 VPU_INT32_EPV 元素中都是相同的。也就是说,对于性能原因,c[k][i] = c[k][j] 对于 ij0..(VPU_INT32_EPV-1)。这是为了性能而做的简化。(为了说明问题,cˉ\bar{c} 被认为是单维的,没有冗余。)

操作:

bk,0=230bk,i=round(bk,i1bk230)for i{1..(N1)}ak=i=0N1round(bk,ici230)for k{0..VPU_INT32_EPV1}\begin{align*} b_{k,0} &= 2^{30} \\ b_{k,i} &= round\left(\frac{b_{k,i-1}\cdot{}b_k}{2^{30}}\right) \quad\text{for }i \in \{1..(N-1)\} \\ a_k &= \sum_{i=0}^{N-1} round\left( \frac{b_{k,i}\cdot c_i}{2^{30}} \right) \\ &\qquad\text{for }k \in \{0..VPU\_INT32\_EPV-1\} \end{align*}

参数:

  • int32_t a[VPU_INT32_EPV] – [out] 输出向量块 aˉ\bar{a}
  • const q2_30 b[VPU_INT32_EPV] – [in] 输入向量块 bˉ\bar{b}
  • const int32_t c[] – [in] 系数向量 cˉ\bar{c}
  • const unsigned term_count – [in] 幂级数项的数量 NN

参考性能:

chunk_q30_power_series


void chunk_q30_exp_small()

计算Q2.30值的向量块 bˉ\bar{b}ebe^b

该函数计算向量块 bˉ\bar{b} 的每个元素的 ebke^{b_k},其中 bˉ\bar{b} 是Q2.30值,接近0。结果使用 exe^x 在零附近的幂级数近似计算。建议仅在 0.5bk2300.5-0.5 \le b_k\cdot{}2^{-30} \le 0.5 时使用该函数。

输出向量块 aˉ\bar{a} 也以Q2.30格式表示。

操作:

akebk230for k{0..VPU_INT32_EPV}a_k \leftarrow e^{b_k\cdot{}2^{-30}} \quad\text{for }k \in \{0..VPU\_INT32\_EPV\}

参数:

  • q2_30 a[VPU_INT32_EPV] – [out] 输出向量块 aˉ\bar{a}
  • const q2_30 b[VPU_INT32_EPV] – [in] 输入向量块 bˉ\bar{b}

参考性能:

chunk_q30_exp_small