我正在尝试优化C代码的关键部分,以便在ARM设备中进行图像处理,最近发现了NEON。
在这里和那里阅读提示,我得到了相当不错的结果,但有些东西让我感到厌烦。我发现整体性能在很大程度上取决于内存访问及其完成方式。
这是最简单的方法(简单来说,我的意思是,如果可能的话,不必在模拟器或模拟器中运行整个编译的代码,而是可以提供小块组件并分析它们的东西),以便了解内存访问如何“阻碍”子程序?
我知道如果不在特定的硬件和特定条件下运行它,就无法做到这一点,但目的是使用“比较”试错工具进行试验,即使结果只是近似值。 / p>
(与this类似的循环计数工具)
答案 0 :(得分:2)
我想你可能已经回答了自己的问题。内存是系统级别的影响,许多ARM实施者(Apple,Samsung,Qualcomm等)以不同的结果实现系统。
然而,当然你可以为某个系统优化事物,它可能在其他系统上运行良好,所以实际上它归结为找出一种可以快速迭代并测试/模拟系统级效果的方法。这确实很复杂,因此您可能需要为系统级仿真器支付一些费用,例如ARM的RealView中包含的仿真器。或者我可能会建议使用像熊猫板这样的开源硬件并使用valgrind的缓存研磨。使用Linux上的熊猫板,您可以编写一些脚本来自动化测试。
要实现这一目标可能会很麻烦,但如果针对ARM的优化将成为您职业生涯的一部分,那么它(与您的薪水相比相对较低)的软件/硬件投资和时间是值得的。
注1:我建议不要使用PLD。这是非常依赖于系统调优的,如果你在一个ARM实现上运行良好,它可能会伤害你下一代芯片或不同的实现。这可能是一个提示,尝试在系统级别进行优化,除了一些基本的数据本地化和订购之外的东西可能不值得你努力? (见下面斯蒂芬的评论)。
答案 1 :(得分:2)
内存访问只是无法从“小块组件”建模以生成有意义的指导。缓存层次结构,存储缓冲区,加载错过队列,缓存策略等...甚至相对简单处理器在LSU下隐藏着大量的“状态”,任何小规模的分析都无法准确捕获该状态。也就是说,有一些基本的指导方针可以获得最佳性能:
vld1
和vst1
指令(带有对齐提示)。在大多数微架构上,在大多数情况下,它们是在NEON和内存之间移动的最快方式。特别是逃避v[ld|st][3|4]
;在大多数情况下,这些都是一种极具吸引力的麻烦,比在大多数微架构上单独进行分配要慢。