Открыть сервис

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 могут выполняться параллельно с основным потоком, если не конфликтуют по ресурсам.

Классификация

По поколениям

  1. ARMv7 NEON (32-бит): 16 регистров, поддержка float32, целых 8/16/32 бит. Используется в Cortex-A8, A9, A15.
  2. ARMv8 NEON (64-бит): 32 регистра, поддержка float64, целых 8/16/32/64 бит. Используется в Cortex-A53, A57, A72, A76.
  3. 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 NEONIntel SSE/AVXRISC-V Vector
Разрядность128 бит128/256/512 битПеременная (до 2048 бит)
Типы данныхint8–64, float32/64int8–64, float32/64int8–64, float32/64, bfloat16
Количество регистров16–3216–3232 (v0–v31)
ЭнергопотреблениеНизкоеСреднее/высокоеНизкое
Поддержка в компиляторахGCC, Clang, MSVCGCC, Clang, MSVC, ICCGCC, 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 →