ARM NEON:由于内存访问限制带宽而预测性能问题的工具?

时间:2014-02-11 12:04:42

标签: performance assembly arm neon cortex-a8

我正在尝试优化C代码的关键部分,以便在ARM设备中进行图像处理,最近发现了NEON。

在这里和那里阅读提示,我得到了相当不错的结果,但有些东西让我感到厌烦。我发现整体性能在很大程度上取决于内存访问及其完成方式。

这是最简单的方法(简单来说,我的意思是,如果可能的话,不必在模拟器或模拟器中运行整个编译的代码,而是可以提供小块组件并分析它们的东西),以便了解内存访问如何“阻碍”子程序?

我知道如果不在特定的硬件和特定条件下运行它,就无法做到这一点,但目的是使用“比较”试错工具进行试验,即使结果只是近似值。 / p>

(与this类似的循环计数工具)

2 个答案:

答案 0 :(得分:2)

我想你可能已经回答了自己的问题。内存是系统级别的影响,许多ARM实施者(Apple,Samsung,Qualcomm等)以不同的结果实现系统。

然而,当然你可以为某个系统优化事物,它可能在其他系统上运行良好,所以实际上它归结为找出一种可以快速迭代并测试/模拟系统级效果的方法。这确实很复杂,因此您可能需要为系统级仿真器支付一些费用,例如ARM的RealView中包含的仿真器。或者我可能会建议使用像熊猫板这样的开源硬件并使用valgrind的缓存研磨。使用Linux上的熊猫板,您可以编写一些脚本来自动化测试。

要实现这一目标可能会很麻烦,但如果针对ARM的优化将成为您职业生涯的一部分,那么它(与您的薪水相比相对较低)的软件/硬件投资和时间是值得的。

注1:我建议不要使用PLD。这是非常依赖于系统调优的,如果你在一个ARM实现上运行良好,它可能会伤害你下一代芯片或不同的实现。这可能是一个提示,尝试在系统级别进行优化,除了一些基本的数据本地化和订购之外的东西可能不值得你努力? (见下面斯蒂芬的评论)。

答案 1 :(得分:2)

内存访问只是无法从“小块组件”建模以生成有意义的指导。缓存层次结构,存储缓冲区,加载错过队列,缓存策略等...甚至相对简单处理器在LSU下隐藏着大量的“状态”,任何小规模的分析都无法准确捕获该状态。也就是说,有一些基本的指导方针可以获得最佳性能:

  • 最大化“有用计算”指令与LSU操作的比率。
  • 对齐您的内存访问(最好是16B)。
  • 如果您需要在对齐货物或对齐商店之间进行选择,请调整商店。
  • 尝试尽可能写出完整的缓存行。
  • PLD主要用于非均匀但不知何故仍然可预测的内存访问模式(这些很少见)。
  • 对于NEON,您应该更喜欢使用vld1vst1指令(带有对齐提示)。在大多数微架构上,在大多数情况下,它们是在NEON和内存之间移动的最快方式。特别是逃避v[ld|st][3|4];在大多数情况下,这些都是一种极具吸引力的麻烦,比在大多数微架构上单独进行分配要慢。