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

Jav*_*ock 17 c++ optimization arm

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

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

  • 使用逻辑移位除以2或乘以2.
  • 尽可能乘以逆.

2-优化内部"for"循环:它们是一个botleneck,所以我们应该避免在里面进行很多计算,特别是划分,平方根.

3-使用查找表来查找某些数学函数(sin,cos,...)

有用的工具

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

Bit*_*ank 17

要在优化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操作数指令,多重加载/存储和"自由"移位,可以胜过编译器能够生成的内容.


Bra*_*ady 15

优化应用程序的最佳方法是使用优秀的分析器.编写考虑效率的代码总是一个好主意,但是你也想避免在"认为"代码可能很慢的情况下进行更改,如果你不是100%肯定的话,这可能会使事情变得更糟.

找出瓶颈所在并关注这些瓶颈.

对我来说,分析是一个迭代过程,因为通常当你修复一个瓶颈时,其他不那么重要的东西会表现出来.

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

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