【发布时间】:2014-02-11 12:04:41
【问题描述】:
我正在尝试优化 C 代码的关键部分以在 ARM 设备中进行图像处理,最近发现了 NEON。
在这里和那里阅读了提示,我得到了相当不错的结果,但有些东西让我无法理解。我发现整体性能在很大程度上取决于内存访问及其完成方式。
这是最简单的方法(简单我的意思是,如果可能的话,不必在模拟器或模拟器中运行整个编译的代码,而是可以提供小块汇编并分析它们的东西),以便了解内存访问如何“瓶颈”子程序?
我知道如果不在特定硬件和特定条件下运行它就无法完全做到这一点,但目的是有一个“比较”试错工具来进行试验,即使结果只是近似值。
(类似于this 循环盘点的好工具)
【问题讨论】:
-
不幸的是,每个系统的内存都有不同的周期。为了进行适当的分析,您需要准确的时间。对于 DDR SDRAM,这可能非常复杂,因为页面内的突发、跨存储区、读取后写入等具有不同的时序。为了减少对硬件的依赖(或者甚至是分配器放置东西的地方),您需要您的算法在使用前将数据传输到 L2 或 L1。
-
谢谢!我本来是这样想的。但决定问,因为我不需要确切的时间,只是想在 ARM-NEON 平台上测试它们之前给我一些“提示”关于某些更改是否可以受益或“杀死”我的子例程,但我想它仍然是一般的。顺便说一句,当您说将数据传输到 L2 或 L1 时,您的意思是使用预加载 (PLD) 吗?如果还有更多,请问在哪里可以找到?
-
是的,
PLD是执行此操作的正常方式。参见Cortex-A8 Neon color conversion 等。大多数ARM 文档都说PLD就像不等待完成的虚假内存访问。当 CPU 执行其他操作时,它只会在后台为该地址填充 L1 和 L2 行。这些线的大小可以根据特定的芯片而有所不同。有一些方法可以动态查找,但大多数人会针对特定系统对其进行硬编码以简化汇编程序。 -
一些 ARM 有一个
PLD作为NOP,就像 ARM926。所以对于它来说,PLD只是指令污染。memcpy()for the cortex-A8 上的 ARM 引用,它将PLD限制为 L2 大小。我想 L1 未命中并没有那么昂贵。请注意,它们提前预取。您的算法将受 CPU 或内存限制。知道内存带宽可以告诉你是哪一个。知道 零周期 代码时序会限制 CPU。两者都知道,你应该知道该在哪一边工作。 -
谢谢,memcpy 链接非常有趣!写作部分有什么建议吗?
标签: performance assembly arm neon cortex-a8