关于 ARM NEON 周期的一些疑问
Posted
技术标签:
【中文标题】关于 ARM NEON 周期的一些疑问【英文标题】:some doubts regarding cycles of ARM NEON 【发布时间】:2014-06-13 06:33:22 【问题描述】:我在汇编中编写了一些霓虹灯代码,旨在最大限度地优化。尽管由于寄存器冲突和流水线导致的延迟减少了,但它只显示了 1 个周期差异,即在 n.70-0 之前,在 n.69-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. count Time 是指执行代码的总时间吗? 希望有人能帮助我解决这些疑问....
【问题讨论】:
您可以通过google translator 运行网页,底部的图例试图像亚历山德罗那样解释事情。 谢谢。其实我也试过谷歌翻译,但他没有解释这些事情。因此,只有我通过 *** 接近。 【参考方案1】:这是我对这个循环计数器的记忆:
“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 不能执行任何指令。
此外,我不会将这种类型的计数器用于带有循环的代码。我建议您将代码拆分为不同的部分并分别优化每个循环。
【讨论】:
a.22-0 2c VMLA.I16 q6、q10、D0[3]。你说'a'代表手臂,但上面的说明指的是霓虹灯而不是手臂,那么'a'如何?? 感谢您的回复。你知道为什么pulsar.webshaker.net 站点不支持 VMOV.I8 D0,#8(将立即值移动到霓虹灯寄存器)吗?以上是关于关于 ARM NEON 周期的一些疑问的主要内容,如果未能解决你的问题,请参考以下文章