当前位置: 首页 > news >正文

【ARMv8/ARMv9 硬件加速系列 3 -- SVE 指令语法及编译参数详细介绍】

文章目录

    • SVE 汇编语法
      • SVE 单通道谓词
      • SVE 测试代码
    • SVE 软件和库支持
      • SVE 编译参数配置
        • -march=armv8-a
        • +lse
        • +profile
        • +memtag
        • +sve2-aes
        • +sve2-bitperm
        • +crypto
        • +sve2
        • +sve2-sha3
        • +sve2-sm4

在这里插入图片描述

SVE 汇编语法

在介绍 SVE 汇编指令语法之前,先介绍下如何判断自己所使用的芯片是否实现了SVE功能,如下图所示,可以通过寄存器ID_AA64PFR0_EL1 来判断是否实现了 SVE 功能,可以看到通过这个寄存器也可以查看 AMU, MPAM 等功能的信息。
在这里插入图片描述
在这里插入图片描述

可以通过下面汇编代码判断SVE是否实现:

mrs     x0, ID_AA64PFR0_EL1
ubfx    x5, x0, #32, #4         // Extract the sve field
and     x5, x5, #0xff
cmp     x5, #1                 //  sve not present
b.ne    sve_not_present  

SVE 引入了以下重要的架构特性:

  • 单通道谓词(per-lane predication)
  • 聚集加载和分散存储(gather-load and scatter-store)
  • 谓词驱动的循环控制和管理
  • 用于软件控制的投机的向量分区
  • 扩展的浮点和水平归约

SVE 单通道谓词

SVE(Scalable Vector Extension)扩展提供了灵活的向量处理能力。SVE引入了谓词寄存器(如p0p15),这些寄存器用于控制向量操作的执行。谓词寄存器中的每一位对应向量寄存器中的一个元素,指示该元素是否应该参与到特定的向量操作中。

ADD Z0.D, P0/M, Z0.D, Z1.D 

活动元素 Z0Z1 相加并将结果放入 Z0P0 指示操作数的哪些元素是活动的和非活动的。 P0后面的 “M” 表示 Merging,表示将非活动元素合并,因此 Z0的非活动元素在ADD操作后将保持其原始值。

如果在 P0 之后是“Z”,即归零,则目标寄存器的非活动元素将在操作后归零。

SVE 测试代码

下面测试代码将向量寄存器z0.d 赋值0x5555555511111111, 将z1.d 赋值0x4444444422222222, 然后两者相加再赋值给z1.d,最后将结果通过x0返回给调用函数,通过 ptrue p0.d 将谓词寄存器p0中所有元素的控制位都设为1。然后通过st1d 将计算结果写入到地址0xB0000000处。

.type sve_test %function
.global sve_test
sve_test:stp	    x29, x30, [sp, #-0x10 * 1]!/* define a element as 64bits and fully true */ptrue   p0.dldr x0, =0x5555555511111111/* duplicate value to all elements */dup z0.d, x0ldr x1, =0x4444444422222222dup z1.d, x1add z1.d, p0/m, z1.d, z0.dldr x1, =0xB0000000st1d {z1.d}, p0, [x1]ldr x0, [x1]ldp x29, x30, [sp], #0x10ret

测试效果:
可以看到向量寄存器 z0.d + z1.d的值为0x9999999933333333

在这里插入图片描述

SVE 软件和库支持

要构建 SVE 应用程序,须选择支持 SVE 功能的编译器,例如:

  • GNU 工具 8.0+ 版支持 C/C++/Fortran 的 SVE 优化。
  • Arm Compiler for Linux,Arm Linux 的原生编译器。 Arm Compiler for Linux 18.0+ 版支持 C、C++ 和 Fortran 代码的 SVE 代码生成。 Arm Compiler for Linux 是 Arm Linux 用户空间工具解决方案 Arm Allinea Studio 的一部分。
  • Arm Compiler 6 是一个用于裸机应用程序开发的跨平台编译器,也支持从 6.12 版本开始的 SVE 代码生成。 除了编译器之外,您还可以依赖一些高度优化的 SVE 库,例如:
  • Arm 性能库是一组高度优化的数学例程,可以链接到您的应用程序。 Arm 性能库版本 19.3+ 支持 SVE 的数学库。 Arm 性能库是 Arm Compiler for Linux 的一部分。
  • 其他第三方数学库。

同时还需要配置相对应的编译参数,如下节内容。

SVE 编译参数配置

-march=armv8-a

这个参数指定了目标架构是 ARMv8-A。-march选项用于指定GCC应该为哪个架构生成代码,而ARMv8-A是ARM第八代架构,支持64位处理器,引入了很多新的特性和指令集,其中就包括

+lse

LSE(Large System Extension)扩展增加了一组针对原子操作的改进,有助于提高多核处理器上的同步性能。

+profile

这个选项可能是指启用对性能监控和分析特性的支持,但标准GCC文档中并未明确列出+profile作为一个独立的功能。通常,性能分析可以通过其他工具和编译器选项(如-pg用于gprof)来启用。

+memtag

启用内存标签扩展(Memory Tagging Extension, MTE),这是一种用于检测和预防内存相关错误(如越界访问和使用后释放)的安全特性。关于ARMv9 MTE 见文章:【ARM Cache 与 MMU 系列文章 7.5 – ARMv8/v9 MMU FEAT_XS(XS Attribute)与 FEAT_MTE2 介绍】。

+sve2-aes

启用支持 SVE2(Scalable Vector Extension 2)中的AES(Advanced Encryption Standard)指令。SVE2 是 SVE 的扩展,增加了更多的向量化操作,而AES指令用于加密算法。

+sve2-bitperm

启用SVE2中的位置换(Bit Permutation)指令,这些指令用于高效的位级操作和数据重组。

+crypto

启用加密指令支持,这通常指的是AES、SHA(Secure Hash Algorithm)和其他密码学相关的指令集。关于 AESSHA 详细介绍见文章【ARM 安全系列介绍 3-- Openssl 常用加密算法】。

+sve2

启用SVE2指令集支持。SVE2是对原始SVE指令集的扩展,提供了更广泛的向量操作和数据类型支持。

+sve2-sha3

启用SVE2中支持SHA-3加密哈希函数的指令。关于SHA 摘要算法见文章:【ARM 安全系列介绍 3.5 – 常见的摘要算法并应用举例】。

+sve2-sm4

启用SVE2中支持SM4(一种块加密标准,广泛用于中国的密码学应用)的指令。关于 SM4 加密算法见文章:【ARM 安全系列介绍 3.7 – SM4 对称加密算】

关于ARM GCC 编译的更多内容, 推荐阅读ARM GCC 编译系列专栏

在综合这些编译参数后,GCC将生成针对具有上述所有特性的ARMv8-A架构的代码。这通常意味着编译出的程序能够在支持这些特性的硬件上运行得更快、更安全。然而,如果目标硬件不支持某些特性(如SVE2或MTE),则生成的程序可能无法在该硬件上运行。因此,选择这些编译参数时需要确保目标环境与之兼容。

相关文章:

【ARMv8/ARMv9 硬件加速系列 3 -- SVE 指令语法及编译参数详细介绍】

文章目录 SVE 汇编语法SVE 单通道谓词SVE 测试代码 SVE 软件和库支持SVE 编译参数配置-marcharmv8-alseprofilememtagsve2-aessve2-bitpermcryptosve2sve2-sha3sve2-sm4 SVE 汇编语法 在介绍 SVE 汇编指令语法之前,先介绍下如何判断自己所使用的芯片是否实现了SVE功…...

Java版+ SaaS应用+接口技术RESTful API 技术开发的智慧医院HIS系统源码 专注医院管理系统研发 支持二开

Java版 SaaS应用接口技术RESTful API WebSocket WebService技术开发的智慧医院HIS系统源码 专注医院管理系统研发 支持二开 医院住院管理系统(Hospital Information System简称HIS)是一门医学、信息、管理、计算机等多种学科为一体的边缘科学&#xff…...

工业机器人远程运维,增强智慧工厂运营管理

1、需求背景 随着工业自动化技术的普及和工业机器人应用的增加,制造业对于生产线稳定性和效率的要求不断提高。然而,传统的现场监控方式存在着地理位置限制、实时监控难度大以及诊断能力有限等问题,迫切需要一种更具灵活性和效率的监控方式。…...

理解Python的元类

1.type()函数 type 函数是一个内置函数,用来获取一个对象的类型。它可以接受一个参数,返回这个参数的数据类型。type也可以用来创建类,type就是元类 x333 list["ab"] tuple (1, "a", True, 3.14) dict {name: Alice,…...

web前端黑马下载:探索学习资源的海洋

web前端黑马下载:探索学习资源的海洋 在数字化时代,Web前端技术日益成为互联网行业的核心驱动力。为了跟上这一趋势,众多学习者纷纷投身于Web前端的学习之中。而在这个过程中,“黑马”作为一个备受瞩目的品牌,其Web前…...

最新版jd-gui下载

对于java开发的工程师来说,jd-gui应该是经常会用到的工具了 官网的jd-gui目前只支持到JAVA13,更新版本JAVA编译出来的JAR包就反编译不出来了 此版本支持到了JAVA23 如果需要win以外的其他版本,可以查看我的其他上传 如果不想花积分&#…...

(051)FPGA时钟--->(001)时钟介绍

(001)时钟介绍 1 目录 (a)FPGA简介 (b)Verilog简介 (c)时钟简介 (d)时钟介绍 (e)结束 1 FPGA简介 (a)FPGA(Field Programmable Gate Array)是在PAL (可编程阵列逻辑)、GAL(通用阵列逻辑)等可编程器件的基础上进一步发展的产物。它是作为专用集成电…...

Java程序员英语单词通关:

Java程序员英语单词通关: abstract - 抽象的 boolean - 布尔值 break - 打断 byte - 字节 case - 情况,实例 catch - 捕获 char - 字符 class - 类 continue - 继续 default - 默认,通常 do - 做,运行 double - 双精度…...

数据库开发-Mysql03

目录 1. 多表查询 1.1 概述 1.1.1 数据准备 1.1.2 介绍 1.1.3 分类 1.2 内连接 1.3 外连接 1.4 子查询 1.4.1 介绍 1.4.2 标量子查询 1.4.3 列子查询 1.4.4 行子查询 1.4.5 表子查询 1.5 案例 2. 事务 2.1 介绍 2.2 操作 2.3 四大特性 3. 索引 3.1 介绍 3…...

0-1 背包问题(动态规划 查询背包元素)

描述 给定n种物品和一个背包,物品i的重量是Wi​,其价值为Vi​,问如何选择装入背包的物品,使得装入背包的物品的总价值最大? 在选择装入背包的物品时,对每种物品i只能有两种选择,装入或者不装入…...

elasticsearch快照生成与恢复

Elasticsearch快照生成与恢复的场景主要涉及到数据的备份与恢复需求。当需要对Elasticsearch集群中的数据进行备份,或者在数据丢失、损坏等情况下需要恢复数据时,就可以使用快照功能。 快照生成的方法通常包括以下步骤: 1、创建一个快照仓库…...

178.二叉树:最大二叉树(力扣)

代码解决 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* Tre…...

跨境电商中的IP隔离是什么?怎么做?

一、IP地址隔离的概念和原理 当我们谈论 IP 地址隔离时,我们实际上是在讨论一种网络安全策略,旨在通过技术手段将网络划分为不同的区域或子网,每个区域或子网都有自己独特的 IP 地址范围。这种划分使网络管理员可以更精细地控制哪些设备或用…...

【C++】stack、queue和deque的使用

💗个人主页💗 ⭐个人专栏——C学习⭐ 💫点击关注🤩一起学习C语言💯💫 目录 导读 一、stack 1. stack介绍 2. stack使用 二、queue 1. queue介绍 2. queue使用 三、deque 1. deque介绍 2. deque的…...

通过SSH远程登录华为设备

01 进入系统编辑视图 system-view Enter system view, return user view with return command. 02 创建本地RSA密钥对 [HUAWEI]rsa local-key-pair creat The key name will be:HUAWEI_Host The range of public key size is (2048 ~ 2048). NOTE: Key pair generation will ta…...

算法day27

第一题 515. 在每个树行中找最大值 首先是遍历每层的节点,将每一层最大值的节点的值保留下来,最后将所有层的最大值的表返回;具体的遍历每层节点的过程如上一篇故事; 综上所述,代码如下: /*** Definition …...

记录一次CTF图片拼图安装工具montage+gaps成功步骤以及踩坑全过程

安装图片拼接工具montage: 1.安装 使用pip install montage无法安装montage工具的师傅可以尝试下面的方法 #Debian apt-get install graphicsmagick-imagemagick-compat#Ubuntu apt-get install graphicsmagick-imagemagick-compat#Alpine apk add imagemagick6#…...

深入剖析人才管理的关键要素:“选、用、育、留”四大核心要素

在当今这个日新月异的商业时代,企业的成功不再仅仅取决于资金、技术或市场策略,而更多地依赖于企业所拥有的人才资源。有效的人才管理策略,尤其是“选、用、育、留”四大核心要素,已成为推动企业持续发展的关键。 一、选&#xff…...

【C++】类的默认成员函数

类的默认成员函数 类的六个默认成员函数构造函数构造函数的概念构造函数的特性 析构函数析构函数的概念析构函数的特性 构造函数与析构函数的调用顺序拷贝构造拷贝构造的概念拷贝构造的特性赋值运算符重载运算符重载赋值运算符重载前置与后置重载输入输出流重载 const修饰成员实…...

归并排序!

归并排序 https://articles.zsxq.com/id_g23e5o3lg87e.html 目录 归并排序算法思想命名由来算法描述sortList函数mergeSort函数 源代码 算法思想 通过将当前乱序的数组分成两个部分,分别进行「递归调用」,利用两个指针将数据元素以此比较,选…...

深入探讨:Spring与MyBatis中的连接池与缓存机制

深入探讨:Spring与MyBatis中的连接池与缓存机制 引言 在现代应用程序开发中,性能优化是一个永恒的话题。而在企业级Java应用开发中,Spring和MyBatis是两种非常流行的框架,它们的连接池和缓存机制对应用程序的性能有着至关重要的…...

[C#]使用C#部署yolov10的目标检测tensorrt模型

【测试通过环境】 win10 x64vs2019 cuda11.7cudnn8.8.0 TensorRT-8.6.1.6 opencvsharp4.9.0 .NET Framework4.7.2 NVIDIA GeForce RTX 2070 Super cuda和tensorrt版本和上述环境版本不一样的需要重新编译TensorRtExtern.dll,TensorRtExtern源码地址:T…...

Linux CFS 调度器 (1):概述

文章目录 1. 前言2. CFS 调度器2.1 概述2.2 一些实现细节2.3 运行队列:红黑树2.4 一些特征2.5 调度策略2.6 调度器类别2.7 扩展:组调度 3. 参考资料 1. 前言 限于作者能力水平,本文可能存在谬误,因此而给读者带来的损失&#xff…...

HBase中Master初始化错误~

ERROR:org.apache.hadoop.hbase.PleaseHoldException:Master is initializing 1、停止HBase运行 2、启动zookeeper中的zkCli.sh服务 ./zookeeper/bin/zkCli.sh 3、执行完毕显示以下结果,删除habse文件夹 4、重新启动HBase即可。...

Hive on Spark版本兼容性

Hive on Spark仅在特定版本的Spark上进行测试,因此给定版本的Hive只能保证与特定版本的Spark一起工作。其他版本的Spark可能与给定版本的Hive一起工作,但不能保证。以下是Hive版本及其对应的Spark版本列表: 详情参考官方文档:http…...

grep命令知多少

引言 1. grep命令的重要性 在Linux系统中,grep是一个不可或缺的文本处理工具,它允许用户快速搜索文件中的文本模式。这个命令的名称来源于Global Regular Expression Print,即全局正则表达式打印,它源自UNIX早期的ed文本编辑器。…...

[java]windows和linux下jdk1.8安装包所有版本系列下载地址汇总

【windows jdk1.9系列下载地址】 序号java版本下载地址1java-jdk9-jdk-9.0.1-windows-x64-bin.zip点我下载 【windows jdk1.8系列下载地址】 序号java版本下载地址1java-jdk1.8-jdk-8u202-windows-x64.zip点我下载2java-jdk1.8-jdk-8u201-windows-x64.zip点我下载3java-jdk1…...

Electron+Vue开源软件:洛雪音乐助手V2.8畅享海量免费歌曲

洛雪音乐助手是一款功能全面且完全免费的开源音乐软件,支持在Windows、Android和iOS平台上使用。 平台支持: 桌面版:采用Electron Vue技术栈开发,支持Windows 7及以上版本、Mac OS和Linux,具有广泛的用户群体覆盖。 …...

CAPL通过addTimeToMeasurementStartTime或者getLocalTime获取本地时间

文章目录 getLocalTimeaddTimeToMeasurementStartTimegetLocalTime long tm[9]; getLocalTime(tm); // now tm contains the following entries: // tm[0] = 3; (seconds) // tm[1] = 51; (minutes) // tm[2] = 16; (hours)...

谷歌上架,APP被移除了,没封号,换个包名还能重新提审上架?

对于在Google Play上架应用的开发者来说,尤其是那些矩阵式上架马甲包的开发者,可能已经遭遇过无数次应用被暂停或移除的情况了。通常这种情况下,账号也随之会被封,且大多数开发者认为,没有立马收到封号邮件的话&#x…...