使用NEON进行矢量化浮点舍入

Jos*_*der 0 floating-point arm rounding neon

我有一个充满NEON的注册表float32.我想将它们四舍五入到最接近的整数,而不必转回主CPU.转换float32uint32简单截断的NEON指令,例如39.7变为39,而不是40.我不太关心如何0.5处理 - 从零或圆到圆,甚至两个都为我工作.

我能看到实现舍入的最佳途径是

  • 转换为int32(因此截断)
  • 转换float32
  • 添加1 int32,转换回float32,并留出以防万一我们正在四舍五入
  • 减去
  • 比较0.5(不需要abs值,因为我知道在我的情况下他们都是正面的)
  • 根据比较结果选择截断或截断+ 1

这似乎是丑陋,缓慢和复杂的.

有更清洁,更快,更简单,更健全的方式吗?

Eri*_*hil 6

添加.5并转换为整数.如果您希望结果采用浮点格式,请转换回来.

由于您知道数字都是正数,因此另一个选项是添加0x1p23并减去0x1p23.添加0x1p23的结果至少为0x1p23,因此float结果没有值小于1的位,因此它必须舍入为整数.然后减去0x1p23减去添加的值,只留下舍入的效果.