ARM汇编优化技巧
1.?加減法,邏輯操作占一個周期,目的地址是PC寄存器時增加一個周期。分支指令占3個周期。在cache命中的情況下,16位和8位的裝載指令(LDRH、LDRH等)占一個周期,但緊跟的2個周期不能使用裝入的數據。32位裝載指令占一個周期,緊跟的一個周期不能使用裝載數據。如果裝載入PC,同樣要增加2個周期。
???????????? LDR????r1,[r2]??????? ADD? r1,r1,r3???????ADD? r4,r4,r5??? 占4個周期
改變次序后
???????????? LDR????r1,[r2]??????? ADD? r4,r4,r5????????ADD? r1,r1,r3????占3個周期
2. load指令占時間比較長,在循環中可以使用預載的方法將load與跳轉指令放在一起,減少流水線的斷流。
例如:
loop
??? LDRB?? r2,[r1]
???? ...............???????????//do
????B????????????loop
更改為
?? LDRB?? r2,[r1]
loop
??? ..............??????????? //do
??? LDRB?? r2,[r1]
??? B????????? loop
3. 循環展開時,可以在計算i步時就加載i+1步的數據,在i步的結果還沒準備好時執行i+1步計算。
4. ARM只有16個可見寄存器,其中14個通用寄存器,1個堆棧指針r13,1個程序計數器r15。在圖像處理的應用中很多是8位的操作數,可以利用32為寄存器一次進行兩組運算。
例如:加操作????? 100 + 50??? 和?????? 2 + 3
????位???????????????????? 24??????????????? 16?????????????? 8???????????????? 0
????操作數1?????????? 0??????????????? 100????????????? 0???????????????? 2
??? 操作數2?????????? 0???????????????? 50??????????????? 0??????????????? 3
??? 結果?????????????????0???????????????? 150????????????? 0??????????????? 5
5. 寄存器數量不夠時,可用32為寄存器保存兩個16位變量和4個8位變量。
總結
- 上一篇: 普通卷积armv7-neon指令集实现—
- 下一篇: 盒子滤波/均值滤波NEON优化