C++;ARM设备上的代码优化提示 我已经开发了用于ARM设备上的增强现实的C++代码,并且代码的优化是非常重要的。 保持良好的帧速率。为了将效率提高到最高水平,我认为收集以下一般提示非常重要: 使编译器的工作更轻松,并减少程序的循环数。欢迎任何建议

C++;ARM设备上的代码优化提示 我已经开发了用于ARM设备上的增强现实的C++代码,并且代码的优化是非常重要的。 保持良好的帧速率。为了将效率提高到最高水平,我认为收集以下一般提示非常重要: 使编译器的工作更轻松,并减少程序的循环数。欢迎任何建议,c++,optimization,arm,C++,Optimization,Arm,1-避免高成本指令:除法、平方根、正弦、余弦 使用逻辑移位除以或乘以2 如果可能的话,乘以倒数 2-优化内部“for”循环:它们是一个双向循环,因此我们应该避免在内部进行许多计算,特别是除法、平方根 3-对某些数学函数(sin,cos,…)使用查找表 有用的工具 objdump:获取已编译程序的汇编代码。这允许比较两个函数,并检查它是否真正优化 优化应用程序的最佳方法是使用好的探查器。在编写代码时考虑效率总是一个好主意,但您也希望避免在“认为”代码可能很慢的地方进行更改,如果您不能100%

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

  • 使用逻辑移位除以或乘以2
  • 如果可能的话,乘以倒数
2-优化内部“for”循环:它们是一个双向循环,因此我们应该避免在内部进行许多计算,特别是除法、平方根

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

有用的工具

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

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

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

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

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


      <>我最近问了这个类似的问题,并得到了一些好的回答:

      p>在优化ARM C++代码时回答你的一般规则问题,这里有一些建议:

      1) 正如你提到的,没有除法指令。尽可能使用逻辑移位或乘反运算。
      2) 内存比CPU执行慢得多;使用逻辑操作避免小的查找表。
      3) 尝试一次写入32位,以充分利用写入缓冲区。写短字符或字符会大大降低代码的速度。换言之,将逻辑或较小的位组合在一起并将它们作为DWORD写入会更快。
      4) 请注意一级/二级缓存的大小。一般来说,ARM芯片的缓存比Intel小得多。
      5) 尽可能使用SIMD(霓虹灯)。霓虹灯指令非常强大,对于“矢量化”代码来说,可以非常快。氖本质在大多数C++环境中是可用的,并且几乎可以和编写手动调谐的ASM代码一样快。 6) 使用缓存预取提示(PLD)加快循环读取。ARM没有现代英特尔芯片那样的智能预切逻辑。

      7) 不要相信编译器会生成好的代码。查看ASM输出并重写ASM中的热点。对于位/字节操作,C语言不能像在ASM中那样高效地指定内容。ARM具有强大的3操作数指令、多加载/存储和“自由”移位,其性能优于编译器所能生成的指令。

      注意:现在的瓶颈往往是内存(因此LUT不是很好……)。诚然,这可能在手臂上有所不同,但是。。。你有没有可能检查不同的指标,比如缓存未命中、内存总线访问等?了解mem总线是否是瓶颈也是非常有帮助的。顺便说一句,离题,(多诺西亚=圣塞巴斯蒂安)?如果是这样,我真的很喜欢那个城市!ja_Rock:Matthieu说要先做个人简介。由于内存通常是一个瓶颈,查找表有时比计算内存慢。@Jav_Rock:的确,如果你在为一个乘法器慢、CPU速度与总线速度相似的古老处理器进行优化,那么查找表就是一个胜利。在具有快速乘法器和相对较慢总线的现代处理器上,速度可能较慢。因此,分析并确保它实际上是一种改进是非常重要的。这里有一个有趣的反论点,用于对简单数学函数(sin,cos)使用查找表,至少如果使用定点类型是有意义的话:-作者提供了sin的C和手工编码汇编程序版本,比较不同版本的精度和平均周期。我喜欢用逆移位和逻辑移位相乘。我还尝试在没有霓虹灯的设备上使用定点。我会用你的提示更新帖子,谢谢!关于5):我已经看到很多关于使用NEON本质的讨论。总而言之,似乎很多人都发现编译器在将内部函数转换为良好的汇编代码方面做得不是很好。大家一致认为,如果您想使用NEON,最好直接将其作为汇编代码编写。@Leo-这取决于编译器。GCC在编译NEON内部函数方面非常糟糕。苹果的LLVM一般,微软的编译器也相当不错。啊,很高兴知道。我大部分时间都在使用GCC。你知道ARMs自己的编译器(ADS/RVCT)的运行情况吗?我认为它们会很好,但如果没有测试就很难知道。我没有使用ARM编译器,但我认为它们很好。如果ARM自己的工具产生不好的输出,那将是相当尴尬的。