NEON溢出检测

时间:2015-08-27 23:16:11

标签: arm overflow neon

我有一个长循环,其中对8位元素执行氖矢量添加。问题是,经过一段时间后,几乎可以确定部分或全部矢量分量由于溢出而饱和。有没有快速的方法来检测这个,以便我可以刷新结果,将矢量归零并继续?我已经尝试过检查C和V标志,但似乎霓虹灯操作没有设置它们。

编辑:这里是感兴趣的代码,有点简化。此外,我升级到16位,但它仍然会溢出

int16x8_t Sum;
for(int C = 0; C < 100; C++)
{
    // Sum += |a - b|
    Sum = vabaq_u16(
      Sum,                      
      vld1q_u16((uint16_t *)a),
      vld1q_u16((uint16_t *)b)
    );
}

1 个答案:

答案 0 :(得分:0)

如果使用VQADD进行求和,它不仅会使值饱和(钳位)而不是溢出和环绕(这本身可能是理想的),但它也会设置饱和标记(位) 27)在FPSCR发生时。一旦设置,需要通过将第27位置零的FPSCR值写回来手动清除该标志。

一种可能的替代方案,取决于算法的其余部分如何使用结果,可能是将累加器分成两个寄存器,并在每一半输入向量上使用加宽运算(VABAL)来累积16位元素,然后您可以简单地以预定间隔刷新结果,而无需显式检查。由于溢出16位累加器所需的无符号8位值的最小数量为258(65535/255 = 257),因此如果循环刷新结果,则每257次或更少次的迭代溢出变得不可能。