手撕Arm NEON 彙編 (引入)

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語言裏的對應算法。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章