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

news2024/11/28 7:46:07

文章目录

    • 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),则生成的程序可能无法在该硬件上运行。因此,选择这些编译参数时需要确保目标环境与之兼容。

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

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

相关文章

算法01 递推算法及相关问题详解【C++实现】

目录 递推的概念 训练:斐波那契数列 解析 参考代码 训练:上台阶 参考代码 训练:信封 解析 参考代码 递推的概念 递推是一种处理问题的重要方法。 递推通过对问题的分析,找到问题相邻项之间的关系(递推式&a…

践行国产化替代,优刻得私有云勇当先锋

编辑:阿冒 设计:沐由 阳泉,十万火急! 位于太行山西麓的山西省阳泉市,是一座历史悠久、底蕴深厚、资源丰富的名城,拥有超百万常住人口,国内生产总值在2022年成功跨越千亿元大关。然而&#xff0c…

leetcode 56合并区间

思路 合并就是首先应该按照left左边界排序,排完序以后,如果i的左边界小于等于i-1的右边界,说明有重合,此时这两个可以合并,右边界应该取最大值。 代码 排序 我是定义了一个类,存储左右边界,先将数组转化…

传输层udp和tcp协议格式

UDP协议 UDP协议端格式 udp的前八个字节是报头,后面部分就是有效载荷。而目的端口号就保证了udp向应用层交付的问题。 而针对于报头和有效载荷分离是根据固定八字结的报头长度。数据的长度就是取决于报头中udp长度字段的大小来确定udp报文长度,因此也可…

【Matlab编程学习】 | matlab语言编程基础:常用图形绘制基础学习

🎩 欢迎来到技术探索的奇幻世界👨‍💻 📜 个人主页:一伦明悦-CSDN博客 ✍🏻 作者简介: C软件开发、Python机器学习爱好者 🗣️ 互动与支持:💬评论 &…

C++面向对象程序设计 - 函数库

C语言程序中各种功能基本上都是由函数来实现的,在C语言的发展过程中建立了功能丰富的函数库,C从C语言继承了些函数功能。如果要用函数库中的函数,就必须在程序文件中包含文件中有关的头文件,在不同的头文件中,包含了不…

解决Unity-2020 安卓异形屏黑边

背景 Unity 2020.3.17 版本开发的游戏,打apk包,发现两个问题 如图下午所示,实体白色导航栏,阻挡了整个安卓UI界面,难看还影响美观。 安卓系统 12-13 版本手机,异形屏。一侧安全区黑边遮挡,占空间…

pyinstall打包exe报错

1- 报错 Please install pywin32-ctypes. 前提:python安装路径中已经安装了pywin32-ctypes。 运行pyinstaller报错 PyInstaller cannot check for assembly dependencies. Please install pywin32-ctypes. 解决思路: python安装路径下Lib\site-packa…

远程连接路由器:方法大全与优缺点解析

远程连接路由器的方式主要有以下几种,以下是每种方式的详细说明及其优缺点: 使用Web浏览器登录 方法:通过配置路由器的远程管理功能,允许用户通过互联网浏览器访问路由器的管理界面。用户只需输入路由器的公网IP地址或域名&#…

JavaSE 面向对象程序设计 包装类 纯理论详解以及相关综合练习

包装类 实质 基本数据类型对应的引用数据类型 把基本数据类型变成对象 创建对象后 在栈内存里开辟空间 在堆内存里开辟空间 成员变量记录数值 栈内存记录对象的地址 包装类就是创建一个对象,对象记录相应的数据值 用一个对象把数据包装起来 作用 Java中万…

[leetcode]将二叉搜索树转化为排序的双向链表

. - 力扣(LeetCode) /* // Definition for a Node. class Node { public:int val;Node* left;Node* right;Node() {}Node(int _val) {val _val;left NULL;right NULL;}Node(int _val, Node* _left, Node* _right) {val _val;left _left;right _rig…

新火种AI|苹果终于迈进了AI时代,是创新还是救赎?

作者:一号 编辑:美美 苹果的AI战略,能够成为它的救命稻草吗? 苹果,始终以其独特的创新能力引领着行业的发展方向。在刚结束不久的2024年的全球开发者大会(WWDC)上,苹果再次证明了…

iSlide软件下载附加详细安装教程

​iSlide 是一款基于 PPT 的插件工具,包含 52 个设计辅助功能,9 大在线资源库,超 50 万专业 PPT 模板/素材 支持 macOS 和 Windows 系统(兼容 Office 和 WPS)。 可以对一组元素(文本框,图形&…

制作自己的 @OnClick、@OnLongClick(告别 setOnClickListener,使用注解、反射和动态代理)

前言 前面我们说过 ButterKnife 这个库,这个库实现不仅实现了 View 的绑定,而且还提供了大量的注解如 BindView、OnClick、OnLongClick 等来简化开发过程中事件绑定。而这些功能的实现是通过 APT 也就是注解处理器,在编译期间生成 Java 代码…

GStreamer——教程——基础教程2:GStreamer concepts

基本教程2:GStreamer概念 1,目标 之前的教程展示了如何自动构建管道。现在我们将手动构建一条pipeline:初始化每一个element并将它们连接起来。在此过程中,我们将学习: 什么是GStreamer元素以及如何创建一个。 如何…

redis设计与实现(五)RDB与AOF持久化

RDB持久化 因为Redis是内存数据库,它将自己的数据库状态储存在内存里面,所以如果不想办法将储存在内存中的数据库状态保存到磁盘里面,那么一旦服务器进程退出,服务器中的数据库状态也会消失不见。 为了解决这个问题,…

CC2500和CC1101移植说明

主要通过如何移植、移植注意、关于芯片配置、如何生成导出配置四大步骤来说明CC2500和CC1101移植 首先通过下图1这个宏进行选择 如何移植 要移植的部分在 CC2500_hal.c 和 CC2500_hal.h中, 搜索 "//移植" 就可以定位到 库 所需的依赖, 需要根据 您的环境实现这些…

sap怎么批量给信息记录打上删除标识

1.MEMASSIN-----事务代码 2.选择完成字段 3.根据条件查询需要冻结的信息记录 4.输入查询条件 5.全部勾选完成标识,点击保存,即可冻结完成

AI Stable diffusion 报错:稳定扩散模型加载失败,退出

可能是内存不够,看看你最近是加了新的大的模型,可以把你的stable-diffusion-webui\models\Stable-diffusion目录下的某个ckpt删除掉,可能ckpt太大,无法加载成功; Stable diffusion model failed to load, exiting 如图…

【RAM】利用AWS Resource Access Manager服务实现与其他账户共享AWS资源

文章目录 1. 先决条件说明2. 导航至ARM控制面板3. 指定资源共享详细信息4. 关联托管式权限5. 向委托人授予访问权限6. 查看和创建7. 查看由我共享的资源8. 资源共享详细信息9. 取消关联10. 参考链接11. 生成式AI书籍推荐📢 1. 先决条件说明 报错现象: …