ARM NEON
ARM NEON — это 128-битная архитектура набора инструкций (SIMD), реализованная в процессорах на базе архитектуры ARM, предназначенная для ускорения операций с параллельной обработкой данных. NEON является частью расширений Advanced SIMD, входящих в стандарт ARMv7 и последующие версии (ARMv8, ARMv9), и обеспечивает эффективное выполнение задач, требующих высокой производительности при обработке массивов чисел, сигналов, изображений и мультимедийных данных.
История
Разработка NEON началась в середине 2000-х годов компанией ARM Holdings (Великобритания) как ответ на растущие потребности мобильных устройств в обработке мультимедиа. Первая реализация появилась в процессорах Cortex-A8 (2005 год), которые использовались в iPhone 3GS и первых смартфонах на Android. В 2011 году с выходом архитектуры ARMv7 NEON стал обязательным компонентом для всех процессоров семейства Cortex-A, за исключением самых дешёвых моделей. В 64-битной архитектуре ARMv8-A (2013 год) NEON был расширен до 128-битных регистров, а также добавлена поддержка операций с плавающей запятой двойной точности (64-бит). В ARMv9 (2021 год) NEON остаётся ключевым элементом, но дополняется новыми инструкциями для машинного обучения (SVE, Scalable Vector Extension).
Архитектура и устройство
Регистры
NEON использует отдельный набор 128-битных регистров, количество которых зависит от версии архитектуры:
- ARMv7 (32-битная): 16 регистров (Q0–Q15) по 128 бит или 32 регистра (D0–D31) по 64 бита.
- ARMv8 (64-битная): 32 регистра (V0–V31) по 128 бит, которые могут использоваться как 64-битные (D) или 128-битные (Q).
Типы данных
NEON поддерживает векторизацию следующих типов:
- Целые числа: 8, 16, 32, 64 бит (со знаком и без знака).
- Числа с плавающей запятой: 32 бит (float), 64 бит (double) — только в ARMv8.
- Логические и полиномиальные типы.
Инструкции
Набор инструкций NEON включает:
- Арифметические: сложение, вычитание, умножение, деление (только для float), слияние (fused multiply-add).
- Логические: AND, OR, XOR, NOT.
- Сравнение: равно, больше, меньше.
- Перестановки: перестановка элементов, транспонирование, реверс.
- Загрузка/сохранение: загрузка векторов из памяти, выборочная загрузка (load-and-lane), сохранение с чередованием.
- Преобразования: преобразование типов (например, int32 → float32), округление.
Режимы работы
NEON работает в двух режимах:
- Обычный (Normal): последовательное выполнение инструкций.
- Турбо (Turbo): в некоторых реализациях (например, Cortex-A72) инструкции NEON могут выполняться параллельно с основным потоком, если не конфликтуют по ресурсам.
Классификация
По поколениям
- ARMv7 NEON (32-бит): 16 регистров, поддержка float32, целых 8/16/32 бит. Используется в Cortex-A8, A9, A15.
- ARMv8 NEON (64-бит): 32 регистра, поддержка float64, целых 8/16/32/64 бит. Используется в Cortex-A53, A57, A72, A76.
- ARMv9 NEON (с дополнениями SVE): сохранение совместимости, но с акцентом на масштабируемые векторы.
По реализации
- Аппаратный NEON: встроенный блок в процессор (Cortex-A, Cortex-R).
- Программный NEON: эмуляция через QEMU или другие симуляторы (ограниченная производительность).
Применение
Мультимедиа и графика
- Обработка видео: кодеки H.264, H.265, VP9 — ускорение декодирования/кодирования.
- Обработка изображений: фильтры (размытие, резкость), цветокоррекция, масштабирование.
- Аудио: кодеки AAC, MP3, FLAC — быстрые преобразования Фурье (FFT).
Машинное обучение и нейросети
- Ускорение свёрточных нейронных сетей (CNN) на мобильных устройствах (TFLite, CoreML).
- Обработка тензоров: матричные умножения, активации (ReLU, sigmoid).
- Инференс моделей в реальном времени (например, распознавание лиц, голоса).
Научные вычисления
- Обработка сигналов: фильтрация, корреляция, спектральный анализ.
- Численное моделирование: решение дифференциальных уравнений, метод Монте-Карло.
Системы реального времени
- Автомобильная электроника: обработка данных с лидаров, камер.
- Промышленные контроллеры: быстрая обработка сенсорных данных.
Примеры использования
Программирование на C/C++
Для использования NEON применяются:
- Встроенные функции (intrinsics): заголовочный файл
arm_neon.h(для GCC/Clang). Пример:
```c
include <arm_neon.h>
float32x4_t a = vld1q_f32(array1); float32x4_t b = vld1q_f32(array2); float32x4_t c = vmulq_f32(a, b); // поэлементное умножение ```
- Ассемблерные вставки: ручное написание инструкций NEON (например,
VADD.I32 q0, q1, q2). - Автовекторизация: компиляторы (GCC, Clang, MSVC) могут автоматически генерировать код NEON при оптимизации
-O3 -mfpu=neon.
Пример: умножение матриц
``c void matmul_neon(float A, float B, float C, int n) { for (int i = 0; i < n; i += 4) { for (int j = 0; j < n; j += 4) { float32x4_t c0 = vdupq_n_f32(0); float32x4_t c1 = vdupq_n_f32(0); float32x4_t c2 = vdupq_n_f32(0); float32x4_t c3 = vdupq_n_f32(0); for (int k = 0; k < n; k++) { float32x4_t a0 = vld1q_f32(&A[i + kn]); float32x4_t b0 = vld1q_f32(&B[k + jn]); c0 = vmlaq_f32(c0, a0, b0); } vst1q_f32(&C[i + jn], c0); } } } ``
Производительность и ограничения
Преимущества
- Высокий параллелизм: до 4 операций с плавающей запятой за такт (float32) на одно ядро.
- Энергоэффективность: NEON потребляет меньше энергии на операцию, чем GPU, что критично для мобильных устройств.
- Низкая задержка: инструкции выполняются за 1–3 такта (в зависимости от типа).
Ограничения
- Необходимость выравнивания данных: доступ к невыровненным данным может вызывать исключения или снижение производительности.
- Сложность программирования: ручная векторизация требует глубокого понимания архитектуры.
- Ограниченная поддержка double: в ARMv7 double не поддерживается, в ARMv8 — только 64-битные регистры.
- Конфликты с кэшем: при неправильной организации данных может наблюдаться снижение производительности.
Сравнение с другими SIMD-архитектурами
| Характеристика | ARM NEON | Intel SSE/AVX | RISC-V Vector |
|---|---|---|---|
| Разрядность | 128 бит | 128/256/512 бит | Переменная (до 2048 бит) |
| Типы данных | int8–64, float32/64 | int8–64, float32/64 | int8–64, float32/64, bfloat16 |
| Количество регистров | 16–32 | 16–32 | 32 (v0–v31) |
| Энергопотребление | Низкое | Среднее/высокое | Низкое |
| Поддержка в компиляторах | GCC, Clang, MSVC | GCC, Clang, MSVC, ICC | GCC, Clang (экспериментально) |
Интересные факты
- NEON изначально назывался «Advanced SIMD extension» и был разработан как альтернатива устаревшему VFP (Vector Floating Point).
- В процессорах Apple (серия A, M) NEON используется для ускорения нейросетей в CoreML и Metal Performance Shaders.
- В 2020 году ARM выпустила спецификацию SVE (Scalable Vector Extension) для ARMv9, которая дополняет NEON, но не заменяет его.
- NEON поддерживается в операционных системах Android (начиная с 2.3 Gingerbread), iOS (с iPhone 3GS), Linux (ядро с 2.6.38) и Windows (ARM64).
Критика
Основные критические замечания касаются:
- Сложности отладки: ошибки в коде NEON (например, невыровненные данные) трудно диагностировать.
- Фрагментации: разные версии ARM (v7, v8, v9) имеют несовместимые наборы инструкций, что усложняет кроссплатформенную разработку.
- Ограниченной поддержки в мобильных GPU: многие задачи (например, рендеринг) эффективнее выполнять на GPU, а не на NEON.
Источники
- ARM Architecture Reference Manual ARMv7-A and ARMv8-A (ARM Limited, 2014–2021).
- «ARM NEON Programming Quick Reference» (ARM, 2012).
- «Optimizing Software in C++: An ARM Guide» (Agner Fog, 2020).
- «NEON Intrinsics Reference» (ARM Developer Documentation, 2023).
- «The ARMv8-A Architecture and Its Programming Model» (David A. Patterson, John L. Hennessy, 2017).
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →