- 并行編程方法與優(yōu)化實踐
- 劉文志
- 1239字
- 2019-01-01 01:08:33
2.1 NEON指令集綜述
NEON是ARM Cortex A系列處理器支持的數(shù)據(jù)并行技術(shù),和SSE/AVX類似:一條指令以指令級SIMD的方式同時對多個數(shù)據(jù)進行操作,同時,操作的數(shù)據(jù)個數(shù)由向量寄存器的長度和數(shù)據(jù)類型共同決定。NEON SIMD寄存器的長度為128位,如果操作32位浮點數(shù),可同時操作4個;如果操作16位整數(shù)(short),可同時操作8個;而如果操作8位整數(shù),則可同時操作16個。可見,選擇合適的數(shù)據(jù)類型也是優(yōu)化性能的重要方法之一,本章中就有相關(guān)的實例。
ARMv7 NEON指令集架構(gòu)具有16個128位的向量寄存器,命名為q0~q15。這16個寄存器又可以拆分成32個64位寄存器,命名為d0~d31。其中qn和d2n,d2n+1是一樣的,故使用匯編編寫代碼時要注意避免產(chǎn)生寄存器覆蓋。
使用NEON指令讀寫數(shù)據(jù)時,不需要保證數(shù)據(jù)對齊到16字節(jié)。GCC支持的NEON指令集的C語言接口(內(nèi)置函數(shù),intrinsic)聲明在arm_neon.h頭文件中。NEON指令集支持的映射到向量寄存器的向量數(shù)據(jù)類型命名格式為type size x num。
其中:
①type表示元素的數(shù)據(jù)類型,目前只支持float、int和uint。
②size表示每個元素的數(shù)據(jù)長度位數(shù),float只支持32位浮點數(shù),int和unit支持8位、16位、32位和64位整數(shù)。
③num表示元素數(shù)目,即向量寄存器的位數(shù)。由于NEON只支持64位和128位向量寄存器,故size和num的乘積只能是64或128。
如uint16x8_t表示每個元素數(shù)據(jù)類型為uint,大小為16位,每個向量保存8個數(shù),故使用的向量寄存器長度為128位;如float32x4_t表示每個元素的數(shù)據(jù)類型為32位浮點,向量寄存器可操作4個數(shù)據(jù),故使用128位向量寄存器。
NEON內(nèi)置函數(shù)命名方式有兩種,分別對應源操作數(shù)是否涉及標量,具體解釋如下。
1)源操作數(shù)涉及標量時,數(shù)據(jù)類型表示為v op dt_n/lane_type。
其中:
①n表示源操作數(shù)是標量而返回向量,lane表示運算涉及向量的一個元素。
②op表示操作,如dup、add、sub、mla等。
③dt是目標向量和源向量長度表示符。
·如果目標向量和源向量長度都為64位,dt為空。
·如果源向量和目標向量長度一致都為128位,dt為q。
·如果目標向量長度比源數(shù)向量長度大,且源向量長度都為64位、目標向量長度為128位,dt為l(英文字母,不是數(shù)字1)。
·如果多個源向量長度不一致且都不大于目標向量長度(一個源向量長度為64位,另一個為128位,目標向量長度為128位),dt為w。
·如果目標向量長度比源向量長度小,即目標向量長度dt為n。
④type表示源數(shù)據(jù)類型縮寫,如u8表示uint8;u16表示uint16;u32表示uint32;s8表示int8;s16表示int16;s32表示int32;f32表示float32。
2)源操作數(shù)全是向量時,數(shù)據(jù)類型表示為v op dt_type,其中op、dt和type的含義和源操作數(shù)為標量時一致。
下面給出幾個實例以增加讀者理解。
1)內(nèi)置函數(shù)vmla_f32表示使用64位向量寄存器操作32位浮點數(shù)據(jù),即源操作數(shù)使用的向量寄存器和目標操作數(shù)使用的向量寄存器表示都是float32x2_t。
2)內(nèi)置函數(shù)vmlaq_f32表示使用128位向量寄存器操作32位浮點數(shù)據(jù),即源操作數(shù)使用的向量寄存器和目標操作數(shù)使用的向量表示都是float32x4_t。
3)內(nèi)置函數(shù)vmlal_u32表示使用的目標寄存器是128位向量,源寄存器是64位向量,操作32位無符號整數(shù)。
4)內(nèi)置函數(shù)vaddw_s32表示使用的目標寄存器是128位向量,源寄存器一個是64位向量,一個是128位向量。
5)內(nèi)置函數(shù)vmovn_u64表示目標寄存器是64位向量,源寄存器是128位向量,即同時操作兩個數(shù)。
- Python程序設計(第3版)
- 編寫高質(zhì)量代碼:改善C程序代碼的125個建議
- 薛定宇教授大講堂(卷Ⅳ):MATLAB最優(yōu)化計算
- Python高效開發(fā)實戰(zhàn):Django、Tornado、Flask、Twisted(第2版)
- Python自然語言處理(微課版)
- Python Data Analysis(Second Edition)
- 快人一步:系統(tǒng)性能提高之道
- Mastering Android Development with Kotlin
- PHP從入門到精通(第4版)(軟件開發(fā)視頻大講堂)
- Visual Studio 2015高級編程(第6版)
- 奔跑吧 Linux內(nèi)核
- JSP大學實用教程
- TensorFlow 2.0深度學習應用實踐
- 微信小程序開發(fā)圖解案例教程:附精講視頻(第3版)
- JSP項目開發(fā)情境教程