ARM 设备上代码优化的 C++ 技巧

标签 c++ optimization arm

我一直在为 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/

相关文章:

c++ - TensorFlow protobuf 版本不匹配

python - numpy.poly1d ,寻根优化,在 x 轴上移动多项式

linux - 使用 expect 时收到垃圾字符

assembly - ARM Cortex-M0 上的周期计数不稳定

c++ - OpenGL 纹理不

c++ - 关于模板代码组织 : where to put code that a template uses

c++ - 使用隐式转换模拟 C++ 函数模板实例化

scala - 在 Scala 中使用类型类模式对性能有什么影响

java - 使用 Java 8 流处理嵌套集合

android - 在没有 Android 框架的情况下创建 Android 应用程序