ARM Neon Assembler - 奇怪的管道问题

时间:2012-03-15 16:37:32

标签: android assembly android-ndk arm neon

我正在尝试使用Neon指令提高在ARM Assembler中编写的代码的性能。

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

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

另外,我需要一些一般信息来了解如何提高ARM / Neon汇编程序的性能。

Target是ARM Cortex-A9。 为了编译,我使用最新的android-ndk和内联汇编程序。谢谢。

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

当NEON正在执行其工作时,您不应通过ARM访问内存。它会对NEON造成全面制动。

显然,你正在尝试某种并行处理,因为上面的原因是毁灭性的。

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

我建议你首先在C中完全重写你的代码,只有32位内存访问,然后评估它是否适用于NEON,

答案 2 :(得分:2)

实际上这有点复杂。 BitBank是对的,NEON必须等待D4。

但是你必须等待10个周期,因为Neon有一个加载/存储队列。

之前,队列中充满了其他指令
vld1.64 d4, [r7, :64]

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