18

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

1-避免高成本指令:除法、平方根、sin、cos

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

2-优化内部“for”循环:它们是一个瓶颈,所以我们应该避免在内部进行很多计算,尤其是除法、平方根。

3-对一些数学函数(sin、cos、...)使用查找表

有用的工具

  • objdump:获取已编译程序的汇编代码。这允许比较两个函数并检查它是否真的被优化。
4

2 回答 2

19

为了回答您在为 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 操作数指令、多重加载/存储和“自由”移位,其性能优于编译器能够生成的内容。

于 2012-05-29T16:27:18.810 回答
17

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

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

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

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

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

于 2012-05-29T13:44:03.397 回答