Neon入门以及常用函数

什么是neon, neon是arm架构下的一个simd的一种方案, 本质上是一些可以用于simd的寄存器

具体参考官方的图: 

 官方的图说明对于arm开发板, 有16个128bit的寄存器,或者也可以看作是32个64bit的寄存器

列一下常用的neon函数:

加载数据:

float ptr[4]={1,2,3,4};
float32x4_t loaded_data = vld1q_f32(&ptr);

加载某一个数据:

//将prt指针位置存放的数值加载到neon p向量中的最后一个位置上
float32x4_t p = vld1q_lane_f32(ptr,3)

获取向量中某个数据:

//获取neon向量中的第一个数据,data_vector 是neon的向量, 0是向量首位
float a = vgetq_lane_u32(data_vector, 0)

单个数据拓成neon向量,四个值相等:

//得到一个全是0的neon向量
float32x4_t a = vdupq_n_f32(0.0f)

向量对应相加:

//两个neon向量v_0和v_1 对应元素相加
float32x4_t added_reuslt = vaddq_f32(v_0,v1)

向量每一个元素开根号:

float32x4_t b = vsqrtq_f32(a)

 对应元素相乘

//对应元素相乘
float32x4_t a =vmulq_f32(v0,v1)

数据写回:

// 当需要写回neon向量的数据到指针buff的时候 , 只要调用set类函数,这样该目标指针下往后四个数(包括自己 就会变为neon向量中的值)
 vst1q_f32(neon_v, ptr)

这里留一个问题大家思考一下,假设有一个neon A向量, 其中是存在NaN值的,那么如何将NaN值得位置找出来, 起初我想得是搞一个全NaN的neon向量, 做对比运算, 其实这个想法是错误的,因为NaN值对于任何值做比较,都是不相等的。

因此我找到了一种简单的办法, A向量自己和自己比, 相等的为非NaN,不等的就是NaN

然后要得到NaN的mask(NaN)的位置为全1, 那么就要再做一个取反的操作即可 vmvnq_u32

本次neon 编程的分享到此结束, 还有很多neon的指令,可以查看arm的intrinsic文档

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值