2013-04-04 253 views
2

正如我們在這裏看到的「arm integer NEON operations cycles」和手臂浮動NEON運算週期一樣,整數乘法運算似乎沒有浮點乘法運算的確定優勢。當我將浮點代碼轉換爲固定點時,我必須在定點乘法/除法指令後添加額外的「移位」指令。由於指令的增加,程序所需的週期實際上增加了。由於固定點,我的計劃表現惡化。 (浮點代碼14000週期,定點代碼26000週期)。NEON固定點編碼和固定浮點運算性能比較

是否有專門的NEON指令專門用於定點操作(乘法和除法)?我只找到一條只是轉換Fixed -float的指令。 在NEON中編寫定點程序是否有效?

我爲浮點代碼編寫了下面的示例代碼。

VMUL Q14.F32,Q8.F32,Q2.F32 
    VMUL Q15.F32,Q8.F32,Q3.F32 
    VLD2 {Q10.F32,Q11.F32},[[email protected]],TwdStep 
    VLD2 {Q4.F32,Q5.F32},[[email protected]],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},[[email protected]],TwdStep 
    VLD2 {Q4.S32,Q5.S32},[[email protected]],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

這些天定點通常只使在其上浮點挑戰的CPU,如低端微控制器感,並在具有明確固定點支撐的CPU(各種DSP家庭,一些SIMD架構) 。否則,只需使用浮點。 – 2013-04-04 16:23:56

+0

如果可能,您可以通過組合管道獲得優勢。你正在使用32位值還是SIMD正在進行?只有普通的ARM有'MLA','MUL'等,它們在32位值上執行。您可以在NEON核心中執行一次浮點計算,並使用ARM進行另一次修正。 – 2013-04-04 18:20:26

+0

@artlessnoise我只是想看看NEON的功能。做並行真的有幫助! – Wolfrum 2013-04-05 04:32:14

回答

2

了一套NEON說明,請參閱Vector Floating Point Instruction Set Quick Reference Card。沒有專門的定點指令。

我建議你閱讀blog.arm.com後標題Coding for NEON - Part 3: Matrix Multiplication/定點,它可能給你一些想法去嘗試的事情。

它聲稱:

使用定點算術對計算往往快於浮點 - 它需要較少的存儲器帶寬來讀取和寫入使用更少的比特值,以及整數值的乘法通常是比應用於浮點數的操作更快。

但是,使用定點算術時,必須仔細選擇表示以避免溢出或飽和,同時保持應用程序需要的結果的精確度。

+0

在上面指出的例子中,「使用更少的位」非常重要,該示例使用32位作爲浮點,而使用16位作爲固定點。在我的情況下,我使用32位浮點和定點。 – Wolfrum 2013-04-05 08:44:29

+0

@Wolfrum好東西或壞東西?投票還是投票? – auselen 2013-04-08 08:27:33