2013-11-25 51 views
1

我寫的臂組件的代碼,我想裝載兩個32位的數據到寄存器的速度,有兩個指令,我可以使用,臂組件LDM和LDR

1. ldm    r0, {r1, r2}  
2. ldr    r1, [r0]! 
    ldr    r2, [r0] 

我想要知道哪一個更快

+0

一些錯誤,只要做到1E9負荷的循環和比較。但它也將取決於內存(緩存)等 – dbrank0

+0

可能重複[對於ARM,爲什麼單個STM指令通常比多個STR指令快?](http://stackoverflow.com/questions/15500308/for- arm-why-a-single-stm-instruction-is-general-faster-multiple-str-inst) –

+0

所有的信息都在'STM' vs'STR'與'LDM' versur'LDR'相同。主要的是,你只需少一條指令即可完成相同的代碼。 'ldrd'更加靈活地處理內存,但是具有寄存器限制。您可以使用r0,r1或r2,r3等。例如,不能使用r1,r2。 –

回答

0

指令週期時序根據架構略有不同。

當加載兩個或更多寄存器時,ldm在理論上更快,只需計算週期數。但它有關係嗎?幾乎沒有,因爲大多數週期都由於緩存缺失懲罰而被浪費了。根據緩存行對齊地址是非常重要的。

這不是性能,但可能是縮小的代碼大小是有益的。

總結一下,當他們沒有削弱你的算法/實現時,儘量利用ldm/stm。

如果您想盡快訪問內存,無論成本如何,ldrd/strd都是最好的選擇。

什麼是「成本」?八個PLUS連續兩個寄存器的內存對齊方式。

這是你的電話。

PS:ldm/stm-like指令在Aarch64上已棄用 - 出於很好的理由,ldrd/strd等價的指令不含上述「成本」。

PS2:有你的問題

1. ldm    r0, {r1, r2}  
2. ldr    r1, [r0] 
    ldr    r2, [r0, #4] 
+0

好的,我覺得這個解釋了很多,非常感謝。 –