arm-sve について
arm-sve は、ARM SVE/SVE2 を使うプログラミングをエージェント向けに案内します。ベクトル長非依存コード、述語、コンパイラ設定、GDB デバッグを扱い、AArch64 SIMD の開発や移行に役立ちます。
主な機能
- 01ベクトル長非依存コードの作成
- 02SVE の述語と組み込み関数の利用
- 03コンパイラ自動ベクトル化の設定
- 04SVE レジスタのデバッグ
- 05NEON コードの SVE2 移行
活用シーン
- 01AArch64 サーバー向け SIMD カーネルの作成
- 02固定幅 NEON ループのスケーラブルなベクトル化
- 03述語によるループ末尾の処理
- 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 の比較
| 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 を指定し、pragma 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 対応