正如我们在这里看到的那样“arm integer NEON operations cycles”和arm浮动NEON运算周期,整数乘法运算似乎没有比浮点乘法运算更明确的优势。当我将浮点代码转换为定点时,我必须在定点乘法/除法指令之后添加额外的“移位”指令。由于指令的增加,程序所需的周期实际上增加了。由于固定点,我的程序性能恶化。 (浮点代码为14000个循环,定点代码为26000个循环)。
NEON是否有专门针对定点操作(乘法和除法)的特殊指令?我只发现了一条只转换Fixed -float的指令。 有没有有效的方法在NEON中编写定点程序?
我为浮点代码编写了以下示例代码。
VMUL Q14.F32,Q8.F32,Q2.F32
VMUL Q15.F32,Q8.F32,Q3.F32
VLD2 {Q10.F32,Q11.F32},[pTw2@256],TwdStep
VLD2 {Q4.F32,Q5.F32},[pT1@256],fftSize
VMLA Q14.F32,Q9.F32,Q3.F32
VMLS Q15.F32,Q9.F32,Q2.F32
通过在VMUL A指令之后插入移位操作,将以下代码转换为定点代码。
VMUL Q14.S32,Q8.S32,Q2.S32
VMUL Q15.S32,Q8.S32,Q3.S32
VLD2 {Q10.S32,Q11.S32},[pTw2@256],TwdStep
VLD2 {Q4.S32,Q5.S32},[pT1@256],fftSize
VMLA Q14.S32,Q9.S32,Q3.S32
VMLS Q15.S32,Q9.S32,Q2.S32
VRSHR Q14.S32,Q14.S32,#12 ;Shift instructions to account for fixed point
VRSHR Q15.S32,Q15.S32,#12 ;
答案 0 :(得分:2)
请参阅Vector Floating Point Instruction Set Quick Reference Card了解NEON
条指令集。没有专门的定点指令。
我建议你阅读标题为Coding for NEON - Part 3: Matrix Multiplication / 固定点的blog.arm.com
帖子,它可能会给你一些尝试的想法。
声称:
使用定点算法进行计算通常比浮点更快 - 读取和写入使用更少位的值需要更少的内存带宽,并且整数值的乘法通常比应用于浮点数的操作更快。 / p>
但是,使用定点运算时,必须仔细选择表示以避免溢出或饱和,同时保持应用程序所需结果的精度。