NEON
Jak działa
NEON pakuje wiele elementów danych (np. szesnaście 8-bitowych lub cztery 32-bitowe wartości) do jednego 128-bitowego rejestru wektorowego i wykonuje na nich jedną instrukcję jednocześnie (SIMD). Zestaw obejmuje operacje arytmetyczne i logiczne na liczbach całkowitych i zmiennoprzecinkowych, przesunięcia, operacje z nasyceniem, ładowanie/zapisy wektorów oraz instrukcje mnożenia z akumulacją, w tym fused multiply-add (FMA, od VFPv4/Armv8), fundamentalne dla jąder GEMM i splotów w ML. Kompilatory generują kod NEON przez auto-wektoryzację lub programista używa intrinsics/asemblera; biblioteki (np. Ne10, Arm Compute Library, jądra w llama.cpp) dostarczają gotowe, zoptymalizowane rutyny. W AArch64 NEON korzysta z 32 rejestrów 128-bitowych V i zapewnia zaokrąglanie zgodne z IEEE 754.
Rozwiązany problem
Skalarne instrukcje CPU przetwarzają jedną wartość na raz, co jest nieefektywne dla regularnych, masowych obliczeń na wektorach i macierzach (multimedia, DSP, mnożenia w sieciach neuronowych). Osobne koprocesory/DSP komplikowały programowanie i przenośność. NEON dostarcza standaryzowany, wektorowy zestaw instrukcji wbudowany w CPU ARM, który pozwala wykonać wiele operacji równolegle bez dedykowanego akceleratora.
Komponenty
W AArch32: 16 rejestrów 128-bitowych Q (Q0–Q15) nakładających się na 32 rejestry 64-bitowe D (D0–D31). W AArch64: 32 niezależne rejestry 128-bitowe V (V0–V31). Dzielone z jednostką VFP.
Operacje SIMD na liczbach całkowitych 8/16/32/64-bit oraz zmiennoprzecinkowych pojedynczej precyzji (32-bit); w AArch64 także podwójnej precyzji, zgodnie z IEEE 754. Obejmują arytmetykę, logikę, przesunięcia i operacje z nasyceniem.
Instrukcje mnożenia z akumulacją w jednym kroku z pojedynczym zaokrągleniem (od VFPv4/Armv8). Krytyczne dla jąder GEMM i splotów wykorzystywanych w inferencji ML.
Implementacja
Ewolucja
Architektura Armv6 wprowadziła wczesne instrukcje SIMD dla multimediów — bezpośredniego poprzednika Advanced SIMD.
NEON pojawił się jako 64-/128-bitowe rozszerzenie SIMD architektury Armv7-A; obecny we wszystkich rdzeniach Cortex-A8, opcjonalny w Cortex-A9.
W Armv8-A Advanced SIMD (NEON) stał się elementem standardowym dla AArch32 i AArch64. AArch64 daje 32 niezależne rejestry 128-bitowe V i w pełni zgodną z IEEE 754 arytmetykę, w tym podwójną precyzję.
Architektura Armv9-A upowszechnia SVE2 (Scalable Vector Extension 2) — wektorowe rozszerzenie o skalowalnej długości wektora, rozwijane obok NEON.
Paradygmat wykonania
SIMD wykonuje tę samą operację gęsto na wszystkich aktywnych liniach (lane) wektora.
Równoległość
Równoległość danych (data parallelism) w obrębie pojedynczej instrukcji wektorowej.
Wymagania sprzętowe
NEON to natywne rozszerzenie SIMD procesorów ARM/AArch64 (Cortex-A, Apple Silicon, serwery ARM, SoC mobilne i edge). Kategoria „CPU SIMD" — odpowiednik AVX po stronie x86.