ARM NEON 指令

news2024/11/19 17:19:23

NEON指令

按照操作数类型可以分为正常指令、宽指令、窄指令、饱和指令、长指令。

  • 正常指令:生成大小相同且类型通常与操作数向量相同到结果向量。
  • 长指令:对双字向量操作数执行运算,生产四字向量到结果。所生成的元素一般是操作数元素宽度到两倍,并属于同一类型。L标记,如VMOVL。
  • 宽指令:一个双字向量操作数和一个四字向量操作数执行运算,生成四字向量结果。W标记,如VADDW。
  • 窄指令:四字向量操作数执行运算,并生成双字向量结果,所生成的元素一般是操作数元素宽度的一半。N标记,如VMOVN。
  • 饱和指令:当超过数据类型指定到范围则自动限制在该范围内。Q标记,如VQSHRUN

指令的格式理解

NEON指令中有的加q,有的不加q,有何区别?

操作符后的q,如vmulq, 表示128位满位宽寄存器运算
v后的q,如vqrdmulh,q表示饱和运算,溢位后,为自动限制在数据类型的最大范围内。
rdmul表示向量与标量进行加倍乘运算的具体操作意义。
hq表示高位饱和,lq表示低位饱和。

int16x8_t vqaddq_s16 (int16x8_t, int16x8_t)int16x4_t vqadd_s16 (int16x4_t, int16x4_t)中vqaddq_s16和vqadd_s16各个字段的解释如下:

第一个字母’v’指明是vector向量指令,也就是NEON指令;
第二个字母’q’指明是饱和指令,即后续的加法结果会自动饱和;
第三个字段’add’指明是加法指令;
第四个字段’q’指明操作寄存器宽度,为’q’时操作QWORD, 为128位;未指明时操作寄存器为DWORD,为64位;
第五个字段’s16’指明操作的基本单元为有符号16位整数,其最大表示范围为-32768 ~ 32767;
形参和返回值类型约定与C语言一致。

其它助记符包括:

l 长指令,数据扩展
w 宽指令,数据对齐
n 窄指令, 数据压缩

NEON变量的命名规则

没有统一的规则,如果想要规范些,可采用以下命名方式。变量类型 变量名:vTNnVar

解释

v,表示向量运算
T,表示变量的类型,分别用s表示有符号整型,u表示无符号整型,f表示浮点
N,表示变量元素所占位宽,如s32,u16,f32中的数字即N,表示元素占位
n,表示向量线元素结构,如x4,x4x2
Var,表示变量自定义的名字

vld1 格式

Result_t vld1_type(Scalar_t* N);
Result_t vld1q_type(Scalar_t* N);

这个指令的作用是从内存加载到向量中

例子:

vld1q_u16

是一个 ARM NEON 指令,用于加载一组连续的 16 位无符号整数(uint16_t)值到一个 128 位的 NEON 寄存器。从内存中读取连续的 8 个 16 位无符号整数值,并将它们存储到一个 NEON 寄存器中。ptr 是一个指向这些值的内存地址的指针

uint16_t *src = image_src;
uint16x8_t vsrc;
vsrc = vld1q_u16(src);

vdup_n 格式

  • vdup_n_type(Scalar_t N):将标量值 N 复制到一个 64 位的 NEON 向量寄存器中,并将其扩展为给定类型的元素。
  • vdupq_n_type(Scalar_t N):将标量值 N 复制到一个 128 位的 NEON 向量寄存器中,并将其扩展为给定类型的元素

这个指令的作用是创建一个具有相同值的向量,其中每个元素都等于给定的标量值。例如,如果使用 VDUPQ_N 指令将标量值 5 复制到一个 128 位的 NEON 向量寄存器中,那么该向量的每个元素都将被设置为 5。使用 VDUPQ_N 指令可以方便地初始化向量寄存器,生成常量向量或将标量值扩展为向量形式。这对于需要对向量中的每个元素执行相同操作的情况非常有用,并且可以提高数据处理的效率

例如:

uint16x8_t q0 = vdupq_n_u16(UINT16_MAX);//初始化创建 

vst1格式

void vst1_type(Scalar_t* N, Vector_t M);
void vst1q_type(Scalar_t* N, Vector_t M);
存储向量到内存

例子


uint8x8_t v; // define v as a vector with 8 lanes of 8-bit data
unsigned char A[8]; // allocate memory for eight 8-bit data
v = vcreate_u8(0x0102030405060708); // create a vector that contains the values
// 1,2,3,4,5,6,7,8
vst1_u8(A, v); // store the vector to memory, in this case, to array A

arm_neon.h 支持的操作
add 加法
mul 乘法
sub 减法
mla 乘加
mls 乘减
ceq 比较,类似与 ==
cge 比较,类似与 >=
cle 比较,类似与 <=
cgt 比较,类似与 >
clt 比较,类似与 <
tst 做与运算后,判断是否等于0 ,ri = (ai & bi != 0) ? 1…1:0…0;
abd 两个向量相减后的绝对值,vabd -> ri = |ai - bi|;
max 求最大值,ri = ai >= bi ? ai : bi;
min 求最小值,ri = ai >= bi ? bi : ai;
shl 左移位, ri = ai << b;
shr 右移位, ri = ai >> b;
abs 求绝对值,ri = |ai|;
neg 取反,ri = -ai;
mvn 按位取反,ri = ~ai;
and 与运算,ri = ai & bi;
orr 或运算,ri = ai | bi;
eor 异或运算,ri = ai ^ bi;
cls 计算连续相同的位数
get 取值,从向量中取出一个值,所谓的向量可以认为是一个数组,给数组中的某个元素赋值
set 赋值,给向量中赋值
dup 构造一个向量,并赋上初始值,ri = a;
combine 合并操作,把两个向量合并
mov 改变数据类型,数据范围,比如把u8 变成u16,或者u16变成u8
zip 压缩操作
uzp 解压操作
ld1 加载数据,给定的buffer 指针中拷贝数据,注意是ld后面的是数字1,而不是字母l
st1 拷贝数据,将neon数据类型拷贝到指定buffer中

指令查询表

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1351629.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从0搭建github.io网页

点击跳转到&#x1f517;我的博客文章目录 从0搭建github.io网页 文章目录 从0搭建github.io网页1.成果展示1.1 网址和源码1.2 页面展示 2.new对象2.1 创建仓库 3.github.io仓库的初始化3.1 千里之行&#xff0c;始于足下3.2 _config.yml3.3 一点杂活 4.PerCheung.github.io.p…

Qt(三):udp组播的发送与接收

1. 创建UDP套接字 使用QUdpSocket类创建一个UDP套接字。 udpSendnew QUdpSocket(this);udpRecenew QUdpSocket(this); 2. 绑定套接字 绑定套接字到一个本地地址和端口。可以使用bind()函数来完成。 如果要在组播中发送数据&#xff0c;可以将套接字绑定到一个通配符地址&#…

【CASS精品教程】CASS11计算城镇建筑密度

CASS中可以很方便计算建筑密度。 文章目录 一、建筑密度介绍二、CASS计算建筑密度1. 绘制宗地范围2. 绘制建筑物3. 计算建筑密度三、注意事项一、建筑密度介绍 建筑密度(building density;building coverage ratio),指在一定范围内,建筑物的基底面积总和与占用地面积的比…

计算机网络-以太网交换基础

一、网络设备的演变 最初的网络在两台设备间使用传输介质如网线等进行连接就可以进行通信。但是随着数据的传输需求&#xff0c;多个设备需要进行数据通信时就需要另外的设备进行网络互联&#xff0c;并且随着网络传输的需求不断更新升级。从一开始的两台设备互联到企业部门内部…

【OpenCV】在MacOS上源码编译OpenCV

在MacOS上源码编译OpenCV 1. 下载项目源码2. 创建CMake编译文件3. 编译安装4. 案例测试5. 总结 前言 在做视觉任务时&#xff0c;我们经常会用到开源视觉库OpenCV&#xff0c;OpenCV是一个基于Apache2.0许可&#xff08;开源&#xff09;发行的跨平台计算机视觉和机器学习软件…

Spring技术内幕笔记之IOC的实现

IOC容器的实现 依赖反转&#xff1a; 依赖对象的获得被反转了&#xff0c;于是依赖反转更名为&#xff1a;依赖注入。许多应用都是由两个或者多个类通过彼此的合作来实现业务逻辑的&#xff0c;这使得每个对象都需要与其合作的对象的引用&#xff0c;如果这个获取过程需要自身…

Java学习苦旅(十六)——List

本篇博客将详细讲解Java中的List。 文章目录 预备知识——初识泛型泛型的引入泛型小结 预备知识——包装类基本数据类型和包装类直接对应关系装包与拆包 ArrayList简介ArrayList使用ArrayList的构造ArrayList常见操作ArrayList遍历 结尾 预备知识——初识泛型 泛型的引入 我…

WebStorm 创建一个Vue项目(1)

一、下载并安装WebStorm 步骤一 步骤二 选择激活方式 激活码&#xff1a; I2A0QUY8VU-eyJsaWNlbnNlSWQiOiJJMkEwUVVZOFZVIiwibGljZW5zZWVOYW1lIjoiVU5JVkVSU0lEQURFIEVTVEFEVUFMIERFIENBTVBJTkFTIiwiYXNzaWduZWVOYW1lIjoiVGFvYmFv77yaSkVU5YWo5a625qG25rAIOa0uW3peS9nOWup…

json解析本地数据,使用JSONObject和JsonUtility两种方法。

json解析丨网址、数据、其他信息 文章目录 json解析丨网址、数据、其他信息介绍一、文中使用了两种方法作为配置二、第一种准备2.代码块 二、第二种总结 介绍 本文可直接解析本地json信息的功能示例&#xff0c;使用JSONObject和JsonUtility两种方法。 一、文中使用了两种方法…

R语言——R函数、选项参数、数学统计函数(六)

目录 一、R函数 二、选项参数 三、数学统计函数 四、参考 一、R函数 1.lm() lm()是R语言中经常用到的函数&#xff0c;用来拟合回归模型。它是拟合线性模型最基本的函数 lm()格式如下&#xff1a; fit<-lm(formula,data) 其中&#xff0c;formula指要拟合的模型形式…

【QT 自研上位机 与 ESP32下位机联调>>>串口控制GPIO-基础样例-联合文章】

【QT 自研上位机 与 ESP32下位机联调&#xff1e;&#xff1e;&#xff1e;串口控制GPIO-基础样例-联合文章】 1、概述2、实验环境3、 自我总结4、 实验过程1、验证上位机QT程序1、下载样例代码2、修改qt程序3、运行测试验证 2、验证下位机ESP32程序1、下载样例代码2、更改ESP3…

Ubuntu18 安装chatglm2-6b

记了下Ubuntu18 上安装chatglm2-6遇到的问题。 环境&#xff1a;Ubuntu18.04 V100(显卡) nvcc 11.6 显卡驱动cudacudnnaniconda chatglm6b 的安装 网上有很多&#xff0c; 不记录 了。 chatglm2-6b 我从别的地方拷贝的&#xff0c; 模型也包含了。 遇到的问题&#xf…

【MMC子系统】三、MMC子系统框架

我的圈子&#xff1a; 高级工程师聚集地 我是董哥&#xff0c;高级嵌入式软件开发工程师&#xff0c;从事嵌入式Linux驱动开发和系统开发&#xff0c;曾就职于世界500强企业&#xff01; 创作理念&#xff1a;专注分享高质量嵌入式文章&#xff0c;让大家读有所得&#xff01; …

【SpringBoot开发】之商城项目案例(购物车相关操作)

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是君易--鑨&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的博客专栏《SpringBoot开发之商城项目系列》。&#x1f3af…

GZ075 云计算应用赛题第4套

2023年全国职业院校技能大赛&#xff08;高职组&#xff09; “云计算应用”赛项赛卷4 某企业根据自身业务需求&#xff0c;实施数字化转型&#xff0c;规划和建设数字化平台&#xff0c;平台聚焦“DevOps开发运维一体化”和“数据驱动产品开发”&#xff0c;拟采用开源OpenSt…

Pytorch上采样

文章目录 Upsample特殊上采样 Upsample 所谓上采样&#xff0c;实则是一个插值过程。所以上采样对象在初始化时&#xff0c;需要指定一个插值类型&#xff0c;Upsample是torch.nn中最基础的上采样类&#xff0c;初始化参数如下 Upsample(sizeNone, scale_factorNone, modenea…

计算机组成原理 主存和CPU连接与主存提速方案

文章目录 主存与CPU的连接译码器线选法译码片选法总结 位拓展字拓展字位同时拓展 主存提速方案存储周期双端口RAM多模块存储器单体多字存储器多模块多体并行存储器存储器高位交叉编址低位交叉编址 主存与CPU的连接 #mermaid-svg-3wv6WzRP2BvKEHQZ {font-family:"trebuchet…

GZ075 云计算应用赛题第1套

2023年全国职业院校技能大赛(高职组) “云计算应用”赛项赛卷1 某企业根据自身业务需求,实施数字化转型,规划和建设数字化平台,平台聚焦“DevOps开发运维一体化”和“数据驱动产品开发”,拟采用开源OpenStack搭建企业内部私有云平台,开源Kubernetes搭建云原生服务平台,…

HTML5 和 CSS3 新特性(常用)

HTML5 的新特性 HTML5 的新增特性主要是针对于以前的不足&#xff0c;增加了一些新的标签、新的表单和新的表单属性等。 这些新特性都有兼容性问题&#xff0c;基本是 IE9 以上版本的浏览器才支持&#xff0c;如果不考虑兼容性问题&#xff0c;可以大量使用这 些新特性。 HTML…

Linux CPU 数据 Metrics 指标解读

过去从未仔细了解过使用 top 和 htop 等命令时显式的CPU信息&#xff0c;本文我们详解解读和标注一下各个数据项的含义&#xff0c;同时和 Ganglia 显式的数据做一个映射。开始前介绍一个小知识&#xff0c;很多查看CPU的命令行工具都是 cat /proc/stat 里的数据&#xff0c;所…