NEON Intrinsics 是一种更简单的编写 NEON 代码的方法,NEON Intrinsics 类似于 C 函数调用,在编译时由编译器替换为相应的汇编指令,使用时需要包含头文件arm_neon.h

1、类型格式

(1)非数组向量格式

<基本类型>x<lane个数>_t      如int8x8_t

基本类型int8,int16,int32,int64,uint8,uint16,uint32,uint64,float16,float32

lane个数表示并行处理的基本类型数据的个数(通道数)。

(2)数组向量格式

<基本类型>x<lane个数>x<向量个数>_t    如 uint8x8x3_t

对于多个向量的类型实际上是结构体

typedef struct {
            uint8x8_t val[3];
        } uint8x8x3_t;

2、函数格式

v<模型><指令名><sharp>[后缀]_<数据基本类型简写>

(1)<模型>

q:表示饱和计算,例如

// a加b的结果做饱和计算

int8x8_t vqadd_s8(int8x8_t a, int8x8_t b);

h:表示折半计算,例如

// a减b的结果右移一位

int8x8_t vhsub_s8(int8x8_t a, int8x8_t b);

d:表示加倍计算,例如

// a乘b的结果扩大一倍, 最后做饱和操作

int32x4_t vqdmull_s16(int16x4_t a, int16x4_t b);

r:表示舍入计算,例如

// 将a与b的和减半,同时做rounding 操作, 每个通道可以表达为: (ai + bi + 1) >> 1

int8x8_t vrhadd_s8(int8x8_t a, int8x8_t b);

p:表示pairwise计算。例如

// 将a, b向量的相邻数据进行两两和操作

int8x8_t vpadd_s8(int8x8_t a, int8x8_t b);

(2)<指令名>表示具体操作,比如 addsub

(3)<sharp>

l:long,表示长指令,输出数据的基本类型位数是输入的2倍,例如

uint16x8_t vaddl_u8(uint8x8_t a, uint8x8_t b);

n:narrow,表示窄指令,输出数据的基本类型位数是输入的一半,例如

uint32x2_t vmovn_u64(uint64x2_t a);

w:wide,第一个输入向量和输出向量类型一样,且是第二个输入向量元素长度的2倍,例如

uint16x8_t vsubw_u8(uint16x8_t a, uint8x8_t b);

_high:AArch64专用,而且和 l/n 配合使用。当使用 l(Long) 时,表示输入向量只有高 64bit 有效;当使用 n(Narrow) 时,表示输出只有高 64bit 有效。

// a 和 b 只有高 64bit 参与运算

int16x8_t vsubl_high_s8(int8x16_t a, int8x16_t b);

_n:表示有标量参与向量计算,例如

// 向量 a 中的每个元素右移 n 位

int8x8_t vshr_n_s8(int8x8_t a, const int n);

_lane: 指定向量中某个通道参与向量计算,例如

// 取向量 v 中下标为 lane 的元素与向量 a 做乘法计算

int16x4_t vmul_lane_s16(int16x4_t a, int16x4_t v, const int lane);

(4)[后缀]

后缀如果没有,表示64位并行;如果后缀是q,表示128位并行。

(5)<数据基本类型简写>

数据基本类型简写:s8,s16,s32,s64,u8,u16,u32,u64,f16,f32,f64

例如:

vadd_u16:两个uint16x4相加为一个uint16x4

vaddq_u16:两个uint16x8相加为一个uint16x8

Arm NEON intrinsics指令格式相关推荐

  1. ARM Neon 编程笔记一(ARM NEON Intrinsics, SIMD运算, 优化心得)

    1. ARM Neon Intrinsics 编程 1.入门:基本能上手写Intrinsics 1.1 Neon介绍.简明案例与编程惯例 1.2 如何检索Intrinsics 1.3 优化效果案例 1 ...

  2. 【genius_platform软件平台开发】第八十二讲:ARM Neon指令集一(ARM NEON Intrinsics, SIMD运算, 优化心得)

    1. ARM Neon Intrinsics 编程 1.入门:基本能上手写Intrinsics 1.1 Neon介绍.简明案例与编程惯例 1.2 如何检索Intrinsics 1.3 优化效果案例 1 ...

  3. 【genius_platform软件平台开发】第四点:ARM NEON Intrinsics 使用详解

    目录 前言 SIMD简介 ARM NEON Intrinsics简介 函数改写示例 结语 前言 最近公司在视频直播项目中要使用H.265/HEVC,具体的是使用HW硬件编码H.264/AVC,云端转码 ...

  4. ARM Neon Intrinsics 学习指北:从入门、进阶到学个通透

    本文同步发表于GiantPandaCV公众号,未经作者允许严禁转载 前言 Neon是ARM平台的向量化计算指令集,通过一条指令完成多个数据的运算达到加速的目的,常用于AI.多媒体等计算密集型任务. 本 ...

  5. ARM Neon Intrinsics各函数介绍

    #ifndef __ARM_NEON__ #error You must enable NEON instructions (e.g. -mfloat-abi=softfp -mfpu=neon) t ...

  6. ARM NEON Intrinsics示例

    [code=csharp] #include <stdio.h> #include <arm_neon.h> int main() { float arr[] = { 1, 2 ...

  7. 用 Neon Intrinsics 优化 C 代码

    以下内容翻译自:Optimizing C Code with Neon Intrinsics 概述 本指南向您展示如何在 C 或 C++ 代码中使用 Neon intrinsics 函数,以利用 Ar ...

  8. 【neon加速拆分/合并交叉数据】使用neon intrinsics加速合并/拆分uv的内存分布(交叉存储/分别存储)

    说明 在YUV格式的图片中,uv数据可以"UVUVUVUV"形式交叉存储叫NV12,也可以以"UUUUUVVVVV"的格式分开存储,为了将二者转换,需要类似如下 ...

  9. Neon intrinsics

    1.介绍 在上篇中,介绍了ARM的Neon,本篇主要介绍Neon intrinsics的函数用法,也就是assembly之前的用法.NEON指令是从Armv7架构开始引入的SIMD指令,其共有16个1 ...

最新文章

  1. 一图胜千言!数据可视化多维讲解
  2. java join()源码_Java Thread的join() 之刨根问底
  3. 走在前沿的弄潮儿,怎能不会Git的那些奇技淫巧
  4. java 推送消息页面_Notification API,为你的网页添加桌面通知推送
  5. js函数提示 vscode_为VSCode / Monaco Intellisence添加JavaScript类型提示
  6. jquery特效(1)—点击展示与隐藏全文
  7. 使用apache搭建tomcat集群
  8. 水仙花数 java 1 100_Java练习题1:找出100——999数中的所有水仙花数
  9. maven下设置默认jdk版本和maven项目构建默认使用jdk版本
  10. 云计算对IT产业的影响
  11. Python实现WGS 84坐标与web墨卡托投影坐标的转换
  12. mysql 实现分页的SQL
  13. 【图像重建】基于matlab卷积神经网络的图像超分辨率重建【含Matlab源码 1816期】
  14. 《专业嵌入式软件开发》的样章、建议和勘误
  15. 《Python程序设计(第3版)》课后习题答案
  16. 用计算机画函数图象的软件,自动画出函数图象的软件 真像函数图像绘制器
  17. 2021新手、小白快速安装KALI教程
  18. Android 图片人脸识别剪切
  19. 从勒索病毒加密的SQLServer数据库中恢复数据
  20. 新猿木子李:0基础学python培训教程 Python操作Redis

热门文章

  1. 电信计费综合管理系统
  2. [编程入门]猴子吃桃的问题(JAVA解法)
  3. 9.2 向量范数的三大不等式
  4. 那场泡沫破碎的一刻,已宣判了一生。
  5. rsa java模数_RSA加密:利用模数和指数生成公钥加密
  6. python中randon随机数
  7. 电容笔和触控笔的区别是什么?好用的电容笔测评
  8. 练手项目|Node.js实战——轻松实现听歌识曲
  9. 5G时代要来了?5G到底什么样?
  10. flask开发桌面应用程序_使用Microsoft Authenticatio将多个破折号应用程序嵌入Flask中...