/arm-sve
ARM SVE skill for scalable vector extension programming. Use when writing SVE intrinsics, predicate registers, VLA loops with svcnt, auto-vectorization with -march=armv9-a+sve2, or debugging SVE in GDB. Activates on queries about SVE, SVE2, predicate registers, svld1, svcnt,
$ npx -y skills add mohitmishra786/low-level-dev-skills --skill arm-sve --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
- You can call itInvoke it directly when you want it.
- Slash command
/arm-sve
Context preview
The summary Claude sees to decide when to auto-load this skill.
ARM SVE skill for scalable vector extension programming. Use when writing SVE intrinsics, predicate registers, VLA loops with svcnt, auto-vectorization with -march=armv9-a+sve2, or debugging SVE in GDB. Activates on queries about SVE, SVE2, predicate registers, svld1, svcnt,
SKILL.md
arm-sve.SKILL.mdname: arm-sve
description: ARM SVE skill for scalable vector extension programming. Use when writing SVE intrinsics, predicate registers, VLA loops with svcnt, auto-vectorization with -march=armv9-a+sve2, or debugging SVE in GDB. Activates on queries about SVE, SVE2, predicate registers, svld1, svcnt, arm_sve.h, or Graviton SVE.
ARM SVE
Purpose
Guide agents through ARM Scalable Vector Extension (SVE/SVE2) programming: vector-length agnostic (VLA) code, predicate registers, SVE intrinsics via `<arm_sve.h>`, runtime vector length with `svcnt`, compiler flags, platform differences (Graviton3, Apple M4), and GDB debugging of SVE registers.
When to Use
- Writing high-performance SIMD on AArch64 servers (AWS Graviton3/4)
- Porting fixed-width NEON code to length-agnostic SVE
- Using predicate masks for loop tails instead of separate cleanup loops
- Auto-vectorizing with GCC/Clang `-march=armv9-a+sve2`
- Debugging SVE register state in GDB on hardware with SVE support
- Exploiting SVE2 dot product and crypto extensions
Workflow
1. SVE vs NEON
| | NEON | SVE/SVE2 | |---|------|----------| | Vector width | Fixed (128-bit) | Scalable (128–2048 bits, hardware dependent) | | Predication | Limited | Full predicate registers P0–P15 | | Portability across ARM CPUs | Same width everywhere | VLA — adapts to hardware VL | | Apple Silicon | Always available | M4+ has SVE2 |
2. Predicate and VLA concepts
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
Code written once runs at full width on any SVE-capable CPU.
3. SVE intrinsics example
#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. Key intrinsics
| Intrinsic | Purpose | |-----------|---------| | `svld1_f32(pg, ptr)` | Masked load | | `svst1_f32(pg, ptr, val)` | Masked store | | `svmul_f32_x(pg, a, b)` | Multiply under predicate | | `svmla_f32_x(pg, acc, a, b)` | Fused multiply-add | | `svwhilelt_b32(i, n)` | Predicate for active lanes where i < n | | `svcntw()` | 32-bit lanes per vector | | `svptrue_b32()` | All-true predicate |
5. Loop tail handling
// 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();
}Contrast with NEON: often needs scalar cleanup for `n % 4 != 0`.
6. Compiler auto-vectorization
# 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. Platform differences
| Platform | SVE support | |----------|-------------| | AWS Graviton3 (Neoverse V1) | SVE (no SVE2) | | AWS Graviton4 (Neoverse V2) | SVE + SVE2 | | Apple M4 | SVE2 | | Apple M1/M2/M3 | NEON only (no 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 extras
SVE2 adds integer dot product, crypto, and bitwise operations:
#include <arm_sve.h>
svint32_t dot = svdot_s32(svptrue_b32(),
svld1_s8(pg, a), svld1_s8(pg, b));Use for ML inference kernels on Graviton.
9. GDB debugging
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
Requires GDB 10+ with SVE support and SVE-capable hardware.
10. NEON → SVE2 migration
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
Common Problems
| Symptom | Cause | Fix | |---------|-------|-----| | Illegal instruction | No SVE hardware | Check cpuinfo; use NEON fallback | | Wrong results in tail | Inactive lanes modified | Use `_x` predicated ops, not unpredicated | | Slower than NEON | Short arrays | SVE setup cost; scalar for n < VL | | Auto-vec failed | Unknown trip count | `-fno-trapping-math`; pragma simd | | Apple M3 build fails | No SVE on M3 | Guard with `__ARM_FEATURE_SVE` | | GDB can't print Z regs | Old GDB | Upgrade GDB; run on SVE hardware |
Related Skills
- `skills/low-level-programming/assembly-arm` — AArch64 assembly and NEON
- `skills/low-level-programming/simd-intrinsics` — general SIMD concepts
- `skills/platform/apple-silicon` — Apple M-series specifics
- `skills/compilers/gcc` — `-march` flags
- `skills/compilers/clang` — vectorization remarks
- `skills/low-level-programming/cpu-cache-opt` — memory layout for SIMD
Read more
name: arm-sve description: ARM SVE skill for scalable vector extension programming. Use when writing SVE intrinsics, predicate registers, VLA loops with svcnt, auto-vectorization with -march=armv9-a+sve2, or debugging SVE in GDB. Activates on queries about SVE, SVE2, predicate registers, svld1, svcnt, arm_sve.h, or Graviton SVE.
ARM SVE
Purpose
Guide agents through ARM Scalable Vector Extension (SVE/SVE2) programming: vector-length agnostic (VLA) code, predicate registers, SVE intrinsics via `<arm_sve.h>`, runtime vector length with `svcnt`, compiler flags, platform differences (Graviton3, Apple M4), and GDB debugging of SVE registers.
When to Use
- Writing high-performance SIMD on AArch64 servers (AWS Graviton3/4)
- Porting fixed-width NEON code to length-agnostic SVE
- Using predicate masks for loop tails instead of separate cleanup loops
- Auto-vectorizing with GCC/Clang `-march=armv9-a+sve2`
- Debugging SVE register state in GDB on hardware with SVE support
- Exploiting SVE2 dot product and crypto extensions
Workflow
1. SVE vs NEON
| | NEON | SVE/SVE2 | |---|------|----------| | Vector width | Fixed (128-bit) | Scalable (128–2048 bits, hardware dependent) | | Predication | Limited | Full predicate registers P0–P15 | | Portability across ARM CPUs | Same width everywhere | VLA — adapts to hardware VL | | Apple Silicon | Always available | M4+ has SVE2 |
2. Predicate and VLA concepts
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
Code written once runs at full width on any SVE-capable CPU.
3. SVE intrinsics example
#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. Key intrinsics
| Intrinsic | Purpose | |-----------|---------| | `svld1_f32(pg, ptr)` | Masked load | | `svst1_f32(pg, ptr, val)` | Masked store | | `svmul_f32_x(pg, a, b)` | Multiply under predicate | | `svmla_f32_x(pg, acc, a, b)` | Fused multiply-add | | `svwhilelt_b32(i, n)` | Predicate for active lanes where i < n | | `svcntw()` | 32-bit lanes per vector | | `svptrue_b32()` | All-true predicate |
5. Loop tail handling
// 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();
}Contrast with NEON: often needs scalar cleanup for `n % 4 != 0`.
6. Compiler auto-vectorization
# 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. Platform differences
| Platform | SVE support | |----------|-------------| | AWS Graviton3 (Neoverse V1) | SVE (no SVE2) | | AWS Graviton4 (Neoverse V2) | SVE + SVE2 | | Apple M4 | SVE2 | | Apple M1/M2/M3 | NEON only (no 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 extras
SVE2 adds integer dot product, crypto, and bitwise operations:
#include <arm_sve.h>
svint32_t dot = svdot_s32(svptrue_b32(),
svld1_s8(pg, a), svld1_s8(pg, b));Use for ML inference kernels on Graviton.
9. GDB debugging
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
Requires GDB 10+ with SVE support and SVE-capable hardware.
10. NEON → SVE2 migration
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
Common Problems
| Symptom | Cause | Fix | |---------|-------|-----| | Illegal instruction | No SVE hardware | Check cpuinfo; use NEON fallback | | Wrong results in tail | Inactive lanes modified | Use `_x` predicated ops, not unpredicated | | Slower than NEON | Short arrays | SVE setup cost; scalar for n < VL | | Auto-vec failed | Unknown trip count | `-fno-trapping-math`; pragma simd | | Apple M3 build fails | No SVE on M3 | Guard with `__ARM_FEATURE_SVE` | | GDB can't print Z regs | Old GDB | Upgrade GDB; run on SVE hardware |
Related Skills
- `skills/low-level-programming/assembly-arm` — AArch64 assembly and NEON
- `skills/low-level-programming/simd-intrinsics` — general SIMD concepts
- `skills/platform/apple-silicon` — Apple M-series specifics
- `skills/compilers/gcc` — `-march` flags
- `skills/compilers/clang` — vectorization remarks
- `skills/low-level-programming/cpu-cache-opt` — memory layout for SIMD
A curated suite of AI agent skills for systems and low-level programming — C/C++, Rust, Zig, GPU, bare-metal firmware, Linux kernel/driver development, computer architecture, compiler internals, HPC, and more.
Repo: mohitmishra786/low-level-dev-skills
Other skills on low-level-dev-skills.
- /custom-allocators
Custom allocator skill for memory allocation strategies. Use when implementing pool/slab/arena allocators, tuning jemalloc/mimalloc, writing Rust GlobalAlloc, or benchmarking allocator performance. Activates on queries about jemalloc, mimalloc, tcmalloc, arena allocator,
Open skill - /numa-programming
NUMA programming skill for multi-socket memory locality. Use when detecting NUMA topology, binding processes with numactl, using libnuma API, building NUMA-aware data structures, or measuring remote access penalties. Activates on queries about numactl, libnuma, NUMA topology,
Open skill - /af-xdp
AF_XDP skill for high-performance XDP sockets. Use when creating AF_XDP sockets, configuring UMEM and XSK rings, XDP_REDIRECT programs, copy vs zero-copy mode, or comparing with DPDK. Activates on queries about AF_XDP, xsk_umem, XDP_REDIRECT, libbpf xsk, or zero-copy XDP.
Open skill - /dpdk
DPDK skill for userspace packet I/O. Use when initializing EAL, configuring PMD drivers, using mbuf pools and rte_ring, setting up huge pages, RSS, or testpmd validation. Activates on queries about DPDK, EAL, rte_eth_rx_burst, hugepages, PMD, or testpmd.
Open skill - /io-uring
io_uring skill for Linux async I/O. Use when building high-performance servers with liburing, multi-shot operations, provided buffers, fixed files, zero-copy send, or tokio-uring. Activates on queries about io_uring, SQE/CQE, liburing, IORING_OP_PROVIDE_BUFFERS, or io_uring vs
Open skill - /adc-dac-baremetal
Bare-metal ADC and DAC skill. Use when configuring analog sampling, DMA-driven ADC, calibration, or DAC output on MCUs. Activates on queries about ADC bare-metal, sampling time, DMA ADC, or DAC channel setup.
Open skill

