引言:从 SVE2 到 SME2 的演进逻辑
2024 至 2026 年间,ARM 架构在 AI 推理领域的布局逐渐清晰:SVE2(Scalable Vector Extension 2)提供了向量化并行能力,而 SME2(Scalable Matrix Extension 2)则进一步将硬件加速粒度从"向量"提升到"矩阵"。如果说 SVE2 让 ARM CPU 具备了与 GPU 在 AI 推理场景一较高下的潜力,那么 SME2 则标志著 ARM 正式从"向量加速器"迈向"张量加速器"。
SME2 是 ARMv9.4-A 架构的核心扩展,首次在 ARM 通用处理器中引入了对二维矩阵操作的原生硬件支持。它不只是 SVE2 的简单增强,而是引入了一套全新的编程模型:ZTile 分块矩阵寄存器、FMOPA(Fused Matrix Outer Product Accumulate)向量外积指令、以及一套完整的矩阵乘累加流水线。
本文将从硬件架构、指令集编程模型、AI 推理工程实践、以及性能实测四个维度,深入剖析 SME2 的技术本质及其在生产环境中的应用路径。
一、SME2 硬件架构解析
1.1 从矢量到矩阵:架构范式转移
NEON 处理器处理的是 128 位向量(4×FP32 或 8×FP16),SVE/SVE2 通过可变向量长度(128-2048bit)和谓词寄存器(predicate)实现了VLA(Vector Length Agnostic)编程模型。但本质上,它们仍然是一维操作:每次指令作用于向量对。
SME2 引入了革命性的二维分块(tiling)模型:
- ZArray(ZA):一个二维的"矩阵寄存器",大小为 N×N 字节(N = SVE 向量长度的字节数,VL=256bit 时为 32×32 = 1024 字节)
- ZTile(ZT):ZA 中的子矩阵分块,每块包含 N/vl × N/vl 个 vl 位向量元素
┌─────────────────────────────────────────────┐
│ ZArray (ZA) 二维存储 │
│ 大小 = N × N 字节(N=SLE向量长度) │
│ │
│ ┌─────┬─────┬─────┬─────┐ │
│ │ ZT0 │ ZT1 │ ZT2 │ ZT3 │ ─── tile_h │
│ ├─────┼─────┼─────┼─────┤ │
│ │ ZT4 │ ZT5 │ ZT6 │ ZT7 │ │
│ ├─────┼─────┼─────┼─────┤ │
│ │ ZT8 │ ZT9 │ ZTA │ ZTB │ │
│ ├─────┼─────┼─────┼─────┤ │
│ │ ZTC │ ZTD │ ZTE │ ZTF │ │
│ └─────┴─────┴─────┴─────┘ │
│ │ │
│ └── tile_w(水平方向tile数量) │
└─────────────────────────────────────────────┘
在 VL=256bit(N=32)的典型配置下,ZA 存储 32×32 = 1024 字节。如果每个元素是 FP16(2字节),则 ZA 可视为一个 16×16 的 FP16 矩阵;如果是 FP32,则是 8×8 的 FP32 矩阵。
1.2 FMOPA:向量外积累加指令
SME2 最核心的指令是 FMOPA(Fused Matrix Outer-Product and Accumulate),其数学本质是计算两个向量的外积并累加到矩阵中:
C += A ⊗ B^T
其中 A 和 B 是向量,C 是矩阵(ZA 中的 ZTile)。
具体来说,FMOPA 的执行流程如下:
- 从 SVE 向量寄存器 Zn 加载一个"纵向向量"(列方向,tile_h 个元素)
- 从 SVE 向量寄存器 Zm 加载一个"横向向量"(行方向,tile_w 个元素)
- 计算外积:每个 (i,j) 位置的元素 = Zn[i] × Zm[j]
- 将外积累加到目标 ZTile 的对应位置
- 进程首次使用 SME 指令触发异常,内核分配 ZA 存储并启用 SME
- 上下文切换时仅在目标进程使用了 SME 时才保存/恢复 ZA 状态
- ZA 状态为 1024 字节(VL=256bit),比 SVE 状态更大
- Attention 计算:矩阵乘法部分用 SME2 FMOPA;Softmax 归一化用 SVE2 的谓词加载和向量查表
- RoPE(旋转位置编码):SVE2 擅长向量三角函数计算(指令
sVCADD、sVMLAL) - FFN 激活函数(SwiGELU):SVE2 的向量指数和对数指令处理激活
- 采样:Top-k / Top-p 采样用 SVE2 的向量比较和选择
- 72 个 Neoverse V2 核心
- 每个核心 SVE2 VL=256bit(未来可扩展)
- LPDDR5x 内存,512 GB/s 内存带宽
- 通过 NVLink-C2C 与 GPU 直接互联
- CPU 侧预处理:Token 化、提示工程、路由决策 → SVE2 的向量处理能力
- CPU/GPU 联合推理:小batch/首token用 SME2 快速响应,大batch计算 offload 到 GPU
- 降级服务:当 GPU 队列满时,SME2 提供可接受的推理性能(避免服务降级到 x86 CPU)
- ARM Compiler for Linux (ACfL) 23+:完整 SME2 内置函数支持,自动向量化 FMOPA
- LLVM/Clang 18+:
-march=armv9.4-a+sme2编译标志,基本内置函数可用 - GCC 14+:基础 SME 支持,SME2 部分高级特性仍在完善中
- 优先选择 Neoverse V2(Grace)或 Cortex-X5/X6 系列(移动端/边端)
- 确认 VL 长度:VL=256bit(主流)→ ZA=1024字节,更适合分块粒度
- OS 内核:Linux 6.6+(包含完整 SME2 上下文切换支持)
- GCC 14 / Clang 18+
- 数学库:ArmPL 24.x 或配置 SME2 的 OpenBLAS
- llama.cpp:可通过
-DGGML_ARM_SME2启用(社区贡献中) - ONNX Runtime:ARMExecutionProvider 路径下支持 SME2 GEMM
- 自研引擎:直接调用 ArmPL 或手写 FMOPA 内核
- 可变 ZA 大小:不再固定在 NV×NV,支持矩形 ZTile 以适应非方阵矩阵运算
- 原生 FP8 E4M3/E5M2 支持:直接 FP8 外积,无需 BF16 转换层
- 多 ZTile 并行:一个核内同时使用多个 ZTile,提升计算密度
- 稀疏矩阵加速:结构化稀疏的硬件支持(2:4 模式),进一步 2× 吞吐率
- 首 token prefill:请求到达时,SME2 在 CPU 上快速预计算 KV cache(延迟敏感)
- 大 batch decode:当批量请求足够大时,SME2 触发 offload 到 GPU
- 动态负载均衡:根据当前系统负载,在 SME2 和 GPU 之间动态分配推理任务
- 时延敏感场景:在线对话、代码补全、实时翻译 → SME2 提供足够的时延
- 能效敏感场景:边缘部署、IoT 网关 → SME2 的 TOPS/Watt 优势明显
- 成本敏感场景:中小企业的 AI 服务 → SME2 降低 GPU 购置成本
- 混合场景:GPU 作为"加速器"处理峰值,SME2 作为"保底"处理常态负载
FMOPA ZT0, Zn, Zm // ZT0[i][j] += Zn[i] * Zm[j]
这正是一个 4×4 矩阵乘法的核心计算:对于 C = A×B,其中 A 的列与 B 的行做外积,再累加到 C。
1.3 多向量变体与混合精度
SME2 支持多种数据格式的 FMOPA 指令:
| 指令 | 操作数类型 | 累加精度 | 适用场景 |
|---|---|---|---|
| FMOPA H/H→S | FP16 × FP16 | FP32 | 训练阶段精度累积 |
| FMOPA B/B→S | BF16 × BF16 | FP32 | LLM 推理核心路径 |
| FMOPA B/H→S | BF16 × FP16 | FP32 | 混合精度推理(权重BF16 + 激活FP16) |
| FMOPA H/H→H | FP16 × FP16 | FP16 | 低精度推理,内存带宽受限场景 |
这里的关键设计点是"乘低累加高"(widening multiply-accumulate):乘法以低精度执行,累加到高精度,既降低了计算开销,又保证了数值稳定性。
二、SME2 编程模型与实践
2.1 系统寄存器与状态管理
SME2 引入了新的系统寄存器来控制矩阵扩展:
SMSTART // 启用 SME(将标量/SVE 状态设为"共享"模式)
SMSTOP // 禁用 SME(恢复纯标量/SVE 模式)
SMID // 读取 SME 实现 ID
TFSR // 错误状态寄存器
在 Linux 内核中,SME2 的状态管理遵循与 SVE 类似的进程上下文切换策略:
2.2 ACLE 内置函数编程
ARM C 语言扩展(ACLE)为 SME2 提供了完整的内置函数:
// 启用 SME 状态
void __arm_smstart(void);
void __arm_smstop(void);
// 加载数据到 SVE 向量寄存器
svfloat16_t svld1_f16(svbool_t pg, const float16_t *base);
svbfloat16_t svld1_bf16(svbool_t pg, const bfloat16_t *base);
// 矩阵外积累加 —— FP16输入、精度无损累加
void svmopa_za32_f16_m(uint64_t tile_index,
svbool_t pn, svbool_t pm,
svfloat16_t zn, svfloat16_t zm);
// BF16 版本 —— LLM推理最常用的路径
void svmopa_za32_bf16_m(uint64_t tile_index,
svbool_t pn, svbool_t pm,
svbfloat16_t zn, svbfloat16_t zm);
2.3 手写 SME2 INT8 矩阵乘法 Kernel
下面是一个简化但完整的 SME2 矩阵乘 kernel,演示如何用 FMOPA 实现 INT8×INT8→INT32 的分块矩阵乘法:
#include <arm_sme.h>
#include <stdint.h>
// C = A × B^T (A: M×K, B: N×K, C: M×N)
// 使用 SME2 的 FMOPA 指令实现 INT8 矩阵乘
void sme2_matmul_int8_kernel(
const int8_t *A, // M x K 矩阵
const int8_t *B, // N x K 矩阵(注意:使用 B^T 语义)
int32_t *C, // M x N 结果矩阵
int M, int N, int K)
{
// VL=256时:每个 ZTile 可处理 16x16 INT8 的元素分块
const int TILE_M = 16;
const int TILE_N = 16;
const int TILE_K = 64; // K方向每次处理64个元素
__arm_smstart(); // 启用 SME 状态
for (int i0 = 0; i0 < M; i0 += TILE_M) {
for (int j0 = 0; j0 < N; j0 += TILE_N) {
// 初始化 ZTile 为0
svzero_za();
for (int k0 = 0; k0 < K; k0 += TILE_K) {
// 加载 A 的列向量(tile_m 个元素)
svint8_t va = svld1_s8(svptrue_b8(),
&A[i0 * K + k0]);
// 加载 B 的行向量(tile_n 个元素)
svint8_t vb = svld1_s8(svptrue_b8(),
&B[j0 * K + k0]);
// 外积累加:ZA[i][j] += A[i][k] * B[j][k]
// 对于每个 k 维度,执行向量的外积并累加
for (int k = 0; k < TILE_K; k += 16) {
svint8_t va_sub = svld1_s8(
svptrue_b8(),
&A[i0 * K + k0 + k]);
svint8_t vb_sub = svld1_s8(
svptrue_b8(),
&B[j0 * K + k0 + k]);
// FMOPA 核心指令
svmopa_za32_s8_m(0,
svptrue_b8(), svptrue_b8(),
va_sub, vb_sub);
}
}
// 从 ZTile 写回到内存 C[i0:i0+16, j0:j0+16]
svst1w_za32(0, svptrue_b32(),
&C[i0 * N + j0]);
}
}
__arm_smstop();
}
这个 kernel 展示了 SME2 编程的关键模式:外层循环遍历 Tile 分块,内层循环在 Tile 内部执行 FMOPA 指令完成矩阵乘累加,最终整块写回内存。
三、AI 推理工程实践
3.1 LLM 推理中的矩阵乘法场景
LLM 推理中,矩阵乘法占据了绝大部分计算时间:
| 矩阵形状 | 维度示例 | 计算占比 |
|---|---|---|
| QKV 投影 | (seq, d_model) × (d_model, 3×d_model) | ~30% |
| 注意力输出 | (seq, seq) × (seq, d_head) | ~15% |
| FFN 上投影 | (seq, d_model) × (d_model, 4×d_model) | ~35% |
| FFN 下投影 | (seq, 4×d_model) × (4×d_model, d_model) | ~20% |
所有这些都是 GEMM(通用矩阵乘法),是 SME2 的理想应用场景。
3.2 权重矩阵的 ZTile 分块策略
ARM SME2 采用 TILE-based 分块策略来适配 LLM 推理中的不同矩阵形状:
┌───────────────────────────────────────────────────────┐
│ LLM FFN 上投影 (d_model × 4×d_model) │
│ │
│ 权重矩阵 W 形状: [4×d_model, d_model] → │
│ │
│ ┌────────────────────────────────────────┐ │
│ │ ZTile 提供 16×16 的计算块 │ │
│ │ │ │
│ │ 垂直方向(tile_h):d_model 维度的行分块 │ │
│ │ 水平方向(tile_w):4×d_model 维度的列分块 │ │
│ │ │ │
│ │ VL=256: 16 INT8 元素/行 │ │
│ │ VL=512: 32 INT8 元素/行 │ │
│ │ VL=1024: 64 INT8 元素/行 │ │
│ │ VL=2048: 128 INT8 元素/行 │ │
│ └────────────────────────────────────────┘ │
└───────────────────────────────────────────────────────┘
3.3 混合精度推理流水线
在实际 LLM 推理中,SME2 最大的价值在于实现高效的混合精度计算:
def sme2_quantized_matmul_precision_pipeline():
"""
SME2 LLM推理混合精度的典型流水线
"""
# 1. 权重加载 & 反量化(运行前执行,离线完成)
# INT8权重格式:w_int8 * scale + zero_point → BF16/FP16
# SME2支持BF16×BF16→FP32的FMOPA
# 2. 激活处理(运行时,每层执行)
# 激活是 FP16(来自注意力计算的输出)
# 权重已反量化为 BF16
# SME2的混合精度FMOPA正好匹配:激活(BF16) × 权重(FP16)?
#
# 实际上SME2要求两个操作数同类型,所以更常见的模式是:
# - 方案A:激活转BF16,权重BF16,FMOPA B/B→S
# - 方案B:激活保持FP16,权重FP16,FMOPA H/H→S
# 3. FMOPA 核心计算
# svmopa_za32_bf16_m(tile, pn, pm, zn_act, zm_weight)
# 输出:FP32累加器(在ZA中)
# 4. 写回 & 后处理
# ZA中的FP32结果 → 量化到FP16用于下一层
# 或直接输出(最终的logits层)
pass
3.4 与 ARM SVE2 的协同优化
SME2 不是替代 SVE2,而是与其协同工作。在 LLM 推理中:
这种"SME2 负责 GEMM + SVE2 负责 element-wise"的分工,正是 ARM AI 软件栈(ARMNN、oneDNN for ARM)的设计核心。
四、性能分析与实测数据
4.1 理论吞吐率分析
在 VL=256bit(Cortex-A76/典型配置)下:
FMOPA INT8 计算模型:
- 每个 ZTile 大小:16×16 INT8 = 256 字节
- 每个 FMOPA 指令计算的外积:16×16 = 256 次乘累加
- 理想峰值:每时钟 2 个 FMOPA(双发射)
- 单时钟 INT8 吞吐量 = 2 × 256 × 2 = 1024 MAC/cycle
- 在 3.0 GHz 下 = 3.07 TOPS
FMOPA BF16 计算模型:
- 外积规模不变:16×16 = 256 次乘累加
- 但每个元素从 1 字节增到 2 字节
- ZA 存储效率降低(每个 tile 只能放更少数据)
- 单时钟 BF16 吞吐量 = 2 × 256 × 2 = 1024 MAC/cycle
- 在 3.0 GHz 下 = 3.07 TFLOPS(注意单位换成了 FLOPS)
对比 NEON(VL=128):
| 单元 | INT8 吞吐/cycle | 频率 | 峰值 INT8 TOPS | 能效 |
|---|---|---|---|---|
| NEON (Cortex-A78) | 128 MAC | 2.4 GHz | 0.31 TOPS | 基准 |
| SVE2 (Graviton3) | 512 MAC | 2.6 GHz | 1.33 TOPS | 3.5× |
| SME2 (理论) | 1024 MAC | 3.0 GHz | 3.07 TOPS | ~10× |
4.2 SME2 vs GPU:不同战场的选择
| 维度 | SME2 (ARM CPU) | 入门级 GPU (L4) | 训练用 GPU (A100) |
|---|---|---|---|
| 单核 INT8 吞吐 | ~3 TOPS | 30+ TFLOPS | 624 TOPS |
| 单核 BF16 吞吐 | ~3 TFLOPS | 60+ TFLOPS | 312 TFLOPS |
| 内存带宽 | 100-300 GB/s | 300 GB/s | 2039 GB/s |
| 批处理时延 | 极低(单token无调度开销) | 中高 | 高 |
| 并发服务能力 | 高(8-16 核并行) | 低(单GPU服务单请求) | 低 |
| 单 token 能耗 | ~0.5-1 J | ~5-10 J | ~50-100 J |
| 最佳场景 | 单/少用户低时延推理 | 中等batch在线推理 | 训练 / 大batch推理 |
关键洞察:SME2 的优势不是与 GPU 比峰值算力,而是在低延迟、少用户、持续在线的推理场景下提供"足够好"的性能同时大幅降低能耗。
4.3 NVIDIA Grace 平台的特殊考量
NVIDIA Grace(基于 ARM Neoverse V2)是首个集成 SME2 的重量级 ARM 服务器 CPU:
在 Grace 平台上,SME2 的定位是:
五、开发者工具链与生态现状
5.1 Compiler 支持状态
截至 2026 年末:
编译命令示例:
# Clang 编译 SME2 代码
clang -march=armv9.4-a+sme2 -O3 -o sme2_bench sme2_matmul.c
# 检查 FMOPA 指令是否被编译使用
objdump -d sme2_bench | grep fmopa
5.2 数学库加速
| 库 | SME2 支持状态 | 场景 |
|---|---|---|
| ARM Performance Libraries (ArmPL) | 完整 SME2 FMOPA 加速 | BLAS/LAPACK 全部例程 |
| OpenBLAS | SME2 GEMM 已实现 | 通用矩阵乘 |
| oneDNN | SME2 后端已集成 | 深度学习算子 |
| TVM / Ansor | SME2 schedule 模板开发中 | 自动算子优化 |
5.3 生产环境部署建议
对于希望在生产中使用 SME2 的团队:
硬件选型:
软件栈:
推理引擎集成:
六、未来展望:从 SME2 到 矩阵计算的未来
6.1 ARMv10 与 SME3 路线图
ARMv10 架构预计将引入 SME3,方向包括:
6.2 SME2+GPU:异构推理的新范式
在 NVIDIA Grace Blackwell 平台上,SME2 可以通过 NVLink-C2C 与 GPU 协同工作:
这种"CPU+GPU 异构推理"模式,有望在时延和吞吐之间找到比"纯 GPU"或"纯 CPU"更优的平衡点。
6.3 SME2 对 LLM 推理生态的长期影响
SME2 的出现正在改变关于"LLM 推理需要 GPU"的传统认知:
结语
ARM SME2 不仅仅是指令集的升级,更是 ARM 架构在 AI 计算领域从"跟随者"到"竞争者"的身份转变。它通过 ZTile 分块矩阵寄存器、FMOPA 外积累加指令和混合精度计算流水线,让通用 CPU 首次在 INT8/BF16 矩阵运算上具备与入门级 GPU 竞争的能力。
对于开发者而言,SME2 打开了通往"CPU 上高效 AI 推理"的大门;对于系统架构师而言,SME2 提供了在能效和时延维度上优化的全新选择。随著 NVIDIA Grace 平台的普及和 Linux 内核 SME2 支持的成熟,我们有理由相信,SME2 将在 2026-2028 年的 AI 推理生态中扮演越来越重要的角色。
未来的 AI 计算,可能不再是"CPU 做控制 + GPU 做计算"的固定模式,而是"CPU(SME2)与 GPU 按需协作"的异构计算新范式。
关键词:ARM SME2, 矩阵扩展, AI推理, ZTile, FMOPA, FMMLA, 向量外积, LLM推理, 矩阵乘法, 异构计算, ARMv9.4, NVIDIA Grace, 能效优化
相关技术:ARM SVE2, NEON, NVIDIA Grace Blackwell, 矩阵乘法加速, INT8/BF16 量化推理, 异构推理架构

发表评论 取消回复