Neon简介

欢迎关注“安全有理”微信公众号。

安全有理

概述

本文介绍了 Arm Neon 技术,一种⾼级 SIMD(Single Instruction Multiple Data,一条指令操作多个数据)架构扩展,Armv8‑A 和 Armv8-R 架构支持了 Neon 技术扩展。

Neon 技术是指令集架构的专用扩展,其提供了额外的指令,用于对多个数据流进行并行计算。

SIMD架构

通过加速音频和视频编解码、用户接口、2D/3D 图形或游戏,SIMD架构可以改善多媒体用户体验。Neon 还可以
加速信号处理,从而提升音视频处理、语音和面部识别、计算机视觉和深度学习等应用的速度。

作为程序员,你有多种方式使用 Neon 技术:

  • 支持 Neon 的开源库,例如 Arm Compute Library
  • 编译器的自动矢量化特性可以利用 Neon 技术自动优化你的代码
  • Neon intrinsics内建函数,编译器用相应的 Neon 指令进行了封装
  • 对于经验丰富的程序员来说,为了获得极佳的性能,手动编写 Neon 汇编也是一种方法

开始之前

如果您对 Arm 技术完全陌生,可以阅读 Cortex‑A 系列编程指南,了解有关 Arm 架构和编程知识。

本文针对 Armv8 的 Neon。如果您正在针对 Armv7 设备进行开发,可以参考version 1.0 of the Neon Programmer’s Guide。

如果您正手动编写汇编程序,请参阅该处理器的技术参考手册,可以最大程度提⾼性能。对于某些处理器,Arm 还发布了可能有用的软件优化指南。例如,请参阅Arm Cortex‑A75 技术参考手册和Arm Cortex‑A75 软件优化指南。

数据处理方法

当处理大量数据时,主要的性能限制因素是执行数据处理指令所需的 CPU 时间。这个 CPU 时间取决于处理整个数据集所需的指令数量,而指令的数量取决于每条指令可以处理多少数据项。

单指令单数据

大多数 Arm 指令都是单指令单数据 (SISD),每条指令在单个数据源上执行其指定的操作。因此,处理多个数据项需要多条指令。例如,要执行4次加法运算,需要4条指令来将4对寄存器中的值相加:

ADD w0, w0, w5
ADD w1, w1, w6
ADD w2, w2, w7
ADD w3, w3, w8

这种方法相对较慢,并且很难看出不同寄存器之间的关系。为了提⾼性能和效率,媒体处理通常使用专用处理器,例如图形处理单元 (GPU) 或媒体处理单元,它们可以使用一条指令处理多个数据。

如果正在处理的数据宽度小于最大位宽,SISD 指令会浪费带宽。例如,将 8 位值相加时,每个 8 位值都需要加载到单独的 64 位寄存器中。对小数据量执行单独操作并不能有效地利用资源,因为处理器、寄存器和数据通路都是为 64 位计算而设计的。

单指令多数据

单指令多数据 (SIMD) 指令同时对多个数据元素执行相同的操作,这些数据元素被打包到一个更大的寄存器中的单独通道。

例如,下面的ADD指令将4个32位数据元素相加,这些值被打包到两对128位寄存器的单独通道中。先将第一个源寄存器中的每个通道与第二个源寄存器中的相应通道相加,然后将结果存储在目标寄存器中的同一通道中:

ADD V10.4S, V8.4S, V9.4S
// This operation adds two 128-bit (quadword) registers, V8 and V9,
// and stores the result in V10.
// Each of the four 32-bit lanes in each register is added separately.
// There are no carries between the lanes.

该指令同时对128位寄存器中的所有数据进行操作:

单指令多数据

使用一个 SIMD 指令执行四个操作比使用四个单独的 SISD 指令速度更快。

上图展示了一个128位寄存器存储了四个32位数据,但 Neon 寄存器还可以有其他组合:

  • 使用 Neon 寄存器的全部128位,可以同时操作两个 64 位、四个 32 位、八个 16 位或十六个 8 位整型数据
  • 使用 Neon 寄存器的低64位,可以同时操作两个32 位、四个16 位或八个8 位整型数据(在这种情况下,未使用 Neon 寄存器的高64位)

例如在移动设备中使用的媒体处理器通常将每个数据寄存器分割成多个子寄存器,并行地在子寄存器上执行计算。如果数据处理很简单并且需要重复多次,SIMD 可以明显地提升性能。它对于数字信号处理或多媒体算法特别有用,例如:

  • 音频、视频和图像处理编解码器
  • 基于矩形像素块的2D图像
  • 3D图像
  • 色彩空间转换
  • 物理模拟

Armv8 Neon技术基础

Armv8‑A 有 32 位和 64 位两种执行状态,每个执行状态都有自己的指令集:

  • AArch64 表示 Armv8‑A 架构的64位执行状态。在AArch64状态下,处理器执行A64指令集,其中也包含 Neon 指令(也称为SIMD指令)。GNU 和 Linux 文档有时将 AArch64 称为 ARM64。
  • AArch32 表示 Armv8‑A 架构的32位执行状态,与 Armv7 几乎相同。在AArch32状态下,处理器可以执行A32(早期版本称为ARM)或T32(Thumb)指令集。A32和T32指令集向后兼容 Armv7,包括 Neon 指令。

本文将重点介绍使用 A64 指令对 Armv8‑A 架构的 AArch64 执行状态进行 Neon 编程。

如果您想编写 Neon 代码,在 Armv8‑A 架构的 AArch32 执行状态下运行,请参考version 1.0 of the Neon Programmer’s Guide。

寄存器、向量、通道和元素

如果熟悉 Armv8‑A 架构系列,您会注意到在 AArch64 状态下,Armv8 内核是64位架构并使用64位寄存器,但 Neon 单元使用128位寄存器进行 SIMD 处理。

这是因为 Neon 单元在独立的128位寄存器上操作,Neon 单元完全集成到处理器中,并共享处理器资源,进行整数运算、循环控制和缓存。与硬件加速器相比,这明显降低了面积和功耗。它还使用简单的编程模型,因为 Neon 单元使用与应用程序相同的地址空间。

Neon 寄存器可以按照8位、16位、32位、64位或128位进行访问。

Neon 寄存器包含相同数据类型的向量元素,输入和输出寄存器中相同的元素位置称为通道。

通常,每个 Neon 指令会同时执行 n 个操作,其中 n 是输入向量划分的通道数。每个操作都包含在通道内,不存在从一个通道到另一通道的进位或溢出。

Neon 向量中的通道数取决于向量的大小和向量中的元素数量。

128位 Neon 向量可以包含以下元素大小:

  • 16 个 8 位元素(后缀 .16B,其中B表示字节)
  • 8 个 16 位元素(后缀 .8H,其中H表示半字)
  • 4 个 32 位元素(后缀 .4S,其中S表示字)
  • 2 个 64 位元素(后缀 .2D,其中D表示双字)

64位 Neon 向量可以包含以下元素大小(128位寄存器的高64位为0):

  • 8 个 8 位元素(后缀 .8B,其中B表示字节)
  • 4 个 16 位元素(后缀 .4H,其中H表示半字)
  • 2 个 32 位元素(后缀 .2S,其中S表示字)

64位和128位向量

向量中的元素从最低有效位开始,即元素0使用向量寄存器的最低位。看一个 Neon 指令的例子,指令ADD V0.8H, V1.8H, V2.8H执行8个通道的16位(8x16=128)整型加法运算,数据来自 V1 和 V2,将结果存储在 V0 中:

向量中的元素顺序

一些 Neon 指令可以进行标量运算,使用标量的指令可以索引寄存器通道中的元素。例如,指令MUL V0.4S, V2.4S, V3.S[2]将 V2 中的 4 个 32 位元素与 V3 通道2中的 32 位标量值相乘,并将结果向量存储在 V0 中。

使用标量的指令

检查你的知识

  1. Neon 和⾼级 SIMD 架构有什么区别?

    Neon 是一个品牌名称,指的是 Arm ⾼级 SIMD 架构的实现。尽管这两个术语经常互换使用,但严格来说 Neon 并不是 Arm 架构的一个功能。因此,如果你希望从架构参考手册或 Cortex‑A 技术参考手册中了解 Neon,应该搜索 Advanced SIMD 而不是 Neon。

  2. SIMD 代表什么?SIMD 指令如何加速使用 SISD 指令的程序?

    SIMD 代表单指令多数据。由于 SIMD 指令比 SISD(单指令单数据)指令执行的操作更多,因此使用 SIMD 指令的程序,平均每条指令可以处理更多的数据。如果SIMD和SISD指令的执行时间相同,程序就会加速。

  3. 使用 Neon 的四种方法?

    导入使用 Neon 的库,如 Arm Compute Library 或者 the Arm Performance Libraries;使用支持 Neon 代码生成的编译器,如 Arm Compilers 或者 GCC;在 C 或 C++ 代码中使用 Neon Intrinsics;使用高级 SIMD 指令集编写 Arm 汇编程序。

  4. AArch64执行状态下有多少个Neon寄存器,如何将它们划分到不同的通道?

    有32个128位寄存器,可分为 8、16、32 或 64 位宽的通道。这些也可以用作 64 位寄存器,只是不使用⾼64位。

相关信息

以下是与本指南相关的一些资源:

  • 有关 SIMD 指令和寄存器的详细信息,请参阅Arm Architecture Reference Manual for the Armv8-A architecture profile。

  • ISA exploration tools以 XML 和 HTML 格式描述了 A64 指令集,包括 SIMD instructions。

  • Neon Intrinsics Reference提供有关 Neon intrinsics 的信息,C 和 C++ 程序员可以直接编写 Neon 代码,无需编写汇编代码。

  • Arm Community有一篇介绍 Neon 的文章:Arm Neon Programming Quick Reference。

下一步

Optimizing C Code with Neon Intrinsics tutorial为 Neon 编程新手提供了一个起点。本教程介绍了如何使用 Neon intrinsics,处理一个24位RGB图像的交错像素数据。

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

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

相关文章

探索海洋世界,基于YOLOv7【tiny/l/x】不同系列参数模型开发构建海洋场景下海洋生物检测识别分析系统

前面的博文中,开发实践过海底相关生物检测识别的项目,对于海洋场景下的海洋生物检测则很少有所涉及,这里本文的主要目的就是想要开发构建基于YOLOv7不同系列参数模型的海洋场景下的海洋生物检测识别系统。 前文已有相关实践,感兴…

如何在debian上实现一键恢复操作系统?

在Debian或任何其他Linux发行版上实现一键恢复操作系统,需要创建一个系统镜像或快照,并设置一个简单的方法来从该镜像恢复。以下是创建和恢复系统的基本步骤: 1. 创建系统镜像: 使用像dd,rsync或专门的备份工具&#…

STM32—触摸键

目录 1 、 电路构成及原理图 2 、编写实现代码 3、代码讲解 4、烧录到开发板调试、验证代码 5、检验效果 此笔记基于朗峰 STM32F103 系列全集成开发板的记录。 1 、 电路构成及原理图 触摸键简单的了解就是一次电容的充放电过程。从原理图可以看出,触摸键 …

4.网络游戏逆向分析与漏洞攻防-游戏启动流程漏洞-模拟游戏登陆器启动游戏并且完成注入

内容参考于:易道云信息技术研究院VIP课 上一个内容:游戏启动流程的分析 码云地址(master 分支):https://gitee.com/dye_your_fingers/titan 码云版本号:bcf7559184863febdcad819e48aaacad9f25d633 代码下…

C#上位机与三菱PLC的通信09---开发自己的通讯库(A-3E版)

1、A-3E报文回顾 具体细节请看: C#上位机与三菱PLC的通信05--MC协议之QnA-3E报文解析 C#上位机与三菱PLC的通信06--MC协议之QnA-3E报文测试 2、为何要开发自己的通讯库 前面开发了自己的A-1E协议的通讯库,实现了数据的读写,对于封装的通…

Kubernetes二进制搭建

目录 1.操作系统初始化配置(所有节点同此操作) 2.部署etcd集群 etcd概述 准备签发证书环境 在master01节点上操作(192.168.88.22) 在两个node节点上操作 总结: 3.部署docker引擎 4.部署Master组件 总结&…

SQL语法-DQL-测试练习

因篇幅原因,本篇承接此篇->第八篇:SQL语法-DQL-数据查询语言-CSDN博客 本篇是对于SQL语法DQL语句的练习,因水平和精力有限(就不像前两篇的DDL,DML那样自出练习了)直接照搬了【黑马程序员】在哔哩哔哩的…

有影响因子的《科教文汇》2024投稿攻略

《科教文汇》主要设有八面来风、教育观察、卷首语、教育管理、思政教育、教改教法、课程思政、基础教育、职业教育等栏目。 主管单位 安徽省科学技术协会 主办单位 安徽省老科技工作者协会、安徽省科学教育研究会 国内统一刊号CN34-1274/G, 国际标准刊号ISSN 16…

基于 Fluid+JindoCache 加速大模型训练的实践

作者:王涛(扬礼)、陈裘凯(求索)、徐之浩(东伝) 背景 时间步入了 2024 年,新的技术趋势,如大模型/AIGC/多模态等技术,已经开始与实际业务相结合,并开始生产落地。这些新的技术趋势不仅提高了算力的需求,也…

搭建XSS 测试平台

XSS 测试平台是测试XSS漏洞获取cookie并接收Web 页面的平台,XSS 可以做 JS能做的所有事,包括但不限于窃取cookie、后台增删改文章、钓鱼、利用XSS漏洞进 行传播、修改网页代码、网站重定向、获取用户信息(如浏览器信息、IP 地址)等。这 里使用的是基于x…

Windows下搭建EFK实例

资源下载 elasticSearch :下载最新版本的就行 kibana filebeat:注意选择压缩包下载 更新elasticsearch.yml,默认端口9200: # Elasticsearch Configuration # # NOTE: Elasticsearch comes with reasonable defaults for most …

Rust Vs Go:从头构建一个web服务

Go 和 Rust 之间的许多比较都强调它们在语法和初始学习曲线上的差异。然而,最终的决定性因素是重要项目的易用性。 “Rust 与 Go”争论 Rust vs Go 是一个不断出现的话题,并且已经有很多关于它的文章。部分原因是开发人员正在寻找信息来帮助他们决定下…

前端架构: 实现脚手架终端UI样式之ANSI escape code, Chalk, Ora介绍

在脚手架当中实现命令行的UI显示 1 )概述 在命令行中,如果想实现除传统的常规文本以外的内容比如想对字体进行加粗斜体下划线,包括对它改变颜色改变前景色改变后景色等等需要借助一个叫做 ANSI escape code 这样的一个概念它其实是一个标准&…

人工智能与机器学习行业新闻:颠覆企业运营方式的 AI 趋势

AI 推动业务转型 人工智能 (AI) 和机器学习已经在重塑各行各业的业务模式。AI 通过处理和整合数据支持战略决策的制定,其规模和速度远远超过了人脑。无疑,未来我们还将在 AI 领域取得许多重大突破,而拥有大量数据的行业可能会从人工智能革命…

Practical User Research for Enterprise UX

2.1 Why It’s Hard to Get Support for Research in Enterprises 2.1.1 Time and Budget Instead of answering the question “What dowe gain if we do this research?”, ask instead “What do we stand to lose if we don’t do the research?” 2.1.2 Legacy Thinkin…

鸿蒙会成为安卓的终结者吗?

随着近期鸿蒙OS系统推送测试版的时间确定,关于鸿蒙系统的讨论再次升温。 作为华为自主研发的操作系统,鸿蒙给人的第一印象是具有颠覆性。 早在几年前,业内就开始流传鸿蒙可能会代替Android的传言。毕竟,Android作为开源系统&…

迷你世界彩色建筑生成

local x0,y0,z00,20,0--起点坐标 local dx,dy,dz100,100,1--外切长方体横纵竖长度 local count,all0,dx*dy*dz--计数,总数 local m,k10000,0--单次生成方块数,无用循环值 local x,y,z0,0,0--当前坐标 local id600--方块id local demath.random(2,12)/2 -…

如何使用idea连接服务器上的mysql?

安全组进行开放 具体步骤 关闭防火墙 开放端口号 重启防火墙 firewall-cmd --reload在mysql进行修改配置 update user set host % where user root;flush privileges;使得其他网络也可以连接这个数据库 另外如果想要sqlyog或者其他图形化界面要连接到数据库可以看下面这…

创建无名信号量

#include<myhead.h> //创建无名信号量 sem_t sem;//定义生产者 void *task1(void *arg) {int num5;while(num--){sleep(1);printf("我生产了一辆特斯拉\n");//释放资源sem_post(&sem);}//退出线程pthread_exit(NULL); } //定义消费者 void *task2(void *ar…

Python: argparse基本用法

Python: argparse基本用法 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;【Matplotlib之旅&#xff1a;零基础精通数据可视化】 &#x1f4a1; 创作高质量博文&#xff0c;分享更多关于深度学习、PyTorch、Python领域的优质内容&#xff0…