simd-neno加速


前言

最近需要使用neon指令集对使用C语言编写的算子进行加速,这里简单记录一下neno加速的基础知识。

一、基本概念

  • simd
    simd是Single instruction, multiple data的缩写,指的是单指令多数据并行,即可以用一条指令处理多条数据。这种SIMD指令功能,主流的体系结构一般都用一组特殊的指令子集给予支持,比如x86的SSE,还比如本文讲的ARM的NEON。

  • ARM
    ARM架构,过去称作进阶精简指令集机器(Advanced RISC Machine,更早称作:Acorn RISC Machine),是一个32位精简指令集(RISC)处理器架构,其广泛地使用在许多嵌入式系统设计。ARM的NEON是类似于X86的SSE2的一种优化的指令集,主要就是为了实现SIMD全称Single Instruction Multiple Data,单指令多数据流,能够复制多个操作数,并把它们打包在大型寄存器的一组指令集。

  • NENO
    NEON是ARM下的一个SIMD指令集合。可实现64位/128位的并行计算。NENO包含两种寄存器

    • 32 个 64-bit 的 D-Register
    • 可组成 16个 128-bit 的 Q-Register

    寄存器可拆分如下:

寄存器 可拆分
D寄存器(64bit) int8x8_t 、 int16x4_t 、int32x2_t 、int64x1_t 、uint8x8_t 、 uint16x4_t 、uint32x2_t 、uint64x1_t 、float32x2_t 、float64x1_t、poly8x8_t 、 poly16x4_t 、
R寄存器(128bit) int8x16_t 、 int16x8_t 、int32x4_t 、int64x2_t 、uint8x16_t 、 uint16x8_t 、uint32x4_t 、uint64x2_t 、float32x4_t 、float64x2_t、poly8x16_t 、 poly16x8_t 、
  • NEON intrinsics
    Neon 内在函数是一组在 arm_neon.h 中定义的 C 和 C++ 函数。直接使用汇编写neno会导致效率不高且编码困难,C编译器支持将NEON指令封装成内置函数供程序员直接使用,就相当于函数调用,但事实上,但将生成的代码反汇编后可以发现,其实没有调用函数,只是在使用NEON寄存器和指令罢了。详情可见Neon Intrinsics官方文档

二、NEON

1.基本类型

<基本类型>x<向量个数>_t
基本类型包括:int8,int16,int32,int64,uint8,uint16,uint32,uint64,float16,float32
如:int16x4_t 表示 一个向量,包含了4个16位整型并行的向量(4个lane,每个lane存16位的数)

2.结构体类型(组合多个向量类型)

type size x <number_of_lanes>x<length_of_array>_t
例:包含两个寄存器的结构体,访问单个元素<var_name>.val[0]。

struct int16x4x2_t
{
int16x4_t val[2];
} <var_name>

3.NEON intrinsics指令命名

<指令名>[后缀]_<数据基本类型简写>
后缀类型:如果没有后缀,表示是D寄存器,64位并行;如果后缀是q,表示128位并行;如果后缀是l,表示长

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值