C++ ARM 设备上代码优化的提示
C++ Tips for code optimization on ARM devices
我一直在为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 ++分析器
- C和C 中的代码优化
- 使用清理代码优化多个出口点
- 在 c++ 中从 txt 文件中提取条目的代码优化问题
- 为什么传递值参数经常使编译器更容易进行代码优化
- 来自MATLAB的代码优化直方图C
- C - 代码优化
- 代码优化子集总和
- 在代码优化过程中,C++11编译器是否会在可能的情况下将局部变量转换为右值
- C++-筛选Atkin代码优化
- 协议缓冲区 GetRepeatedField (反射) 代码优化
- C++代码优化
- 编译和代码优化
- C++ ARM 设备上代码优化的提示
- 我是否应该将 const 用于局部变量以获得更好的代码优化
- 用于并行计算的C++代码优化示例
- gcc/C++:如果CPU负载很低,那么代码优化用处不大,这是真的
- 反转每个单词在一个句子中使用c++需要代码优化我的代码片段
- 是我的编译器将适当的代码优化为无用的崩溃代码
- Arduino代码优化的多路复用LED矩阵
- 在代码优化中使用new运算符是否值得?