ARM NEON 提供了數據級別的並行運算,對於數據密集型的重複運算,如音視頻編解碼,ARM NEON可以實現數據運算的並行,加速效果還是很明顯的。
但是,不得不承認,彙編難下手,開發過程緩慢(fresher),不易調試及驗證。
所以寫彙編從入手到完美的完成彙編優化任務,具體步驟分爲以下幾個方面:
1、熟悉算法及指令
2、搭建環境寫個a+b
3、正確性驗證
4、如何優化及分析
手撕底層彙編而非使用在C代碼裏內嵌 arm neon intrinsics 的原因是:可以顯得自己很厲害哈哈哈哈
真實原因:
底層彙編可以直接控制使用的寄存器,能大幅度消除寄存器之間的數據依賴。另外,可以嚴格的控制循環及數據並行度,去除不必要的冗餘操作。
常用的彙編指令分爲(自己憑感覺分的):
從內存裏讀數據 取數據的指令
加減乘除位移的那些指令
位操作的那些指令
針對多媒體運算會有轉置呀,截取數據呀一些指令
NEON可以實現數據並行是因爲其對向量寄存器進行運算
如 計算四次加法,C語言裏:
for (int i = 0; i < 4; i++) { d[i] = a[i] + b[i]; }
arm可以用一條指令完成:
vadd.i16 d0, d1, d2
所以要做的就是:如何用已有的指令,使用有限的寄存器,最大程度的挖掘數據並行度(SIMD),實現C語言裏的對應算法。