我一直在为ARM设备开发增强现实的C ++代码,并且为了优化代码非常重要 保持良好的帧速率。为了将效率提升到最高水平,我认为收集一般提示非常重要 使编译器的生活更轻松,减少程序的数量。欢迎提出任何建议。
1- 避免高成本指示:除法,平方根,罪,cos
2-优化内部“为”循环:它们是一个botleneck所以我们应该避免在里面进行很多计算,特别是划分,平方根......
3-使用查找表查看某些数学函数(sin,cos,...)
有用的工具
答案 0 :(得分: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操作数指令,多重加载/存储和“自由”移位,可以胜过编译器能够生成的内容。
答案 1 :(得分:15)
优化应用程序的最佳方法是使用优秀的分析器。编写关于效率的代码总是一个好主意,但是你也想避免在“认为”代码可能很慢的情况下进行更改,如果你不是100%肯定的话,这可能会使事情变得更糟。
找出瓶颈所在并关注这些瓶颈。
对我来说,分析是一个迭代过程,因为通常当你修复一个瓶颈时,其他不那么重要的东西会表现出来。
除了分析SW外,还要检查哪种类型的HW分析可用。检查是否可以获得不同的硬件指标,如缓存未命中,内存总线访问等。这对于了解您的内存总线或缓存是否是瓶颈也非常有用。
我最近问了这个类似的问题并得到了一些好的答案:Looking for a low impact c++ profiler