ARM - NEON 介绍

ARMv7 架构引入了 Advanced SIMD 作为 ARMv7-A 和 ARMv7-R 架构的可选扩展。它通过定义对存储在 64 位 D(双字)寄存器和 128 位 Q(四字)向量寄存器中的向量进行操作的指令组,扩展了 SIMD 概念。ARM 处理器中使用的高级 SIMD 扩展实现被称为 NEON,这是架构规范之外常用的术语。NEON 技术已在当前所有 ARM Cortex-A 系列处理器上实现。NEON 指令被集成到 ARM 或 Thumb 指令流中。与使用外部加速器相比,这简化了软件开发、调试和集成。传统的 ARM 或 Thumb 指令负责管理所有程序流和同步,NEON 指令执行:

  • 内存访问操作;
  • NEON 寄存器与通用寄存器之间的数据复制;
  • 数据类型转换;
  • 数据处理。

下图展示了 VADD.I16 Q0, Q1, Q2 指令如何并行执行来自 Q1 和 Q2 向量中八个 16 位元素通道的加法操作,并将结果存储在 Q0 中。

ARM 架构将高级 SIMD 扩展定义为协处理器 10 和 11 的组成部分,这两个协处理器也用于向量浮点(VFP)扩展。虽然架构不要求处理器必须同时实现 VFP 和 NEON,但二者在编程模型上的共性意味着支持 VFP 的操作系统只需极少修改或无需修改即可支持 NEON。

在为特定处理器优化 NEON 代码时,可能需要考虑该处理器集成 NEON 技术的实现细节。这意味着即使 NEON 指令周期时序完全相同,针对某款处理器优化的指令序列在其他处理器上可能具有不同的时序特性。

1. NEON 数据类型

NEON 指令支持 8 位、16 位、32 位和 64 位有符号及无符号整数,NEON 还支持 32 位单精度浮点元素,以及 8 位和 16 位多项式。VCVT 指令可在单精度浮点数与以下格式之间进行元素转换:32 位整数、定点数、半精度浮点数(如果处理器实现了半精度扩展)。

2. NEON 寄存器

NEON 寄存器组包含 32 个 64 位寄存器。若同时实现高级 SIMD 和 VFPv3 架构,二者将共享该寄存器组。此时 VFPv3 以 VFPv3-D32 形式实现,支持 32 个双精度浮点寄存器。这种集成化设计简化了上下文切换支持的实现,因为保存和恢复 VFP 上下文的相同例程亦可同步处理 NEON 上下文。

NEON 单元可将同一寄存器组视作:

  • 16 个 128 位四字寄存器 Q0-Q15
  • 32 个 64 位双字寄存器 D0-D31

NEON D0-D31 寄存器与 VFPv3 D0-D31 寄存器相同,且每个 Q0-Q15 寄存器都映射到一对 D 寄存器。下图展示了共享 NEON 和 VFP 寄存器组的不同视图。所有这些视图均可随时访问,软件无需显式切换视图,因为使用的指令会自动确定对应的视图。

3. NEON 指令格式

NEON 指令仅提供数据处理和加载/存储操作,并被集成到 ARM 和 Thumb 指令集中。标准 ARM 和 Thumb 指令负责管理所有程序流程控制。NEON 指令的编码方式对应于影响协处理器 10 和 11 的协处理器操作,与 VFP 指令相同。NEON 和 VFP 指令也按字母顺序归类,因为所有助记符均以大写字母 V 开头。

大多数指令可操作不同的数据类型,具体类型在指令编码中指定。软件通过在指令助记符后添加后缀来指示所需的数据大小。操作元素的数量由指定的寄存器大小决定。例如, VADD.I16 q0, q1, q2 表示对存储在 128 位 Q 寄存器中的 16 位整数元素进行操作,这意味着该操作可并行处理八个 16 位通道。

部分指令可支持不同大小的输入和输出寄存器。例如, VMULL.S16 Q0, D2, D3 可并行对四个 16 位通道执行乘法运算,在 128 位目标向量中生成四个 32 位乘积结果。

为提高代码密度和性能,NEON 指令集包含结构化加载与存储指令,能够从向量寄存器的单个或多个通道加载或存储单个或多个数值。该指令集还包含在多个向量寄存器与内存之间传输完整数据结构的指令,支持数据交织与解交织操作。

posted @ 2025-08-22 16:57  木杉的园子  阅读(80)  评论(0)    收藏  举报