mcpField
A
arm-sve

arm-sve

github.com/mohitmishra786开发269293 次安装18 周前更新
代码仓库

关于 arm-sve

arm-sve 是面向 Agent 的 ARM SVE/SVE2 编程指南,涵盖向量长度无关代码、谓词寄存器、编译器选项与 GDB 调试,适用于编写或迁移 AArch64 SIMD 代码。

主要功能

  1. 01编写向量长度无关代码
  2. 02使用 SVE 谓词与内建函数
  3. 03配置编译器自动向量化
  4. 04调试 SVE 寄存器
  5. 05迁移 NEON 代码至 SVE2

适用场景

  1. 01为 AArch64 服务器编写 SIMD 内核
  2. 02将定宽 NEON 循环改为可伸缩向量代码
  3. 03使用谓词处理循环尾部元素
  4. 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 对比
NEONSVE/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 M4SVE2
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 汇编和 NEON
  • skills/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