NEON intrinsic 简易入门指南

简介

Neon是ARM平台的向量化计算指令集,通过一条指令完成多个数据的运算达到加速的目的。新的Armv8a架构有32个128bit的向量寄存器,因此每次运算可以同时处理最多128bit的数据。

数据格式

<type><size>x<number_of_lanes>[x<length_of_array>]_t

解释一下,
type 数据类型
size 元素大小
number_of_lanes 通道数量
length_of_array 数组中的元素个数

数据示例

  • int8x8_t 1个64bit的数据,包含8个int8类型的数据
  • uint8x16x3_t 3个128bit的数据,每个数据包含16个uint8类型的数据

指令格式

ret v[mod]opname[shape][flags]_type(args)

解释一下,
ret 返回数据类型
v vector的简写,是neon intrinsic指令的一个统一前缀
mod 模式主要有以下几种:

  • p pairwise操作,对操作数据两两计操作
  • q 饱和操作,如果结果超过上限,则截断
  • r 四舍五入操作
  • h 折半操作,即右移一位
  • d 翻倍操作,即左移一位,一般会和长指令一起使用

opname 操作名称,如add, sub等
shape 类型主要有以下几种:

  • u 表示输入位有符号型,输出位无符号型
  • n 窄指令,输出是输入的一半
  • l 长指令,输出是输入的2倍
  • w 表示wide,第一个输入向量和输出类型一致,第二个输入向量是第一个输入向量长度的一半
  • _high AArch64下,配合l/n使用,使用l时,表示输入向量只有高64位有效;使用n时,表示输出向量只有高64位有效
  • _lane 指定向量中的某个通道参与计算

flags 标志位

  • 如果没有,则表示64位并行
  • q 表示128位并行,还可以用b, h, s, d(分别代表8,16,32,64位)

_type 输入数据类型

  • s8,s16,s32,s64,u8,u16,u32,u64,f16,f32,f64 s表示有符号整数,u表示无符号整数,f表示浮点数

args 参数

指令示例

  • int16x4_t vadd_s16(int16x4_t a, int16x4_t b)
    add表示加法,s16表示输入16位有符号整数。整个操作就是a+b
  • uint8x8 vqshlun_n_s16(int16x8_t a, int b)
    q表示饱和操作,shl左移,u表示输出转为无符号数,n表示窄指令,即输出为输入的一半,s16表示输入数据为int16。整个操作的意思就是将a左移b位,然后转成无符号型,再转成uint8,如果超过上限,就设为255
  • int16x8_t vreinterpretq_s16_u16(uint16x8_t a)
    uint16转int16
  • int32x4_t vmovl_s16(int16x8_t a);
    mov表示移动,这个函数就是把int16类型的数据提升到int32
  • int16x4_t vget_high_s16(int16x8_t a);
    寄存器a有128位,输出是64位。这个操作的意思就是获取a中的高64位并放到输出向量中
  • int16x8_t vcombine_s16(int16x4_t a, int16x4_t b);
    把两个16x8寄存器向量连接成一个128位的寄存器向量,注意ab类型必须相同
  • int16x4_t vpmax_s8(int16x4_t a, int16x4_t b);
    一一对比a, b的4个元素,输出较大的






参考:

https://zhuanlan.zhihu.com/p/358603760
https://zhuanlan.zhihu.com/p/441686632
https://developer.arm.com/documentation/102467/0100/
https://www.cnblogs.com/fengliu-/p/16140993.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值