我一直在为 ARM 设备上的增强现实开发 C++ 代码,代码的优化对于实现 保持良好的帧率。为了将效率提高到最高水平,我认为收集一般提示很重要 使编译器的工作更轻松,并减少程序的循环数。欢迎提出任何建议。
1- 避免高成本指令:除法、平方根、sin、cos
- 使用逻辑移位来除以或乘以 2。
- 尽可能乘以倒数。
2- 优化内部“for”循环:它们是一个瓶颈,所以我们应该避免在内部进行大量计算,尤其是除法、平方根......
3- 对一些数学函数(sin、cos、...)使用查找表
有用的工具
- objdump:获取已编译程序的汇编代码。这允许比较两个函数并检查它是否真正优化。
最佳答案
为回答您关于优化 ARM 的 C++ 代码时的一般规则的问题,以下是一些建议:
1) 正如您所提到的,没有除法指令。尽可能使用逻辑移位或乘以倒数。
2)内存比CPU执行慢很多;使用逻辑运算来避免小型查找表。
3) 尝试一次写入 32 位,以充分利用写入缓冲区。写短裤或字符会大大减慢代码速度。换句话说,将较小的位进行逻辑或运算并将它们写为 DWORDS 会更快。
4) 注意你的 L1/L2 缓存大小。一般来说,ARM 芯片的缓存比英特尔小得多。
5) 尽可能使用 SIMD (NEON)。 NEON 指令非常强大,对于“矢量化”代码,可以非常快。 NEON 内部函数在大多数 C++ 环境中都可用,其速度几乎与编写手动调整的 ASM 代码一样快。
6)使用缓存预取提示(PLD)来加速循环读取。 ARM 没有现代英特尔芯片那样的智能预缓存逻辑。
7) 不要相信编译器会生成好的代码。查看 ASM 输出并重写 ASM 中的热点。对于位/字节操作,C 语言不能像在 ASM 中那样有效地指定事物。 ARM 具有强大的 3 操作数指令、多重加载/存储和“自由”移位,其性能优于编译器生成的能力。
关于ARM 设备上代码优化的 C++ 技巧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10800372/