mcpField
A
arm-sve

arm-sve

github.com/mohitmishra786開発269293 回インストール18 週間前に更新
リポジトリ

arm-sve について

arm-sve は、ARM SVE/SVE2 を使うプログラミングをエージェント向けに案内します。ベクトル長非依存コード、述語、コンパイラ設定、GDB デバッグを扱い、AArch64 SIMD の開発や移行に役立ちます。

主な機能

  1. 01ベクトル長非依存コードの作成
  2. 02SVE の述語と組み込み関数の利用
  3. 03コンパイラ自動ベクトル化の設定
  4. 04SVE レジスタのデバッグ
  5. 05NEON コードの SVE2 移行

活用シーン

  1. 01AArch64 サーバー向け SIMD カーネルの作成
  2. 02固定幅 NEON ループのスケーラブルなベクトル化
  3. 03述語によるループ末尾の処理
  4. 04SVE 対応ハードウェアでのレジスタ確認

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/mohitmishra786/low-level-dev-skills --skill arm-sve

インストール後、Claude Code で/arm-sveを入力して読み込まれたか確認します。

詳細

ARM SVE

目的

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/M3NEON のみ(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 を指定し、pragma 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 向けのメモリレイアウト

コメント