NEON加速
NEON加速
NEON 技術(shù)是 ARM Cortex?-A 系列處理器的 128 位 SIMD(單指令,多數(shù)據(jù))架構(gòu)擴(kuò)展,旨在為消費(fèi)性多媒體應(yīng)用程序提供靈活、強(qiáng)大的加速功能,從而顯著改善用戶體驗(yàn)。它具有 32 個(gè)寄存器,64 位寬(雙倍視圖為 16 個(gè)寄存器,128 位寬。)
目前主流的iPhone手機(jī)和大部分android手機(jī)都支持ARM NEON加速,因此在編寫(xiě)移動(dòng)端算法時(shí),可利用NEON技術(shù)進(jìn)行算法加速,以長(zhǎng)度為4的寄存器大小為例,相應(yīng)的提速倍數(shù)約是原始的4倍。
NEON 指令可執(zhí)行“打包的 SIMD”處理:
1 寄存器被視為同一數(shù)據(jù)類型的元素的矢量 2 數(shù)據(jù)類型可為:簽名/未簽名的 8 位、16 位、32 位、64 位單精度浮點(diǎn) 3 指令在所有通道中執(zhí)行同一操作如下圖所示:
本文主要介紹float32x4_t相關(guān)的結(jié)構(gòu)及函數(shù),
float32x4_t 可以理解為vector (4),同理typexN_t即為vector(N)。
在NEON編程中,對(duì)單個(gè)數(shù)據(jù)的操作可以擴(kuò)展為對(duì)寄存器,也即同一類型元素矢量的操作,因此大大減少了操作次數(shù)。
這里以一個(gè)小例子來(lái)解釋如何利用NEON內(nèi)置函數(shù)來(lái)加速實(shí)現(xiàn)統(tǒng)計(jì)一個(gè)數(shù)組內(nèi)的元素之和。
以C++代碼為例:
原始算法代碼如下:
對(duì)于長(zhǎng)度為N的數(shù)組,上述算法的時(shí)間復(fù)雜度時(shí)O(N)。
采用NEON函數(shù)進(jìn)行加速:
上述算法的時(shí)間復(fù)雜度時(shí)O(N/4)
從上面的例子看出,使用NEON函數(shù)很簡(jiǎn)單,只需要將依次處理,變?yōu)榕幚?#xff08;如上面的每次處理4個(gè))。
上面用到的函數(shù)有:
float32x4_t vdupq_n_f32 (float32_t value)
將value復(fù)制4分存到返回的寄存器中
float32x4_t vld1q_f32 (float32_t const * ptr)
從數(shù)組中依次Load4個(gè)元素存到寄存器中
相應(yīng)的 有void vst1q_f32 (float32_t * ptr, float32x4_t val)
將寄存器中的值寫(xiě)入數(shù)組中
float32x4_t vaddq_f32 (float32x4_t a, float32x4_t b)
返回兩個(gè)寄存器對(duì)應(yīng)元素之和 r = a+b
相應(yīng)的 有float32x4_t vsubq_f32 (float32x4_t a, float32x4_t b)
返回兩個(gè)寄存器對(duì)應(yīng)元素之差 r = a-b
float32_t vgetq_lane_f32 (float32x4_t v, const int lane)
返回寄存器某一lane的值
其他常用的函數(shù)還有:
float32x4_t vmulq_f32 (float32x4_t a, float32x4_t b)
返回兩個(gè)寄存器對(duì)應(yīng)元素之積 r = a*b
float32x4_t vmlaq_f32 (float32x4_t a, float32x4_t b, float32x4_t c)
r = a +b*c
float32x4_t vextq_f32 (float32x4_t a, float32x4_t b, const int n)
拼接兩個(gè)寄存器并返回從第n位開(kāi)始的大小為4的寄存器 0<=n<=3
例如
a: 1 2 3 4
b: 5 6 7 8
vextq_f32(a,b,1) -> r: 2 3 4 5
vextq_f32(a,b,2) -> r: 3 4 5 6
vextq_f32(a,b,3) -> r: 4 5 6 7
其他常用的函數(shù)可以參考開(kāi)發(fā)網(wǎng)站
https://developer.arm.com/technologies/neon/intrinsics
NEON函數(shù)介紹:
https://blog.csdn.net/fengbingchun/article/details/38085781
總之,NEON學(xué)習(xí)入門(mén)很快,但如果想要更精深,就需要多花些時(shí)間和功夫在上面。
總結(jié)
- 上一篇: 超详细的实现上传文件功能教程,文件上传实
- 下一篇: 搜索引擎高效使用技巧