我在汇编中写了一些霓虹灯代码,目的是最大限度地优化。尽管由于寄存器冲突和流水线引起的延迟减少,但它仅显示出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.计数时间是指执行代码的总时间吗? 希望有人能帮助我解决这些疑惑......
答案 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无法执行任何指令。
此外,我不会将这种类型的计数器用于带循环的代码。我建议你将代码分成不同的部分并分别优化每个循环。