目录
- AArch64浮点与NEON技术
- AArch64中NEON和浮点的新特性
- NEON和浮点架构
-
- 浮点
- 标量数据和 NEON
- 浮点参数
- AArch64 NEON指令格式
- NEON 编码的替代方案
AArch64浮点与NEON技术
ARM高级SIMD架构,其相关实现和支持软件通称为NEON技术。AArch32(相当于ARMv7 NEON指令)和AArch64都有NEON指令集。两者都可以显著加速对大型数据集的重复操作。这在媒体编解码器等应用程序中很有用。
AArch64的NEON架构使用了32×128bit的寄存器组(是ARMv7的两倍)。这些寄存器同样可以被浮点指令集使用。所有编译的代码和子程序都符合EABI(其指定了哪些寄存器可以被破坏,哪些寄存器必须保留在一个特定的子程序中)。编译器可以在代码中的任何位置自由使用任何NEON/VFP寄存器来存储浮点值或NEON数据。
浮点和NEON在标准的ARMv8实现中是必须的。然而,针对专业市场的实现允许以下组合:
- 没有NEON或者浮点支持
- 带有异常捕获的完整浮点和SIMD支持
- 没有异常捕获的完整浮点和SIMD支持
AArch64中NEON和浮点的新特性
AArch64中的NEON基于已存在的AArch32的NEON,但是有以下改变:
- 相比ARMv7中16个可用寄存器,AArch64现在有32×128bit的寄存器可用。
- 较小的寄存器不再打包到较大的寄存器中,而是一对一映射到128位寄存器的低位。单精度浮点值使用低32位,而双精度浮点值使用128位寄存器的低64位。参考NEON和浮点架构一节
- ARMv7-A Neon指令集中的前缀在AArch64中去掉了。
- 向向量寄存器中写入64位或更少会导致高位为零。
- 在AArch64中,没有对通用寄存器进行操作的SIMD或饱和算术指令。此类操作使用NEON寄存器。
- 添加了新的通道插入和提取指令以支持新的寄存器打包方案
- 提供了用于生成和消费128为寄存器的前64位的附加指令。将生成多个结果寄存器(扩展为256位向量)和消费两个源(缩小为128位向量)的数据处理指令拆分为了独立的指令。
- 一组新的向量归约操作提供跨通道的求和,求最小值和最大值操作。
- 一些现有指令已扩展为支持64位整数值。例如,比较,加法,绝对值和否定,包括饱和版本。
- 饱和指令已扩展包含了无符 累加到有符 ,以及有符 累加到无符 。
- AArch64 NEON支持双精度浮点和完整的IEEE754 操作,包含舍入模式、非规范化数字和NaN处理。
浮点支持在AArch64中得到加强,有以下改变:
- 在ARMv7-A中的浮点指令的前缀现在被替换。
- 支持IEEE754浮点标准中定义的单精度和双精度浮点向量类型与运算,遵循舍入模式字段,默认NaN控件、清零控制和(在实现支持的情况下)异常陷阱启用位。
- 寄存器的加载/存储寻址模式与整数加载/存储相同,包括加载或存储一对浮点寄存器的能力。
- 添加了浮点 和选择和比较指令,相当于整数 和 。 浮点 、、和 根据浮点比较的结果设置 标志,并且不修改浮点状态寄存器中的条件标志( ),就像 ARMv7 中的情况一样。
- 所有浮点乘加和乘减指令进行了融合。 融合乘法是在 VFPv4 中引入的,这意味着乘法的结果在用于加法之前不会四舍五入。 在早期的 ARM 浮点体系结构中,乘法累积运算将对中间结果和最终结果进行舍入,这可能会导致一个小的精度损失。
- 提供了额外的转换操作,例如,在 64 位整数和浮点之间以及半精度和双精度之间。将浮点数转换为整数(、)指令对定向舍入模式进行编码:
- 趋于0.
- 趋于 + ∞ +infty +∞.
- 趋于 ∞ -infty /span>∞
- 只有在整数部分是奇数的时候,小数部分才逢5进1; 偶数时逢5舍去.(nearest with ties to even)
- 逢5必进1 (nearest with ties to away)
- 添加了以浮点格式 () 将浮点数舍入到最接近的整数,具有相同的定向舍入模式,以及根据环境舍入模式进行舍入。
- 一种新的双精度到单精度向下转换指令,不精确舍入到奇数,适用于正在进行的向下转换到具有正确舍入的半精度()。
- 添加了 和 指令,它们实现了 IEEE754-2008 和 操作。 如果其中一个操作数是安静的 NaN,则这些返回数值。
- 添加了加速浮点向量归一化的指令(、)。
NEON和浮点架构
NEON寄存器组的内容是具有相同数据类型的向量组。一个向量被划分为多个通道,且每个通道包含一个数据,称为元素。
一个NEON向量的通道数量取决于向量本身的长度以及向量中数据的元素的大小。
通常,每个NEON指令会使得个操作并行执行,其中表示输入向量被划分成的通道的数量。两个通道之间不允许出现进位或溢出。向量中元素的排序是从最低有效位开始的。这意味着元素 0 使用寄存器的最低有效位。
NEON和浮点指令集在以下类型的元素上操作:
- 32位单精度和64位双精度浮点类型
Note
16位浮点也是支持的,但是仅作为转入或转出的一种形式。16位浮点本身不支持数据处理操作。
- 8位,16位,32位,或64位无符 和有符 整型
- 8位和16位多项式。多项式类型用于代码,例如纠错,它使用有限域的二次幂或 {0,1} 上的简单多项式。 正常的 ARM 整数代码通常使用查找表进行有限域算术。 AArch64 NEON 提供了使用大型查找表的指令。 多项式运算很难从其他运算中合成出来,因此有一个基本的乘法运算非常有用,可以从中合成出其他更大的运算。
NEON 单元可以将寄存器看作两种视图 :
32 × 128 位四字寄存器,,每个都可以如图 7.1 所示:
Figure 7.1 Divisions of the V register
浮点
在AArch64中浮点单元将NEON寄存器看作:
- 32 × 64位D寄存器组。D寄存器叫做双精度寄存器,其存储双精度浮点值。
- 32 × 32位S寄存器组。S寄存器叫做单精度寄存器,其存储单精度浮点值。
- 32 × 16位H寄存器组。H寄存器叫做半精度寄存器,其存储半精度浮点值。
- 以上视图的寄存器组合。
Figure 7.3 Floating-point regitsters from the above views
Figure 7.5. Moving a scalar to a lane (MOV V0.B[3], W0)
Wide指令或 Widening指令对双字向量操作数和四字向量操作数进行运算,产生四字向量结果。 结果元素和第一个操作数是第二个操作数元素宽度的两倍。 宽指令在指令后附加了一个 。 例如:
图7.7显示了这一点,输入双字操作数在输入之前被提升为四字。
Figure 7.7. NEON wide instructions
有符 和无符 saturating 变体(由 SQ 或 UQ 前缀标识)可用于许多指令,如 SQADD 和 UQADD。 如果结果将超过数据类型的最大值或最小值,saturation 指令将返回该最大值或最小值。 saturation 限制取决于指令的数据类型。
Table 7.2. Saturation ranges
Data type | Saturation range of x |
---|---|
Signed byte (S8) | 2 7 ≤ x < 2 7 -2^7 leq x < 2^7 /span>27≤x<27 |
Signed halfword (S16) | 2 15 ≤ x < 2 15 -2^{15} leq x < 2^{15} /span>215≤x<215 |
Signed word (S32) | 2 31 ≤ x < 2 31 -2^{31} leq x < 2^{31} /span>231≤x<231 |
Signed doubleword (S64) | 2 63 ≤ x < 2 63 -2^{63} leq x < 2^{63} /span>263≤x<263 |
Unsigned byte (U8) | 0 ≤ x < 2 8 0 leq x < 2^8 0≤x<28 |
Unsigned halfword (U16) | 0 ≤ x < 2 16 0 leq x < 2^{16} 0≤x<216 |
Unsigned word (U32) |
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!
达梦数据库快速安装和目录介绍
上一篇
2022年4月5日
数据流图转换为软件结构图
下一篇
2022年4月5日
|