zl程序教程

您现在的位置是:首页 >  其它

当前栏目

[architecture]-armv8-aarch64种的SIMD/FP指令介绍

介绍 指令 Architecture armv8 Aarch64 fp
2023-09-27 14:26:31 时间

快速链接:
.
👉👉👉 个人博客笔记导读目录(全部) 👈👈👈

在这里插入图片描述

1、hardware floating-point 和 Software floating-point

在 ARMv8 中,hardware floating-point 是架构中的部分。AArch32 状态支持 Software floating-point,但 AArch64 状态不支持 Software floating-point

ARM 系统可能具有:

  • VFP 协处理器,即支持hardware floating-point
  • 没有浮点硬件,即支持hardware floating-point

如果您为带有硬件 VFP 协处理器的系统进行编译,则 ARM 编译器会使用它。
如果您为没有协处理器的系统编译,编译器会在软件中实现计算。例如,编译器选项-mfloat-abi=hard选择硬件 VFP 协处理器,该选项-mfloat-abi=soft指定算术运算将在软件中执行,而不使用任何协处理器指令。

2、armv8中的浮点型介绍

浮点寄存器组与 SIMD 寄存器使用相同的扩展寄存器,且是banked的。
在 AArch32 状态下,除了添加了一些符合 IEEE 754 标准的指令外,浮点支持与 VFPv4 基本没有变化。

AArch64 状态的浮点架构也是基于 VFPv4。主要区别如下:

  • 在 AArch64 状态下,128 位 SIMD 和浮点寄存器的数量从16个增加到32个。
  • 单精度寄存器不再打包成双精度寄存器,因此寄存器 Sx为 D x[31:0]。
  • 浮点硬件的存在是强制性的,因此不支持软件浮点链接。
  • AArch64 状态不支持早期版本的浮点架构,例如 VFPv2、VFPv3 和 VFPv4。
  • AArch32 或 AArch64 状态不支持 VFP 矢量模式。对向量浮点使用高级 SIMD 指令。
  • 添加了一些新说明,包括:
    半精度和双精度之间的直接转换。
    加载和存储对,替换加载和存储多个。
    融合乘加和乘减。
    IEEE 754-2008 兼容性说明

3、扩展寄存器的map图

在这里插入图片描述

  • 32个 128-bit registers V0-V31. (也叫q0-q31,其实是q0-q31直接map到了v0-v31)
  • 32个 64-bit registers D0-D31.
  • 32个 32-bit registers S0-S31.
  • 32个 16-bit registers H0-H31.
  • 32个 8-bit registers B0-B31.

4、存储指令对浮点型寄存器的操作

例如:

  • LDP Qt1, Qt2, addr //将两个连续的四字从addr寻址的内存中加载到128位Qt1和Qt2中
  • STP Qt1, Qt2, addr //将128位Qt1和Qt2的两个连续四字存储到addr寻址的内存中。

在这里插入图片描述
(使用是咧)
在这里插入图片描述

5、SIMD和浮点型的对比

基本概念:

  • VFP : 是指浮点型运算器的架构,如vfpv3 vfpv4,目前在armv8上使用的都是vfpv4
  • FP : 是指hardware float-point 指令
  • SIMD :是指SIMD指令
  • NEON :也一种提供SIMD指令的技术

补充NEON简介
NEON :Arm Neon 技术是适用于 Arm Cortex-A 和 Cortex-R 系列处理器的高级单指令多数据 (SIMD : Single Instruction Multiple Data) 的架构扩展。Neon 技术旨在通过加速音频和视频编码和解码、用户界面、2D/3D 图形和游戏来改善多媒体用户体验。Neon 还可以加速信号处理算法和功能,以加快音频和视频处理、语音和面部识别、计算机视觉和深度学习等应用的速度。

做为一名软件工程师,您可以通过以下方式使用ARM NEON技术

  • Neon intrinsics
  • Neon-enabled libraries
  • Auto-vectorization by your compiler
  • Hand-coded Neon assembler

总结: 我猜的哈,VFP是一个运算器(相当于ALU那种),它操作的是v0-v31寄存器(也可以说是q0-q31), 进行浮点型运算。而NEON技术,又提供了一些SIMD指令,也是使用VFP运算器,也是使用V0-V31寄存器。


参考

About floating-point support
Floating-point hardware
Extension register bank mapping in AArch64 state
NEON