官术网_书友最值得收藏!

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ù)。

主站蜘蛛池模板: 永顺县| 抚州市| 新余市| 竹北市| 舒兰市| 贵溪市| 清水县| 南投市| 潢川县| 永泰县| 澎湖县| 阳江市| 绥化市| 射阳县| 绥棱县| 兴安县| 柳林县| 福贡县| 凤阳县| 青河县| 福州市| 任丘市| 辉县市| 曲水县| 观塘区| 光山县| 中山市| 罗平县| 博客| 凤城市| 仁怀市| 阳东县| 利津县| 修文县| 凤翔县| 陆河县| 金山区| 张家口市| 安溪县| 上虞市| 苍山县|