C++ ARM 设备上代码优化的提示

C++ Tips for code optimization on ARM devices

本文关键字:代码优化 提示 ARM C++      更新时间:2023-10-16

我一直在为ARM设备上的增强现实开发C++代码,代码的优化非常重要,以便保持良好的帧速率。为了将效率提高到最大水平,我认为收集以下一般提示很重要:使编译器的生活更轻松,并减少程序的数量。欢迎任何建议。

1-避免高成本指令:除法,平方根,正弦,cos

  • 使用逻辑移位除以或乘以 2。
  • 尽可能乘以相反。

2-优化内部"for"循环:它们是Botleneck,因此我们应该避免在内部进行许多计算,尤其是除法,平方根。

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 操作数指令、多加载/存储和"自由"移位,其性能优于编译器能够生成的指令。

优化应用程序的最佳方法是使用良好的探查器。编写代码时考虑效率总是一个好主意,但你也希望避免在你"认为"代码可能很慢的地方进行更改,如果你不是 100% 确定,这可能会让事情变得更糟。

找出瓶颈在哪里并专注于这些瓶颈。

对我来说,分析是一个迭代过程,因为通常当你修复一个瓶颈时,其他不太重要的瓶颈就会显现出来。

除了分析软件之外,还要检查可用的硬件分析类型。检查您是否可以获得不同的硬件指标,例如缓存未命中、内存总线访问等。这对于了解您的mem总线或缓存是否是瓶颈也非常有帮助。

我最近问了这个类似的问题,并得到了一些很好的答案: 寻找一个低影响的c ++分析器