性能优化(CPU优化技术)-ARM Neon详细介绍

本文主要介绍ARM Neon技术,包括SIMD技术、SIMT、ARM Neon的指令、寄存器、意图为读者提供对ARM Neon的一个整体理解。

🎬个人简介:一个全栈工程师的升级之路!
📋个人专栏:高性能(HPC)开发基础教程
🎀CSDN主页 发狂的小花
🌄人生秘诀:学习的本质就是极致重复!

目录

1 并行技术的几种方式

1.2 SISD

1.3 MIMD

1.4 SIMD

1.4.1 概念和特点

1.4.2 产生的原因

1.5 MISD

1.6 SIMT

2 NEON介绍

2.1 ARM Neon 特点

2.2 ARM Neon 数据类型

2.2.1 Neon 数据类型的命名格式

2.2.2 支持的数据类型      

2.3 ARM Neon 指令

2.4 Neon 寄存器

2.4.1 Neon一般的执行流程

2.4.2 Neon 寄存器

2.5 Neon数据处理指令分类

3 一般使用ARM Neon优化的几种方式


1 并行技术的几种方式

        并行计算根据费林分类法,将指令流和数据流的几种不同的方式分成四种计算机类型:SISD、MISD、MIMD、SIMD。NVIDIA CUDA设计出SIMT技术区别于这四种。

1.2 SISD

        SISD是单指令流单数据流(Single Instruction Single Data)的缩写,是一种计算机体系结构。在SISD中,所有的指令和数据都按照一定的顺序串行执行,即每条指令只处理一个操作数,且每个操作数只在一条指令中使用。

        SISD的特点是简单、直观,但效率较低。因为所有指令和数据都必须按顺序执行,所以无法充分利用现代处理器的并行计算能力。不过,由于其实现相对简单,所以在一些简单的应用场景下仍然有一定的应用价值。

1.3 MIMD

        MIMD是多指令流多数据流(Multiple Instruction Multiple Data)的缩写,是一种计算机体系结构。在MIMD中,可以同时有多条指令在不同的处理单元中并行执行,并且每个处理单元都可以同时处理多个数据。

        与SISD和MISD相比,MIMD能够更好地利用现代处理器的并行计算能力,提高程序的执行效率。由于每个处理单元都可以独立地执行指令和处理数据,所以MIMD也被称为“真正并行”的计算机体系结构。

MIMD需要更复杂的控制逻辑来协调不同处理单元之间的操作,增加了实现难度。但是,随着多核处理器的普及和硬件技术的发展,MIMD已经成为现代高性能计算机的主要架构之一。

1.4 SIMD

1.4.1 概念和特点

        SIMD是单指令流多数据流(Single Instruction Multiple Data)的缩写,是一种计算机体系结构。在SIMD中,所有的指令都按照一定的顺序串行执行,但是每个指令可以同时处理多个数据。

        与SISD和MISD相比,SIMD能够更好地利用现代处理器的并行计算能力,提高程序的执行效率。由于每个指令可以同时处理多个数据,所以SIMD也被称为“向量化”的计算机体系结构。

        SIMD需要更复杂的控制逻辑来协调不同数据之间的操作,增加了实现难度。但是,随着硬件技术的发展,SIMD已经成为现代高性能计算机、图形处理器和数字信号处理器等领域的主要架构之一。

1.4.2 产生的原因

        许多程序需要处理大量的数据集,而且很多都是由少于32bits的位数来存储的。比如在视频、图形、图像处理中的8-bit像素数据;音频编码中的16-bit采样数据等。在诸如上述的情形中,很可能充斥着大量简单而重复的运算,且少有控制代码的出现。因此,SIMD就擅长为这类程序提供更高的性能。比如大量的数据集、2D、3D图像、视频、音频、色彩转换、流体力学、气象学、天体物理等。              

1.5 MISD

        MISD是多指令流单数据流(Multiple Instruction Single Data)的缩写,是一种计算机体系结构。在MISD中,指令和数据都按照一定的顺序串行执行,但是可以同时有多条指令在不同的处理单元中并行执行。

        与SISD相比,MISD能够更好地利用现代处理器的并行计算能力,提高程序的执行效率。但是,由于指令和数据仍然必须按顺序执行,所以仍然存在一些限制。此外,MISD需要更复杂的控制逻辑来协调不同处理单元之间的操作,增加了实现难度

1.6 SIMT

        SIMT是单指令流多线程(Single Instruction, Multiple Threads)的缩写,是一种并行计算模型。在SIMT中,所有的线程都执行相同的指令,但是每个线程可以处理不同的数据。

        与SIMD相比,SIMT能够更好地利用现代处理器的并行计算能力,提高程序的执行效率。由于每个线程可以独立地处理不同的数据,所以SIMT也被称为“线程化”的计算机体系结构。

        SIMT需要更复杂的控制逻辑来协调不同线程之间的操作,增加了实现难度。但是,随着多核处理器和硬件技术的发展,SIMT已经成为现代高性能计算机、图形处理器和游戏机等领域的主要架构之一。

        类似 CPU 上的多线程,所有的核心各有各的执行单元,数据不同,执行的命令是相同的。多个线程各有各的处理单元,和 SIMD 共用一个 ALU 不同。

SIMT

        

2 NEON介绍

         ARM NEON是ARM推出的一种CPU扩展技术SIMD,一般在Cortex-A应用处理器上和少量的Cortex-R处理器上支持Neon技术,使用SIMD方式可以在一定程度上提升CPU的运算效率。

        由于现代处理器的寄存器、ALU都是为了32位或者64为设计的,但是这些大量的数据基本都是8位和16位的,因此如果每次执行一个数据就会很浪费寄存器的宽度,由此引入了Neon 的SIMD技术,通过一条指令控制同时处理多个数据来提高效率,这样就提高了寄存器和ALU的使用效率。

2.1 ARM Neon 特点

        (1)一般每个ARM核都有一个NEON单元,CPU与NEON共用一个ALU,相对于SIMT是每个核都有一个ALU。

        (2)NEON技术最早出现在ARMv7上,ARMv7有16个128位寄存器(Q),32个64位寄存器(D)。ARMv8有32个128位寄存器(Q),64个64位寄存器(D),Q寄存器物理上不存在,但是逻辑上存在,其核心是D寄存器组成的。因此优化时注意,Q寄存器和D寄存器的不能重复使用。

        (3)ARM NEON技术是一种SIMD,即单指令多数据技术,是区别于SISD和SIMT的不同的技术,对于提高CPU运行效率,有很大的作用。

       (4) NEON技术可以用于多线程,并且共享常规CPU的内存和cache,Cache一般有三级Cache L1、L2、L3。

2.2 ARM Neon 数据类型

2.2.1 Neon 数据类型的命名格式

        (1) <type><size>x<number_of_lanes>_t

        (2)<type><size>x<number_of_lanes>x<length_of_array>_t

             例如 float32x4x2_t u1 表示定义两个128位向量寄存器数据 ,用两个128位寄存器存储,

              每个寄存器存储4个float类型数据。

               内部的构造是

                        struct float32x4x2_t

                        {

                                float32x4_t val[2];

                        }float32x4x2_t;

               取每个寄存器数据的格式:

                        u1.val[0]; u1.val[1];

2.2.2 支持的数据类型      

       对64位D寄存器或者是128位Q寄存器拆分,比如int8x16_t指的是int8类型的16个数据存储在一个128位Q寄存器中,Q寄存器是虚拟的,真实并不存在;int8x8_t指的是int8类型的8个数据存储在一个64位D寄存器中。

        主要支持的数据类型如下:

        注:F16不适用于数据处理运算,只用于数据转换,仅用于实现半精度体系结构扩展的系统。

多项式算术在实现某些加密、数据完整性算法中非常有用。

      一个向量寄存器存储数据的格式如下图,通过一次处理多个数据,可以提高效率大概10倍左右,由于寄存器之间有专门的通道,处理的速度极快,因此使用SIMD的编程方式可以使得程序的性能变得优秀。

2.3 ARM Neon 指令

ARM Neon 指令集可以分为以下几类:

        1. 加载和存储指令:用于从内存中加载数据或将数据存储到内存中。包括单精度浮点数的加载和存储指令,以及双精度浮点数的加载和存储指令。

        2. 算术运算指令:用于执行各种算术运算,包括加法、减法、乘法、除法等。这些指令可以对单精度浮点数和整数进行操作,也可以对双精度浮点数进行操作。

        3. 逻辑运算指令:用于执行各种逻辑运算,包括与、或、非等。这些指令可以对单精度浮点数和整数进行操作,也可以对双精度浮点数进行操作。

        4. 比较指令:用于比较两个值的大小关系,包括相等、不等、大于、小于等。这些指令可以对单精度浮点数和整数进行操作,也可以对双精度浮点数进行操作。

        5. 移位指令:用于将一个值向左或向右移动指定的位数。这些指令可以对单精度浮点数和整数进行操作,也可以对双精度浮点数进行操作。

        6. 向量数据处理指令:用于对多个数据进行并行处理,包括向量加法、向量减法、向量乘法等。这些指令可以对单精度浮点数和整数进行操作,也可以对双精度浮点数进行操作。

2.4 Neon 寄存器

2.4.1 Neon一般的执行流程

        第一步:从内存load数据到vector寄存器

        第二步:使用Intrinsic指令或者汇编在ALU执行相应的运算

        第三步:将执行后的结果save到内存

2.4.2 Neon 寄存器

 ARMv7上寄存器关系:

        

        

    ARMv7上寄存器的组合:(一个Q寄存器对应2个D寄存器)

  • 16×128-bit寄存器(Q0-Q15);
  • 或32×64-bit寄存器(D0-D31)
  • 或上述寄存器的组合。

    映射关系:

  • D<2n> 映射到 Q 的最低有效半部;
  • D<2n+1> 映射到 Q 的最高有效半部;

    Neon寄存器存储数据的几种形式:

2.5 Neon数据处理指令分类

        一般分为普通指令、长指令、宽指令、窄指令、饱和指令等。

        普通指令(Normal instructions 

        可以对任意类型的向量进行操作,并生成与操作数向量相同大小和通常相同类型的结果向量。
        长指令(Long instructions

        对双字向量操作数进行操作,并生成四倍长字向量结果。结果元素的宽度通常是操作数的两倍,并且类型相同。长指令使用在指令中添加字母L来指定。
        宽指令(Wide instructions)

        对一个双字向量操作数和一个四倍长字向量操作数进行操作,生成四倍长字向量结果。结果元素和第一个操作数都是第二个操作数的元素宽度的两倍。宽指令在指令中添加字母W来指定。
        窄指令(Narrow instructions)

        对四倍长字向量操作数进行操作,并生成双字向量结果。结果元素的宽度通常是操作数元素宽度的一半。窄指令使用在指令中添加字母N来指定。
        饱和变体(Saturating variants)
        在ARM中,饱和算法如下:
                对于有符号饱和运算,如果结果小于 -2^n,则返回的结果将为 -2^n;
                对于无符号饱和运算,如果整个结果将是负值,那么返回的结果是 0;如果结果大于 2^n - 1,则返回的结果将为 2^n - 1;
                在NEON中,饱和算法通过在V和指令助记符之间使用Q前缀来指定饱和指令,原理与上述内容相同。

        来自官方文档的一些参考说明图:

3 一般使用ARM Neon优化的几种方式

        a.通过使用编译选项增加-O3 和针对Neon的优化编译选项,对于一些简单的运算,让编译器

           自动优化,效果会出奇的好

        c.通过使用一些已经优化好的ARM Neon库来加速程序

        d.使用Intrinsic Instruction 来编写SIMD相关的代码优化,编写该类程序时需要注意不同的指

           令速度有所不同,选择合适的指令也是优化的一个难点,同时要对数据进行一个预取,利用

           cache的高性能来提高效率,也要注意不要做超过寄存器长度的处理。

        e.使用ARM Neon汇编来提高运行效率

🌈我的分享也就到此结束啦🌈
如果我的分享也能对你有帮助,那就太好了!
若有不足,还请大家多多指正,我们一起学习交流!
📢未来的富豪们:点赞👍→收藏⭐→关注🔍,如果能评论下就太惊喜了!
感谢大家的观看和支持!最后,☺祝愿大家每天有钱赚!!!

下一节将介绍如何在一个Android手机进行ARM Neon的优化测试,并且包括Intrinsic指令的使用。

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

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

相关文章

2024年总结的前端学习路线分享(学习导读)

勤学如春起之苗&#xff0c;不见其增&#xff0c;日有所长 。辍学如磨刀之石&#xff0c;不见其损&#xff0c;日有所亏。 在写上一篇 2023年前端学习路线 的时候&#xff0c;时间还在2023年初停留&#xff0c;而如今不知不觉时间已经悄然来到了2024年&#xff0c;回顾往昔岁月…

三、Mysql安全性操作[用户创建、权限分配]

一、用户 1.创建用户 CREATE USER test1localhost identified BY test1;2.删除用户 DROP USER test2localhost;二、权限分配 1.查询用户权限 SHOW GRANTS FOR test1localhost;2.分配权限 # 分配用户所有权限在for_end_test库的test1表 GRANT ALL PRIVILEGES ON for_end_t…

Pycharm引用其他文件夹的py

Pycharm引用其他文件夹的py 方式1&#xff1a;包名设置为Sources ROOT 起包名的时候&#xff0c;需要在该文件夹上&#xff1a;右键 --> Mark Directory as --> Sources ROOT 标记目录为源码目录&#xff0c;就可以了。 再引用就可以了 import common from aoeweb impo…

OCP NVME SSD规范解读-3.NVMe管理命令-part2

NVMe-AD-8&#xff1a;在某些情况下&#xff08;如Sanitize命令、Format NVM命令或TCG Revert方法后数据被清除&#xff09;&#xff0c;设备应允许读取已清除的LBAs而不产生错误&#xff0c;并在最后一次清除完成后&#xff0c;对未写入LBAs的读取返回所有零值给主机 NVMe-AD…

鸿蒙开发之android对比开发《基础知识》

基于华为鸿蒙未来可能不再兼容android应用&#xff0c;推出鸿蒙开发系列文档&#xff0c;帮助android开发人员快速上手鸿蒙应用开发。 1. 鸿蒙使用什么基础语言开发&#xff1f; ArkTS是鸿蒙生态的应用开发语言。它在保持TypeScript&#xff08;简称TS&#xff09;基本语法风…

二叉树题目:根到叶路径上的不足结点

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;根到叶路径上的不足结点 出处&#xff1a;1080. 根到叶路径上的不足结点 难度 6 级 题目描述 要求 给定二叉树的根结点 root \texttt{root} root…

关键字:throw关键字

在 Java 中&#xff0c;throw关键字用于抛出异常。当程序执行过程中发生意外情况&#xff0c;如错误的输入、资源不足、错误的逻辑等&#xff0c;导致程序无法正常执行下去时&#xff0c;可以使用throw关键字抛出异常。 以下是使用throw关键字的一些示例&#xff1a; 抛出异常…

服装店收银系统不只是收银 还需要线上商城和线上批发

一个综合性的服装店收银系统可以结合线上商城和线上批发功能&#xff0c;提供以下特点和优势&#xff1a; 线上商城&#xff1a;将服装店的商品信息同步到线上商城平台&#xff0c;让顾客可以通过网站或移动应用程序浏览和购买商品。线上商城可以实现在线支付、订单跟踪、售后服…

MySQL数据库索引优化

一、引言 1. 索引的重要性 MySQL数据库索引的重要性主要体现在&#xff0c;一是查询速度优化&#xff0c;索引可以极大地提高查询速度。对于没有索引的表&#xff0c;MySQL必须进行全部扫描来找到所需的行&#xff0c;如果表中数据量很大&#xff0c;那么通常很慢。通过适当的…

大数据规模存储的几个核心问题

文章目录 三个关键问题RAID&#xff08;独立磁盘冗余阵列&#xff09;RAID是如何解决关于存储的三个关键问题&#xff1f;水平伸缩 大规模数据存储都需要解决几个核心问题&#xff0c;这些问题都是什么呢&#xff1f; 三个关键问题 1.数据存储容量的问题 既然大数据要解决的…

图像分割实战-系列教程1:语义分割与实例分割概述

&#x1f341;&#x1f341;&#x1f341;图像分割实战-系列教程 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Pycharm中进行 本篇文章配套的代码资源已经上传 下篇内容&#xff1a; Unet系列算法 1、图像分割任务概述 1.1 图像分割 分割任务就是在原始图像…

Elasticsearch8集群部署

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 本文记录在3台服务器上离线搭建es8.7.1版本集群。 1. 修改系统配置 1.1 hosts配置 在三台es节点服务器加入hostname解析&…

加法器原理详解

加法器的介绍与原理分析 什么是加法器&#xff1f; 加法器是一种数字电路&#xff0c;用于将两个二进制数相加并输出它们的和。 如何实现加法器 要讨论如何实现加法器就要先从只有一位的数字先进行考虑 一位二进制数相加 不考虑来自低位的进位——半加器 对于一位二进制…

【VTK三维重建-体绘制】第四期 VTK中GPU加速

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ&#xff1a;870202403 前言 上期内容讲到VTK的体绘制技术vtkGPUVolumeRayCastMapper&#xff0c;本文分享VTK中GPU加速的相关内容&#xff0c;希望对各位小伙伴有所帮助&#xff01; 感谢各位小伙伴的点赞关注&#xff0c;小易会…

机器学习的分类与经典算法

机器学习算法按照学习方式分类&#xff0c;可以分为有监督学习&#xff08;Supervised Learning&#xff09;、无监督学习&#xff08;Unsupervised Learning&#xff09;、半监督学习&#xff08;Semi-supervised Learning&#xff09;、强化学习&#xff08;Reinforcement Le…

图文证明 等价无穷小替换

等价无穷小替换 定义 等价无穷小是无穷小之间的一种关系&#xff0c;指的是&#xff1a;在同一自变量的趋向过程中&#xff0c;若两个无穷小之比的极限为1&#xff0c;则称这两个无穷小是等价的。无穷小等价关系刻画的是两个无穷小趋向于零的速度是相等的。 设当 x → x 0 时…

Android 接入第三方数数科技平台

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、数数科技平台是什么&#xff1f;二、使用步骤1.集成SDK2. 初始化3. 发送事件和设置账号id4. 验证发送事件是否成功 小结 前言 一个成熟的App必然不可缺少对…

算法学习系列(十四):并查集

目录 引言一、并查集概念二、并查集模板三、例题1.合并集合2.连通块中点的数量 引言 这个并查集以代码短小并且精悍的特点&#xff0c;在算法竞赛和面试中特别容易出&#xff0c;对于面试而言&#xff0c;肯定不会让你去写一两百行的代码&#xff0c;一般出的都是那种比较短的…

服务器的TCP连接限制:如何优化并提高服务器的并发连接数?

&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308; 欢迎关注公众号&#xff08;通过文章导读关注&#xff09;&#xff0c;发送【资料】可领取 深入理解 Redis 系列文章结合电商场景讲解 Redis 使用场景、中间件系列…

mysql基础-表操作

环境&#xff1a; 管理工具&#xff1a;Navicat 数据库版本&#xff1a;5.7.37 mysql的版本&#xff0c;我们可以通过函数&#xff0c;version()进行查看&#xff0c;本次使用的版本如下&#xff1a; 目录 1.管理工具 1.1创建表 1.2.修改表名 1.3.复制表 1.4.删除表 2…