我寫的臂組件的代碼,我想裝載兩個32位的數據到寄存器的速度,有兩個指令,我可以使用,臂組件LDM和LDR
1. ldm r0, {r1, r2}
2. ldr r1, [r0]!
ldr r2, [r0]
我想要知道哪一個更快?
我寫的臂組件的代碼,我想裝載兩個32位的數據到寄存器的速度,有兩個指令,我可以使用,臂組件LDM和LDR
1. ldm r0, {r1, r2}
2. ldr r1, [r0]!
ldr r2, [r0]
我想要知道哪一個更快?
指令週期時序根據架構略有不同。
當加載兩個或更多寄存器時,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]
好的,我覺得這個解釋了很多,非常感謝。 –
一些錯誤,只要做到1E9負荷的循環和比較。但它也將取決於內存(緩存)等 – dbrank0
可能重複[對於ARM,爲什麼單個STM指令通常比多個STR指令快?](http://stackoverflow.com/questions/15500308/for- arm-why-a-single-stm-instruction-is-general-faster-multiple-str-inst) –
所有的信息都在'STM' vs'STR'與'LDM' versur'LDR'相同。主要的是,你只需少一條指令即可完成相同的代碼。 'ldrd'更加靈活地處理內存,但是具有寄存器限制。您可以使用r0,r1或r2,r3等。例如,不能使用r1,r2。 –