我正在学习ARM-v8 Aarch 64 Sim指令,希望能够优化一些计算.在这种情况下,我正在寻找4xf 32载体上的模运算.
如何用NEON指令集实现模?
注:我实际上正在寻找一些东西来确保我的Angular 值保持在-PI和+PI之间(周期性的,而不是钳位),所以我也对此感兴趣的其他解决方案.
注:目前我正在try 使用C中的arm_RST. h头来实现这一点,但我可能会在某个时候直接使用汇编来实现这一点,以便在不将结果存储在变量中的情况下对组合指令进行更多优化.
我正在学习ARM-v8 Aarch 64 Sim指令,希望能够优化一些计算.在这种情况下,我正在寻找4xf 32载体上的模运算.
如何用NEON指令集实现模?
注:我实际上正在寻找一些东西来确保我的Angular 值保持在-PI和+PI之间(周期性的,而不是钳位),所以我也对此感兴趣的其他解决方案.
注:目前我正在try 使用C中的arm_RST. h头来实现这一点,但我可能会在某个时候直接使用汇编来实现这一点,以便在不将结果存储在变量中的情况下对组合指令进行更多优化.
Armv 8-A ASIMD指令集扩展不具有模指令,既不适用于浮点,也不适用于整元. 然而,对于1的约数,您可以通过使用"转换为integer"对数字进行四舍五入来模拟模,然后从四舍五入的数字中减go ,从而为您提供具有适当符号的小数部分. 然后您可以通过以下身份实现模运算:
fmod(a, 1) = a - round_towards_zero(a)
fmod(a, b) = fmod(a/b, 1) * b
请注意,在您的情况下,b
是一个常数,因此这变成:
fmod(a, b) = a - round_towards_zero(a * 1/b) * b
然后这变成了三个指令:a
和1/b
的相乘、"向零舍入"和"乘减"操作. 为了获得更好的性能,您应该考虑保持Angular 预先zoom ,使其处于开放区间(-1,+1).
另一件需要考虑的事情:如果已知Angular 超出范围最多b
度,则与±b进行比较并根据需要有条件地添加/减go b可能会更快.