我正在学习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

然后这变成了三个指令:a1/b的相乘、"向零舍入"和"乘减"操作. 为了获得更好的性能,您应该考虑保持Angular 预先zoom ,使其处于开放区间(-1,+1).

另一件需要考虑的事情:如果已知Angular 超出范围最多b度,则与±b进行比较并根据需要有条件地添加/减go b可能会更快.

C++相关问答推荐

ARM上的Modulo Sim Aarch 64(NEON)

我可以动态分配具有空类型函数的矩阵吗?

将整数的.csv文件解析为C语言中的二维数组

ATmega328P EEPROM未写入

_泛型控制表达式涉及数组碰撞警告的L值转换错误?

是什么让numpy.sum比优化的(自动矢量化的)C循环更快?

整型文字后缀在左移中的用途

在Apple Silicon上编译x86的Fortran/C程序

如何在STM8项目中导入STM8S/A标准外设库(ST VisualDeveloper)?

为什么我可以在GCC的标签后声明变量,但不能声明Clang?

如何将大写/小写土耳其字母相互转换?

如何摆脱-WIMPLICIT-Function-声明

有没有办法减少C语言中线程的堆大小?

C编译和运行

在C中,为什么这个带有递增整数的main函数从不因溢出而崩溃?

计算时出现奇怪的计算错误;N Select K;在C中

即使客户端不发送数据,也会发生UNIX套接字读取

在列表中查找素数

无法将字符串文字分配给 C 中的字符数组

C 中 struct 体自赋值是否安全?特别是如果一侧是指向 struct 的指针?