当前位置: 首页 > news >正文

做网站学什么语言/百度官网推广

做网站学什么语言,百度官网推广,新网备案成功了怎么做网站,多企业宣传网站建设ARM平台下NEON使用方法详解NEON介绍NEON数据类型NEON官方示例及详解NEON手册NEON介绍 在移动平台上进行一些复杂算法的开发,一般需要用到指令集来进行加速。NEON 技术是 ARM Cortex™-A 系列处理器的 128 位 SIMD(单指令,多数据)…

ARM平台下NEON使用方法详解

    • NEON介绍
    • NEON数据类型
    • NEON官方示例及详解
    • NEON手册

NEON介绍

在移动平台上进行一些复杂算法的开发,一般需要用到指令集来进行加速。NEON 技术是 ARM Cortex™-A 系列处理器的 128 位 SIMD(单指令,多数据)架构扩展,专门针对大规模并行运算设计的,旨在为消费性多媒体应用程序提供灵活、强大的加速功能,从而显著改善用户体验。

其本质上使用的是128位NEON SIMD寄存器,这意味着如果操作32位浮点数,可同时操作4个(变量可定义:float32x4_t);如果操作 16 位整数(short),可同时操作 8 个(变量可定义:int16x8_t);而如果操作 8 位整数,则可同时操作 16 个(变量可定义:int8x16_t)。

ARMv7 NEON 指令集架构具有 16 个 128 位的向量寄存器,命名为 q0~q15。这 16 个寄存器又可以拆分成 32 个 64 位寄存器,命名为 d0~d31。其中qn和d2n,d2n+1是一样的,故使用汇编编写代码时要注意避免产生寄存器覆盖。如下图所示:
在这里插入图片描述

NEON数据类型

NEON的数据类型如下图:
在这里插入图片描述
neon的数据类型float32x4_t 可以理解为vector< float32 > (4),同理typexN_t即为vector< type>(N)。在NEON编程中,对单个数据的操作可以扩展为对寄存器,也即同一类型元素矢量的操作,因此大大减少了操作次数。

NEON中指令分为正常指令、宽指令、窄指令、饱和指令、长指令这几类:

正常指令:数据宽度不变

//操作数为int16x4_t,结果数为int16x4_t
int16x4_t vadd_s16 (int16x4_t __a, int16x4_t __b);

长指令:源操作数宽度相同 结果宽度扩展 L标记

//操作数为int16x4_t,结果数为int32x4_t,vaddl_s16中l标志指令为长指令
int32x4_t vaddl_s16 (int16x4_t __a, int16x4_t __b);

宽指令:源操作数宽度不同 结果宽度对齐 W标记

//操作数一个为uint32x4_t,一个为uint16x4_t,结果对齐uint32x4_t,w标志指令为宽指令
uint32x4_t vaddw_u16 (uint32x4_t __a, uint16x4_t __b);

窄指令:源操作数宽度相同 结果宽度变窄 N标记

//操作数为uint32x4_t,结果数为uint16x4_t,n标志指令为窄指令
uint16x4_t vaddhn_u32 (uint32x4_t __a, uint32x4_t __b);

饱和指令:结果溢出就是饱和指令 Q标记

NEON官方示例及详解

通过一个示例来解释如何利用NEON内置函数来加速实现统计一个数组内的元素之和。

#include <iostream>
using namespace std;float sum_array(float *arr, int len)
{if(NULL == arr || len < 1){cout<<"input error\n";return 0;}float sum(0.0);for(int i=0; i<len; ++i){sum += *arr++;}return sum;
}

对于长度为N的数组,上述算法的时间复杂度为O(N)。
采用NEON函数进行加速:

#include <iostream>
#include <arm_neon.h> //需包含的头文件
using namespace std;float sum_array(float *arr, int len)
{if(NULL == arr || len < 1){cout<<"input error\n";return 0;}int dim4 = len >> 2; // 数组长度除4整数int left4 = len & 3; // 数组长度除4余数float32x4_t sum_vec = vdupq_n_f32(0.0);//定义用于暂存累加结果的寄存器且初始化为0for (; dim4>0; dim4--, arr+=4) //每次同时访问4个数组元素{float32x4_t data_vec = vld1q_f32(arr); //依次取4个元素存入寄存器vecsum_vec = vaddq_f32(sum_vec, data_vec);//ri = ai + bi 计算两组寄存器对应元素之和并存放到相应结果}//将累加结果寄存器中的所有元素相加得到最终累加值float sum = vgetq_lane_f32(sum_vec, 0)+vgetq_lane_f32(sum_vec, 1)+vgetq_lane_f32(sum_vec, 2)+vgetq_lane_f32(sum_vec, 3);for (; left4>0; left4--, arr++)sum += (*arr) ;   //对于剩下的少于4的数字,依次计算累加即可return sum;
}

上述算法的时间复杂度为O(N/4),原因在于我们每次往寄存器加载4个float值,然后同时相加。相当于原来需要N次加法操作而现在只需要N/4即可。如果使用更多的寄存器,则可以完成更高倍数的加速。

上述用到的几个NEON指令解释为:

float32x4_t vdupq_n_f32(float32_t val):将val复制四份放入返回的寄存器中。
float32x4_t vld1q_f32(float32_t const * ptr):从地址ptr依次向后加载四个元素放入返回的寄存器中。
float32x4_t vaddq_f32(float32x4_t a, float32x4_t b):返回a+b的值,向量运算,四个值同时相加。
float32_t vgetq_lane_f32(float32x4_t v, const int lane):返回v中某一个lane的值

除以上的操作外,NEON还支持很多的操作,如矢量相减、矢量相乘、矢量乘加、矢量类型转换等等。

NEON手册

以下链接为NEON内置函数的手册,当需要用到某些NEON操作时,可以通过手册查看使用方法。
NEON内置函数详细手册

http://www.jmfq.cn/news/4903633.html

相关文章:

  • 免费做头像网站有哪些/指数基金是什么意思
  • 广东省番禺疫情最新消息/seo是什么服务器
  • 鬼畜做的青龙游戏网站/上海网络推广外包
  • 做网站地图/seo托管服务
  • 做淘宝网站需要/优化大师会员兑换码
  • 做钓鱼网站教程/百度关键词优化平台
  • wordpress怎么换log/百度权重优化软件
  • seo整站如何优化/站长友情链接平台
  • 宝安营销型网站费用/外贸网站建站平台
  • 自己做的网站怎么推广/怎么建立一个属于自己的网站
  • 湛江网站定制/百度电脑版网页版
  • 做网页和网站有什么区别吗/百度品牌广告
  • 中国哪家网站做仿古做的好/国家重大新闻
  • 做网站怎么切片/苏州疫情最新消息
  • 深圳网页搜索排名提升/网络seo关键词优化技巧
  • 专门做干果批发的网站/淘宝网络营销方式
  • 深圳企业网站制作推广运营/app开发需要多少费用
  • 运营策划怎么做/东莞做网站排名优化推广
  • 建建建设网站公司网站/口碑营销的模式
  • 石景山 网站建设/手机app软件开发
  • 互联网专线做网站怎么做数据/杭州网站建设网页制作
  • 网站制作和推广lv官网/技能培训班
  • asp.net网站改版 旧网站链接/win10优化工具下载
  • 自己做网站开发如何找客户/产品推广文案
  • 英文网站的首页怎么做/网站优化公司大家好
  • 网站如何做入支付接口/制作网站的步骤
  • 网站制作常见问题/网站搜索优化公司
  • 课程资源网站开发解决方案/上海牛巨微网络科技有限公司
  • 二手房网站谁做的更好/搜索引擎优化网站排名
  • 做网站需要懂程序吗/自己做的网站怎么推广