【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.d

    ldr x0, =0x5555555511111111

    /* duplicate value to all elements */
    dup z0.d, x0

    ldr x1, =0x4444444422222222
    dup z1.d, x1

    add z1.d, p0/m, z1.d, z0.d

    ldr x1, =0xB0000000

    st1d {z1.d}, p0, [x1]
    ldr x0, [x1]

    ldp x29, x30, [sp], #0x10
    ret

测试效果:
可以看到向量寄存器 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),则生成的程序可能无法在该硬件上运行。因此,选择这些编译参数时需要确保目标环境与之兼容。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【TypeScript】泛型工具

跟着 小满zs 学 ts:学习TypeScript24(TS进阶用法-泛型工具)_ts泛型工具-CSDN博客 Partial 所有属性可选的意思Required 所有属性必选的意思Pick 提取部分属性Exclude 排除部分属性emit 排除部分属性并且返回新的类型 Partial 属性变为可选。…

1. C++面向过程

b站黑马程序员C课程学习笔记,图片存在github,可能需要翻墙才可见 一、C简介 1.1 C的产生及其特点 从C语言发展演变而来,解决了C语言中存在的一些问题,并增加了对面向对象程序设计方法的支持 与其他高级语言相比,C语…

【Unity学习笔记】第十八 基于物理引擎的日月地系统简单实现

转载请注明出处: https://blog.csdn.net/weixin_44013533/article/details/139701843 作者:CSDN|Ringleader| 目录 目标数学理论资源准备数据准备代码实现Unity准备效果展示注意事项后记 目标 目标:利用Unity的物理引擎实现 “日地月三体系统” 。 效果…

【Android面试八股文】请描述new一个对象的流程

文章目录 请描述new一个对象的流程JVM创建对象的过程检查加载分配内存内存空间初始化设置对象初始化请描述new一个对象的流程 JVM创建对象的过程 当JVM遇到一条new指令时,它需要完成以下几个步骤: 类加载与检查内存分配 并发安全性内存空间初始化设置对象信息对象初始化下图…

upload-labs第十二关教程

upload-labs第十二关教程 一、源代码分析代码审计 二、绕过分析截断绕过magic_quotes_gpc函数介绍关闭magic_quotes_gpc上传eval.png文件使用burpsuite进行抓包修改放包,查看是否上传成功使用中国蚁剑进行连接 一、源代码分析 代码审计 $is_upload false; $msg …

网络协议,OSI,简单通信,IP和mac地址

认识协议 1.讲故事 2004年,小明因为给他爹打电话(座机)费用太贵,所以约定一种信号,响一次是报平安,响两次是要钱,响三次才需要接通。 2.概念 协议:是一种约定,这种约…

基于CentOS Stream 9平台安装MySQL8.4.0 LTS

1. 安装之前 1.1 查看系统版本 [rootcoisini /]# cat /etc/redhat-release CentOS Stream release 9 1.2 查看cpu架构 [rootcoisini /]# lscpu 架构: x86_64 CPU 运行模式: 32-bit, 64-bit 2. MySQL官方下载https://dev.mysql.com/downloads/mysql/ 或…

Web期末复习指南(2w字总结)

前言:本文旨在梳理Web技术常包含的内容,阅读完整篇文章后会对整体有个系统的认知,从前端的HTML到后端的MySql,对于大概试题中可能会涉及的地方都有所分析,通篇提供了许多代码案例,供读者更好的理解。对于一…

MongoDB~事务了解;可调一致性模型功能与因果一致性模型功能分析

背景 MongoDB 从 3.0版本引入 WiredTiger 存储引擎之后开始支持事务,MongoDB 3.6之前的版本只能支持单文档的事务,从 MongoDB 4.0版本开始支持复制集部署模式下的事务,从 MongoDB 4.2版本开始支持分片集群中的事务。 根据官方文档介绍&…

代码随想录算法训练营第二十四天| (回溯) 77. 组合、 216.组合总和III、17.电话号码的字母组合

77. 组合 题目链接:77. 组合 文档讲解:代码随想录 状态:很多细节忘了 思路:先画图,然后可以发现,从1到n中选择k个数,可以看成是一个递归过程,这个递归的深度就是k。然后遍历当前这层…

企业化运维(2)_nginx

###1.nginx源码安装部署### ###2.平滑升级### (1)版本升级 当服务器在运行时,需要升级的情况下,平滑升级即就是不断开服务器就可以进行升级,最大限度保证数据的完整性。 下载nginx新版本软件,正常执行./c…

简易五子棋

简介 使用Java实现简易五子棋 规则介绍 游戏使用一个标准的1515方格的棋盘,双方分别用黑白两种颜色的棋子进行对战。黑子先行,双方轮流在空棋盘的交叉点上落子,每人一次只能落一子。游戏的目标是让自己的五颗棋子连成一线,这条…

JavaScript-函数

学习目标: 掌握函数 学习内容: 为什么需要函数函数使用函数传参函数返回值函数细节补充函数作用域匿名函数案例 为什么需要函数: 函数:function 是被设计为执行特定任务的代码块。说明:函数可以把具有相同或相似逻辑…

探索交互的本质:从指令到界面的演进与Linux基础指令的深入剖析

目录 1.指令 vs 界面//选读 1.1交互的需求 满足需求的第一阶段-指令 满足需求的第二阶段-界面 1.2 指令 和 界面交互 区别 2.操作系统介绍 2.1 举例说明 驱动软件层 2.2 为什么要有操作系统? 0x03 为什么要进行指令操作? 3.Linux基本指令 l…

Linux基础命令[29]-chown

文章目录 1. chown 命令说明2. chown 命令语法3. chown 命令示例3.1 修改属主3.2 修改属组3.3 修改属主和属组3.4 修改文件夹所属 4. 总结 1. chown 命令说明 chown:更改文件的用户或用户组,需要 root 用户或 sudo 权限的用户执行该命令。基本信息如下&…

深度学习(PyTorch)批注理解,建议边学可以边看这个笔记

前言 动手学习深度学习,内容丰富,但是对于初学者有很多晦涩难懂的地方,我将日常更新这篇文章以截图的形式,每天高强度学习四五个小时,精力缺乏,我认为,如果想学习这个深度学习,你需…

微信公众号打通与登录的实现

今天实现一下与微信公众号进行对接,通过扫描二维码的方式来进行注册与登录,获取用户的微信唯一标识作为用户的username,下面我们开始编写。 骨架建立: 建包: 第一步还是先将骨架建好,与网关骨架差不多&a…

堆栈溢出的攻击 -fno-stack-protector stack smash 检测

在程序返回的一条语句堆栈项目处&#xff0c;用新函数的起始地址覆盖&#xff0c;将会跳转到执行新函数。 现在系统对这个行为做了判断&#xff0c;已经无法实施这类攻击或技巧。 1&#xff0c;测试代码 #include <stdio.h> void cc() {printf("I am cc( )\n"…

Boom 3D软件下载及安装教程

简介&#xff1a; Boom 3D是适用于Mac和Windows系统的专业音效增强软件&#xff0c;旨在通过播放器&#xff0c;媒体或流媒体服务等介质&#xff0c;在不同类型的耳机上以3D环绕效果播放媒体内容。您无需使用昂贵的耳机或其他附加环绕音效增强器即可感受3D环绕音乐。 安 装 包…

【Python推导式秘籍】:一行代码的艺术,高效数据处理之道

文章目录 &#x1f68b;Python推导式&#x1f680;一、列表推导式&#x1f308;1. 了解推导式❤️2. 实践&#x1f4a5;3. 总结 &#x1f680;二、字典推导式&#x1f308;1. 了解字典推导式❤️2. 实践&#x1f4a5;3. 总结 &#x1f680;三、集合推导式&#x1f308;1. 了解集…