3

我正在尝试使用 Neon 指令提高用 ARM 汇编程序编写的一段代码的性能。

对于测试和计算,我使用这个计算器: http: //pulsar.webshaker.net/ccc/sample-706454b3

我注意到在“n.34-0 1c n0”行突然霓虹灯单元似乎必须等待(?)10个周期。这可能是什么原因,或者它只是计算器中的一个错误?

我还需要一些关于如何提高 ARM/Neon Assembler 性能的一般信息。

目标是 ARM Cortex-A9。对于编译,我使用带有内联汇编程序的最新 android-ndk。谢谢你。

4

3 回答 3

3

NEON 单元必须在该指令处等待,因为您正在引用在前一个 NEON 指令 (n.33-0 1c n0) 中加载的寄存器 (D4)。加载不是瞬时的,并且由于流水线,即使数据来自缓存,数据的可用性也会有所延迟。您需要重新排序 ARM 和 NEON 指令,以免在加载寄存器后立即尝试使用它们,否则最终会浪费周期(流水线停顿)。

于 2012-03-15T16:45:38.903 回答
2

事实上,这有点复杂。BitBank 是对的,NEON 要等 D4。

但是你必须等待 10 个周期,因为 Neon 有一个加载/存储队列。并且队列之前被其他指令填充

vld1.64 d4, [r7, :64]

因此,当您需要 D4 时,您必须等待该指令的执行,但要执行该指令,您必须执行所有之前推入 NEON 加载/存储队列的加载/存储指令。

于 2012-03-19T08:58:43.493 回答
2

在 NEON 工作时,您不应该通过 ARM 访问内存。它会导致 NEON 完全制动。

显然,由于上述原因,您正在尝试某种具有破坏性的并行处理。

此外,ldrb 太多了。ARM 上的字节访问也几乎是一种罪过。

我建议您首先用 C 完全重写您的代码,仅使用 32 位内存访问,然后评估它是否完全适用于 NEON,

于 2012-03-18T08:27:31.750 回答