Arm NEON intrinsics指令格式
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)<指令名>表示具体操作,比如 add
,sub
。
(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指令格式相关推荐
- ARM Neon 编程笔记一(ARM NEON Intrinsics, SIMD运算, 优化心得)
1. ARM Neon Intrinsics 编程 1.入门:基本能上手写Intrinsics 1.1 Neon介绍.简明案例与编程惯例 1.2 如何检索Intrinsics 1.3 优化效果案例 1 ...
- 【genius_platform软件平台开发】第八十二讲:ARM Neon指令集一(ARM NEON Intrinsics, SIMD运算, 优化心得)
1. ARM Neon Intrinsics 编程 1.入门:基本能上手写Intrinsics 1.1 Neon介绍.简明案例与编程惯例 1.2 如何检索Intrinsics 1.3 优化效果案例 1 ...
- 【genius_platform软件平台开发】第四点:ARM NEON Intrinsics 使用详解
目录 前言 SIMD简介 ARM NEON Intrinsics简介 函数改写示例 结语 前言 最近公司在视频直播项目中要使用H.265/HEVC,具体的是使用HW硬件编码H.264/AVC,云端转码 ...
- ARM Neon Intrinsics 学习指北:从入门、进阶到学个通透
本文同步发表于GiantPandaCV公众号,未经作者允许严禁转载 前言 Neon是ARM平台的向量化计算指令集,通过一条指令完成多个数据的运算达到加速的目的,常用于AI.多媒体等计算密集型任务. 本 ...
- ARM Neon Intrinsics各函数介绍
#ifndef __ARM_NEON__ #error You must enable NEON instructions (e.g. -mfloat-abi=softfp -mfpu=neon) t ...
- ARM NEON Intrinsics示例
[code=csharp] #include <stdio.h> #include <arm_neon.h> int main() { float arr[] = { 1, 2 ...
- 用 Neon Intrinsics 优化 C 代码
以下内容翻译自:Optimizing C Code with Neon Intrinsics 概述 本指南向您展示如何在 C 或 C++ 代码中使用 Neon intrinsics 函数,以利用 Ar ...
- 【neon加速拆分/合并交叉数据】使用neon intrinsics加速合并/拆分uv的内存分布(交叉存储/分别存储)
说明 在YUV格式的图片中,uv数据可以"UVUVUVUV"形式交叉存储叫NV12,也可以以"UUUUUVVVVV"的格式分开存储,为了将二者转换,需要类似如下 ...
- Neon intrinsics
1.介绍 在上篇中,介绍了ARM的Neon,本篇主要介绍Neon intrinsics的函数用法,也就是assembly之前的用法.NEON指令是从Armv7架构开始引入的SIMD指令,其共有16个1 ...
最新文章
- 一图胜千言!数据可视化多维讲解
- java join()源码_Java Thread的join() 之刨根问底
- 走在前沿的弄潮儿,怎能不会Git的那些奇技淫巧
- java 推送消息页面_Notification API,为你的网页添加桌面通知推送
- js函数提示 vscode_为VSCode / Monaco Intellisence添加JavaScript类型提示
- jquery特效(1)—点击展示与隐藏全文
- 使用apache搭建tomcat集群
- 水仙花数 java 1 100_Java练习题1:找出100——999数中的所有水仙花数
- maven下设置默认jdk版本和maven项目构建默认使用jdk版本
- 云计算对IT产业的影响
- Python实现WGS 84坐标与web墨卡托投影坐标的转换
- mysql 实现分页的SQL
- 【图像重建】基于matlab卷积神经网络的图像超分辨率重建【含Matlab源码 1816期】
- 《专业嵌入式软件开发》的样章、建议和勘误
- 《Python程序设计(第3版)》课后习题答案
- 用计算机画函数图象的软件,自动画出函数图象的软件 真像函数图像绘制器
- 2021新手、小白快速安装KALI教程
- Android 图片人脸识别剪切
- 从勒索病毒加密的SQLServer数据库中恢复数据
- 新猿木子李:0基础学python培训教程 Python操作Redis
热门文章
- 电信计费综合管理系统
- [编程入门]猴子吃桃的问题(JAVA解法)
- 9.2 向量范数的三大不等式
- 那场泡沫破碎的一刻,已宣判了一生。
- rsa java模数_RSA加密:利用模数和指数生成公钥加密
- python中randon随机数
- 电容笔和触控笔的区别是什么?好用的电容笔测评
- 练手项目|Node.js实战——轻松实现听歌识曲
- 5G时代要来了?5G到底什么样?
- flask开发桌面应用程序_使用Microsoft Authenticatio将多个破折号应用程序嵌入Flask中...