关于ARM NEON循环的一些疑问

时间:2014-06-13 06:33:22

标签: arm inline-assembly simd neon cortex-a8

我在汇编中写了一些霓虹灯代码,目的是最大限度地优化。尽管由于寄存器冲突和流水线引起的延迟减少,但它仅显示出1个周期差异,即在n.69-0之后的n.70-0之前。为什么它表现得像我不明白。 这是我的示例代码

优化前的

http://pulsar.webshaker.net/ccc/sample-6b7ba7c2 优化后http://pulsar.webshaker.net/ccc/sample-d59091b4

我对脉冲星计算器有很多怀疑。 1. n.16-0 1c d0:1 这里n代表什么? 2. a.23-0 2c q6l:1 VMLA.I16 q6,q9,D0 [2] 什么代表什么? l:1表示? 23是周期数? 3.计数时间是指执行代码的总时间吗? 希望有人能帮助我解决这些疑惑......

1 个答案:

答案 0 :(得分:0)

这是我对这个循环计数器的记忆:

“n”代表Neon管道,“a”代表ARM管道。实际上,您正在混合使用ARM和NEON指令。

关于“q6l:1”:q6l是导致当前指令等待的寄存器,而1是该寄存器/结果变为可用于指令所需的额外半周期数,因此是半周期指令必须等待他的输入。我不确定,但我认为“q6l”是q6寄存器的下半部分。

示例中的数字“23”是指令可以开始执行的周期数。

计算时间与您的代码无关。解析时间是工具解释您提供的指令所花费的时间。计数时间是工具分析指令并提供循环信息所花费的时间。

我会解释更多结果,例如:

n.18-0   1c n0 q10:8

“n”代表执行单位(n = neon,a = arm,v = vfp)。

“18”是指令可以开始执行的周期数。

“0”是管道的编号。

“1c”是指令的执行周期数。请注意,这与指令结果可用于进一步指示所需的周期数不同。

“n0”是导致当前指令等待结果的管道。 n0 =氖管道编号0。

“q10”是导致指令等待结果的寄存器。

“8”与指令必须等待结果的时间有关。如果我没记错的话,这是半周期的数量。

此计数器不考虑编译器可以重新排列指令的事实,即推迟等待结果的指令。但是如果你强制你的编译器没有重新安排汇编指令,当一条指令必须等待结果时,没有其他指令可以开始执行,即使它们不必等待结果,因此这会导致执行停顿,其中CPU无法执行任何指令。

此外,我不会将这种类型的计数器用于带循环的代码。我建议你将代码分成不同的部分并分别优化每个循环。