关于 arm-sve
arm-sve 是面向 Agent 的 ARM SVE/SVE2 编程指南,涵盖向量长度无关代码、谓词寄存器、编译器选项与 GDB 调试,适用于编写或迁移 AArch64 SIMD 代码。
主要功能
- 01编写向量长度无关代码
- 02使用 SVE 谓词与内建函数
- 03配置编译器自动向量化
- 04调试 SVE 寄存器
- 05迁移 NEON 代码至 SVE2
适用场景
- 01为 AArch64 服务器编写 SIMD 内核
- 02将定宽 NEON 循环改为可伸缩向量代码
- 03使用谓词处理循环尾部元素
- 04在支持 SVE 的硬件上检查寄存器状态
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ mohitmishra786/ low-level-dev-skills --skill arm-sve安装后在 Claude Code 中输入/arm-sve确认已加载。
详细介绍
ARM SVE
用途
指导 Agent 使用 ARM Scalable Vector Extension(SVE/SVE2)编程:向量长度无关(VLA)代码、谓词寄存器、通过 <arm_sve.h> 使用 SVE 内置函数、使用 svcnt 获取运行时向量长度、编译器标志、平台差异(Graviton3、Apple M4),以及使用 GDB 调试 SVE 寄存器。
适用场景
- 在 AArch64 服务器(AWS Graviton3/4)上编写高性能 SIMD
- 将固定宽度的 NEON 代码移植为长度无关的 SVE
- 使用谓词掩码处理循环尾部,而不是单独编写清理循环
- 使用 GCC/Clang
-march=armv9-a+sve2自动向量化 - 在支持 SVE 的硬件上使用 GDB 调试 SVE 寄存器状态
- 利用 SVE2 点积和加密扩展
工作流
1. SVE 与 NEON 对比
| NEON | SVE/SVE2 | |
|---|---|---|
| 向量宽度 | 固定(128 位) | 可扩展(128–2048 位,取决于硬件) |
| 谓词化 | 有限 | 完整的谓词寄存器 P0–P15 |
| 跨 ARM CPU 的可移植性 | 所有设备宽度相同 | VLA — 适应硬件的 VL |
| Apple Silicon | 始终可用 | M4+ 支持 SVE2 |
2. 谓词和 VLA 概念
SVE registers
├── Z0–Z31 — scalable vector data registers
└── P0–P15 — predicate (mask) registers
Vector Length (VL) — determined at runtime per CPU
svcntb() → bytes per vector
svcntw() → 32-bit elements per vector
一次编写的代码可在任何支持 SVE 的 CPU 上以完整宽度运行。
3. SVE 内置函数示例
#include <arm_sve.h>
#include <stddef.h>
void saxpy_sve(float *y, const float *x, float alpha, size_t n) {
svbool_t pg = svwhilelt_b32(0, n);
size_t i = 0;
do {
svfloat32_t vx = svld1_f32(pg, &x[i]);
svfloat32_t vy = svld1_f32(pg, &y[i]);
vy = svmla_n_f32_x(pg, vy, vx, alpha); // y += alpha * x
svst1_f32(pg, &y[i], vy);
i += svcntw(); // advance by vector length in 32-bit elements
pg = svwhilelt_b32(i, n);
} while (svptest_any(svptrue_b32(), pg));
}
gcc -march=armv9-a+sve2 -O3 -o saxpy saxpy.c
4. 关键内置函数
| 内置函数 | 用途 |
|---|---|
svld1_f32(pg, ptr) | 掩码加载 |
svst1_f32(pg, ptr, val) | 掩码存储 |
svmul_f32_x(pg, a, b) | 在谓词控制下相乘 |
svmla_f32_x(pg, acc, a, b) | 融合乘加 |
svwhilelt_b32(i, n) | 为满足 i < n 的活动通道生成谓词 |
svcntw() | 每个向量中的 32 位通道数 |
svptrue_b32() | 全真谓词 |
5. 循环尾部处理
// SVE handles tails via predicates — no separate scalar epilogue
for (size_t i = 0; i < n; ) {
svbool_t pg = svwhilelt_b32(i, n);
// ... vector ops with pg ...
i += svcntw();
}
与 NEON 相比:当 n % 4 != 0 时,通常需要进行标量清理。
6. 编译器自动向量化
# GCC vectorization remarks
gcc -march=armv9-a+sve2 -O3 -fopt-info-vec -o app app.c
# Clang
clang -march=armv9-a+sve2 -O3 -Rpass=vectorize -o app app.c
#pragma omp simd // may use SVE when available
for (int i = 0; i < n; i++)
c[i] = a[i] + b[i];
7. 平台差异
| 平台 | SVE 支持情况 |
|---|---|
| AWS Graviton3(Neoverse V1) | SVE(不支持 SVE2) |
| AWS Graviton4(Neoverse V2) | SVE + SVE2 |
| Apple M4 | SVE2 |
| Apple M1/M2/M3 | 仅支持 NEON(不支持 SVE) |
# Check SVE on Linux
grep -i sve /proc/cpuinfo # "sve" or "sve2" in Features
# Or: cat /sys/devices/system/cpu/cpu0/regs/identification/id_aa64pfr0_el1
8. SVE2 扩展功能
SVE2 增加了整数点积、加密和位运算:
#include <arm_sve.h>
svint32_t dot = svdot_s32(svptrue_b32(),
svld1_s8(pg, a), svld1_s8(pg, b));
可用于 Graviton 上的 ML 推理内核。
9. GDB 调试
gcc -g -march=armv9-a+sve2 -o saxpy saxpy.c
gdb ./saxpy
(gdb) break saxpy_sve
(gdb) run
(gdb) p $z0 # print SVE vector register
(gdb) p $p0 # print predicate register
(gdb) info registers z0 z1 p0
需要支持 SVE 的 GDB 10+ 和支持 SVE 的硬件。
10. 从 NEON 迁移到 SVE2
Migration checklist
├── Replace fixed loops (i += 4) with svcntw() strides
├── Add svwhilelt predicates for tails
├── Use _x (merging) vs _z (zeroing) predicated ops intentionally
└── Test on multiple VL hardware or use QEMU sve-max-vq
# QEMU SVE emulation
qemu-aarch64 -cpu max ./saxpy
常见问题
| 症状 | 原因 | 解决方法 |
|---|---|---|
| 非法指令 | 不支持 SVE 的硬件 | 检查 cpuinfo;使用 NEON 备用方案 |
| 循环尾部结果错误 | 修改了非活动通道 | 使用带谓词的 _x 操作,而非不带谓词的操作 |
| 比 NEON 更慢 | 数组较短 | SVE 设置开销较大;当 n < VL 时使用标量 |
| 自动向量化失败 | 循环次数未知 | 使用 -fno-trapping-math;添加 simd 编译指示 |
| Apple M3 构建失败 | M3 不支持 SVE | 使用 __ARM_FEATURE_SVE 进行条件保护 |
| GDB 无法打印 Z 寄存器 | GDB 版本较旧 | 升级 GDB;在支持 SVE 的硬件上运行 |
相关技能
skills/low-level-programming/assembly-arm— AArch64 汇编和 NEONskills/low-level-programming/simd-intrinsics— 通用 SIMD 概念skills/platform/apple-silicon— Apple M 系列的具体信息skills/compilers/gcc—-march标志skills/compilers/clang— 向量化说明skills/low-level-programming/cpu-cache-opt— SIMD 的内存布局
评论
支持 Markdown