ARM 架构深度学习推理指令集的演进与技术范式分析报告

在现代计算架构的演进过程中,ARM 架构已从最初的嵌入式低功耗设计,逐步成长为覆盖移动端、数据中心、超级计算机以及边缘计算的全能型架构。这一转型的核心驱动力之一,便是为了应对深度学习(Deep Learning)和人工智能(AI)推理任务对计算效率、算力密度以及能效比的极致追求。从最初的通用向量扩展 NEON,到专为量化计算设计的 DotProd 和 I8MM,再到代表未来高性能计算范式的可伸缩矢量扩展(SVE)与可伸缩矩阵扩展(SME),ARM 指令集架构(ISA)的演变深刻地反映了计算范式从标量向向量,再由向量向矩阵的重大跃迁 。

第一章 ARM 深度学习指令集的历史演进脉络

ARM 架构的深度学习推理能力并非一蹴而就,而是伴随着 ARMv7 到 ARMv9 的架构更迭,经历了数个关键的技术周期。

1.1 初期探索:NEON 与通用 SIMD 时代

在深度学习爆发之前,多媒体处理、图形渲染和音频编解码是并行计算的主要需求。2011年,ARM 在 ARMv7-A 架构中正式引入了 Advanced SIMD 技术,即 NEON 。NEON 设计的初衷是提供一种固定宽度的单指令多数据(SIMD)能力,其 128 位寄存器宽度能够同时处理 4 个单精度浮点数或 16 个 8 位整数。在深度学习早期,卷积神经网络(CNN)中的卷积核计算被大量映射到 NEON 指令上,虽然其并非为张量计算优化,但通过 FMLA(融合乘加)指令,已能显著优于传统的标量指令。

1.2 量化加速:DotProd 与 I8MM 的引入

随着工业界发现 8 位整型(INT8)量化模型在推理时能在极小损失精度的情况下大幅降低带宽和功耗,ARM 在 ARMv8.2-A 中引入了点积(Dot Product)指令扩展 。此举标志着指令集开始向 AI 推理算子深度定制化。随后在 ARMv8.6-A 中,Integer Matrix Multiply (I8MM) 指令的加入,进一步将计算逻辑从向量点积提升到了小规模矩阵块的乘法 。

1.3 范式跃迁:SVE/SVE2 的矢量革命

为了解决固定宽度向量指令集的灵活性和硬件迁移问题,ARM 与富士通合作为“富岳”超算研发了可伸缩矢量扩展(SVE) 。SVE 的核心创新在于向量长度无关(VLA)编程模型,这使得一套代码能够运行在 128 位到 2048 位不等的硬件实现上 。ARMv9 架构将这一技术普惠化,引入了 SVE2,作为所有高性能核心的标准配置,旨在统一高性能计算(HPC)与机器学习(ML)的计算范式 。

1.4 矩阵时代:SME 与 SME2 的算力爆发

2021年,随着 ARMv9.2-A 的发布,可伸缩矩阵扩展(SME)正式问世,这是 ARM 历史上针对 AI 推理最重大的架构革新 。SME 不再仅仅是向量寄存器的堆叠,而是引入了专门的 ZA 矩阵存储阵列和外积(Outer Product)计算逻辑,使得 CPU 能够以接近专有加速器(NPU)的效率处理张量运算 。

下表详细对比了这些指令集的发布背景及核心属性:

指令集扩展 引入版本 发布年份 寄存器特性 核心数据类型 主要计算范式
NEON ARMv7-A / ARMv8-A 2011 固定 128-bit FP32, INT8/16/32 向量加法/乘加
DotProd ARMv8.2-A 2017 固定 128-bit INT8 $\rightarrow$ INT32 4路点积累加
I8MM ARMv8.6-A / ARMv9-A 2020 固定 128-bit INT8 $\rightarrow$ INT32 矩阵块乘法
SVE/SVE2 ARMv8.2 / ARMv9-A 2016 / 2021 128-2048 bit (VLA) FP16/32, BF16, INT 谓词控制向量运算
SME/SME2 ARMv9.2 / ARMv9.4 2021 / 2023 变长 ZA 存储阵列 FP8/16/32, BF16, INT 矩阵外积/多向量运算

第二章 深度学习推理核心指令的技术架构与逻辑分析

2.1 NEON:固定宽度的 SIMD 基石

NEON 指令集在 ARM 架构中具有极高的普及率,从早期的 Cortex-A 系列到最新的核心,均保留了对 NEON 的支持以确保向下兼容性 。

2.1.1 计算逻辑与密度

NEON 采用 32 个 128 位寄存器(V0-V31)。在深度学习推理中,最常用的操作是单精度浮点乘加(FMLA)。一次典型的 FMLA V0.4S, V1.4S, V2.4S 指令可以在一个时钟周期内完成 4 组浮点乘法和 4 组加法,总计 8 次浮点操作(FLOPs)。对于 INT8 数据,其密度可以达到每周期 16 次乘加。

然而,NEON 的局限性在于其数据重用效率。由于缺乏专门的矩阵缓存,在处理大尺寸卷积时,数据加载(Load)与计算(Compute)的比例往往不平衡,导致计算单元在等待内存带宽 。此外,NEON 不支持硬件级别的谓词控制,在处理非对齐的张量边缘数据时,需要繁琐的 Mask 处理或标量补丁代码 。

2.2 DotProd:为量化推理而生的点积扩展

点积运算是矩阵乘法和卷积计算的基本单元。在 ARMv8.2 中引入的点积指令(UDOT/SDOT)极大地优化了 INT8 推理的算力密度 。

2.2.1 4-way 累加逻辑

DotProd 的核心逻辑是 4-way 累加。在 128 位向量中,它将每 4 个 8 位整数作为一组,与另一组进行点积运算,结果累加到一个 32 位整型容器中 。

$$\text{Result} = \sum_{i=0}^{3} (A_i \times B_i) + \text{Accumulator}$$

这种设计巧妙地解决了 8 位整数乘法容易溢出的问题,因为它直接在硬件层级完成了从 INT8 到 INT32 的扩展与累加。在 Cortex-X2 等高性能核心上,一个周期可以并行执行 4 条点积指令,意味着单核单周期可以处理 $4 \times 4 \times 4 = 64$ 次 INT8 运算 。

2.3 I8MM:向矩阵算子的进一步靠近

I8MM(Integer Matrix Multiply)在 ARMv8.6 中引入,旨在进一步减少指令发射开销。不同于 DotProd 这种向量点积,I8MM 允许直接指定小规模的矩阵块操作(例如 $2 \times 4$ 与 $4 \times 2$ 的矩阵块相乘) 。这使得编译器和开发者能更高效地映射 GEMM(通用矩阵乘法)内核,减少了寄存器之间的交叉重排(Shuffle)需求,从而提升了算术运算在整个指令周期中的占比。

2.4 SVE 与 SVE2:可伸缩性的哲学

SVE(Scalable Vector Extension)的出现彻底改变了 ARM 向量计算的哲学。它引入了向量长度无关(VLA)的概念,这意味着指令集不再硬编码为 128 位 。

2.4.1 核心技术特性:谓词与 VLA

SVE 引入了 svbool_t 谓词寄存器,能够对向量中的每个元素进行独立的启用/禁用控制 。这在处理深度学习中的不规则张量(如 NLP 中的变长序列)或模型剪枝后的稀疏计算时具有巨大的优势。$$\text{VL (Vector Length)} = \text{Implementation Defined}$$在 Neoverse V1 核心中,SVE 宽度为 256 位,而在某些超算芯片中可达 512 位或更高 。

SVE2 则进一步集成了针对数据处理、加密和多媒体的指令,使得原本只能由 NEON 处理的任务能够无缝迁移到可伸缩架构上,并支持了 BFloat16 这种对深度学习训练和推理都至关重要的浮点格式 。

2.5 SME:计算范式的颠覆

SME(Scalable Matrix Extension)是针对“后摩尔定律时代”算力瓶颈的终极响应。它不仅增加了指令,还引入了全新的硬件状态机和存储模型 。

2.5.1 ZA 存储阵列与 Streaming Mode

SME 引入了一个名为 ZA 的二维存储阵列。与传统的向量寄存器不同,ZA 可以被视为一个大型的、可分块的“平铺(Tile)”存储空间 。例如,在 SVL 为 512 位的实现中(如 Apple M4),ZA 存储大小为 $64 \times 64$ 字节,即 4096 字节 。SME 运行在所谓的“流模式(Streaming SVE Mode)”下,该模式优化了高吞吐量的矩阵运算 。其核心指令 FMOPA(浮点矩阵外积累加)采用了与传统内积完全不同的逻辑。

2.5.2 外积逻辑的优越性传统

矩阵乘法 $C = A \times B$ 计算 $C_{i,j}$ 需要加载 $A$ 的一行和 $B$ 的一列(内积)。而 SME 的外积指令 FMOPA ZA0.S, P0/M, P1/M, Z0.S, Z1.S 则是取向量 $Z0$(作为列)和 $Z1$(作为行),直接更新整个 ZA 矩阵块 。

$$C = C + u \otimes v^T$$

这种方式极大提高了数据重用率:加载一次向量数据,可以更新整个二维矩阵分块。在高性能实现中,单条 SME 指令可以在一个时钟周期内完成高达 512 次浮点运算(针对 16x16 的 FP32 块) 。

第三章 深度学习推理场景下的计算密度与性能对比

在实际的深度学习推理任务中,算力密度和访存效率共同决定了最终的推理延迟。

3.1 算力密度对比表

下表对比了不同指令集在处理典型 AI 数据类型时的每周期操作数(以高性能核心的理想状态为例):

指令集扩展 数据精度 单指令操作数 (Ops) 逻辑抽象级别 峰值算力潜力 (FLOPs/Cycle)
NEON (FMLA) FP32 8 向量
DotProd (SDOT) INT8 32 向量点积
I8MM (SMMLA) INT8 64 矩阵块 极高
SVE2 (FP32) FP32 8 * (VL/128) 可伸缩向量 取决于硬件宽度
SME (FMOPA) FP32 2 * (VL/32)^2 矩阵外积 顶尖 (如 M4 可达 512)
SME2 (Multi-vec) INT8 2 * (VL/8)^2 多矩阵/向量 行业上限

3.2 实际推理性能增益

根据 PyTorch 和 ARM 官方在移动端 SoC(如 vivo X300 搭载的芯片)上的实测数据,SME2 的引入对主流模型产生了立竿见影的加速效果 。

在针对 Instagram 抠图功能背后的 SqueezeSAM 模型测试中,SME2 表现出了强大的加速能力 :

  1. FP16 推理:延迟从 1163ms 降低至 298ms,加速比达到 3.9x。
  2. INT8 推理:延迟从 556ms 降低至 304ms,加速比为 1.83x。
  3. 算子级加速:在最核心的卷积算子(Convolution)中,FP16 的加速比竟然达到了惊人的 9.0x 。

这一数据揭示了一个重要的技术趋势:SME/SME2 使得 FP16 的推理速度能够与 INT8 达到同等水平(都在 300ms 左右),这赋予了开发者极大的灵活性——他们可以在不牺牲模型精度的情况下,获得量化模型般的运行速度 。

3.3 共享资源与能效挑战

尽管 SME/SME2 提供了极高的算力,但在移动端和服务器集群中,它们往往被设计为“共享执行资源” 。例如,在某些 ARMv9 集群中,多个 CPU 核心可能共享同一个 SME 单元。这意味着在多核全负载运行时,单个核心获得的加速比可能会缩水。测试显示,INT8 模型在四核运行时的加速比仅为 1.08x,远低于单核时的 1.83x 。这要求系统调度器和 AI 框架(如 KleidiAI)必须具备精细的资源感知能力。

第四章 适用范围与应用场景讨论

4.1 移动端 AI:从“滤镜”到“生成式 AI”

在移动端,NEON 依然是覆盖度最广的指令集,适用于所有的 Android 和 iOS 设备进行基础的图像增强 。然而,随着大语言模型(LLM)如 Gemma、Llama 迁移到手机端,SME/SME2 成为了不可或缺的动力来源。Apple 在 M4 芯片中对 SME 的深度集成,以及联发科、三星等厂商在 ARMv9 核心中对 SME2 的支持,使得在手机上运行 4K 30fps 的实时视频去噪(仅需 1W 功耗)成为可能 。

4.2 云计算与 HPC:Neoverse 的统治力

在服务器端,AWS Graviton 3 和 Graviton 4 分别引入了 SVE 和 SVE2 支持 。对于数据中心而言,SVE 的 VLA 特性极大地简化了软件部署,开发者无需为不同的云实例重新编译代码。Neoverse V1 核心提供的 256 位 SVE 单位,为科学计算和云端 AI 推理提供了卓越的性能功耗比 。

4.3 边缘与 IoT:能效比的极致博弈

在边缘计算设备(如 Cortex-M 或低端 Cortex-A 核心)中,DotProd 依然是主流。它在极小的面积开销下提供了显著的 INT8 加速能力,非常适合语音唤醒、简单的手势识别等任务 。

第五章 代码演示与编程实践

为了直观展示这些指令集的差异,以下通过 C 语言内联汇编或 ACLE(ARM C Language Extensions)内置函数提供演示。

5.1 NEON 代码演示:基础浮点乘加

NEON 编程相对直观,主要通过 128 位向量类型 float32x4_t 进行。

1
2
3
4
5
6
7
8
9
#include <arm_neon.h>

// 4x4 矩阵乘法的一个片段:向量乘标量并累加
void neon_matmul_step(float32x4_t *acc, float32x4_t col, float *b_ptr) {
// vld1q_dup_f32 加载并广播一个标量到向量
float32x4_t scalar = vld1q_dup_f32(b_ptr);
// vfmaq_f32 执行 acc = acc + (col * scalar)
*acc = vfmaq_f32(*acc, col, scalar);
}

5.2 SVE 代码演示:VLA 向量加法

SVE 引入了谓词控制,允许代码在不知道向量长度的情况下运行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <arm_sve.h>

void sve_add_vla(float *a, float *b, float *res, int n) {
int i = 0;
// 生成初始谓词
svbool_t pg = svwhilelt_b32(i, n);

while (svptest_any(svptrue_b32(), pg)) {
// 加载当前谓词范围内的向量
svfloat32_t va = svld1_f32(pg, &a[i]);
svfloat32_t vb = svld1_f32(pg, &b[i]);

// 执行向量加法
svfloat32_t vr = svadd_f32_z(pg, va, vb);

// 存储结果
svst1_f32(pg, &res[i], vr);

// 使用 svcntw() 动态增加索引,自适应不同硬件宽度
i += svcntw();
pg = svwhilelt_b32(i, n);
}
}

5.3 SME 代码演示:矩阵外积累加

SME 的操作高度依赖于对 ZA 存储块的管理。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <arm_sme.h>

// 注意:执行此函数需要 CPU 进入 Streaming Mode
__arm_streaming void sme_outer_product_example(float *a_vec, float *b_vec) {
// 假设 SVL 已在外部正确设置
// 激活 ZA 存储阵列
svset_za(svptrue_b32());

// 加载向量到 Z 寄存器
svbool_t pg = svptrue_b32();
svfloat32_t za_col = svld1_f32(pg, a_vec);
svfloat32_t za_row = svld1_f32(pg, b_vec);

// 清零 ZA0 Tile
svzero_za();

// 执行 FMOPA:ZA0 = ZA0 + (za_col 外积 za_row)
// 这一条指令在 M4 上可等效于几百次浮点运算
svmopa_za32_f32_m(0, pg, pg, za_col, za_row);
}

第六章 深度见解:计算瓶颈的转移与未来趋势

通过对 ARM 推理指令集的深度调研,我们可以推导出几个关键的二阶结论。

6.1 从“计算受限”到“访存受限”的终结?

在 NEON 时代,AI 任务往往受限于 CPU 的算术逻辑单元(ALU)吞吐量。然而,SME/SME2 的出现极大地改变了这一格局。由于外积指令极高的算力密度,现在的瓶颈正迅速向内存带宽和片上缓存(L2/L3)转移 。

数据表明,在 SME2 加速的 INT8 推理中,数据重排和内存布局转换(Data Movement)占用了超过 40% 的时间 。这暗示了未来的 ARM 指令集扩展(如即将到来的 ARMv9.7)可能会引入更强大的硬件级转置、Shuffle 以及专用的张量加载引擎,以缓解“算力溢出”而“数据不足”的矛盾 。

6.2 混合精度的普惠化

SME 架构原生支持 FP16/BFloat16 到 FP32 的累加,以及 INT8 到 INT32 的累加 。这种混合精度处理能力在硬件层级解决了梯度消失或累加溢出的风险,使得深度学习开发者可以更大胆地采用低精度输入。SME2.1 甚至开始探索对 FP8 这种极低精度的支持,这对于端侧生成式 AI(On-device GenAI)的性能提升至关重要 。

6.3 CPU 与 NPU 的边界模糊化

历史上,CPU 被认为只适合处理逻辑复杂的标量代码,而 AI 计算应交给 NPU。但 SME 的引入证明了,通过在 CPU 内部集成矩阵加速器,可以获得极高的计算效率,同时保留 CPU 极佳的编程灵活性和无缝的任务切换能力 。对于延迟敏感、算子多变且需要快速迭代的移动端 AI 应用,SME 驱动的 CPU 推理方案正表现出比传统 NPU 更强的竞争力。

第七章 结论

ARM 指令集在深度学习推理领域的演进,是计算机体系结构从“通用”向“专用”进化的缩影。

  1. NEON 奠定了并行计算的基础,至今仍是兼容性的保障 。
  2. DotProd 和 I8MM 抓住了量化计算的红利,提供了极高的能效比 。
  3. SVE/SVE2 引入了灵活性和可伸缩性,通过 VLA 模型统一了从端到云的软件生态 。
  4. SME/SME2 则是划时代的跨越,通过二维存储与外积逻辑,将 CPU 的张量处理能力推向了前所未有的高度 。

对于研究人员和开发工程师而言,理解这些指令集的底层差异是优化深度学习应用的关键。随着 ARMv9.7 等后续版本的推出,以及 KleidiAI 等高性能库的成熟,基于 ARM CPU 的 AI 推理将继续在性能、能效和灵活性之间寻找新的平衡点,支撑起从实时神经影像处理到移动端大模型交互的广阔应用图景 。