# highway

Современная библиотека SIMD (Single Instruction Multiple Data) для C++, разработанная для написания высокопроизводительного векторного кода, который автоматически адаптируется к различным процессорным архитектурам. Библиотека позволяет писать один код, который компилируется в эффективные SIMD-инструкции для разных платформ (x86, ARM, PPC, WASM) с поддержкой различных расширений набора команд.

## Особенности

- автоматическая адаптация к доступным SIMD-инструкциям (SSE, AVX, AVX-512, NEON, SVE, VSX);
- единый API для различных архитектур, позволяющий писать переносимый векторный код;
- поддержка как целочисленных, так и операций с плавающей точкой;
- минимальные накладные расходы при диспетчеризации во время выполнения;
- удобные абстракции для работы с векторами, масками и операциями;
- поддержка компиляции для WebAssembly с SIMD;
- header-only реализация (только заголовочные файлы) для простоты интеграции.

## Основные компоненты

Highway предоставляет набор типов и функций для написания векторного кода, который компилируется в эффективные SIMD-инструкции для целевой платформы (подробнее с документацией можно ознакомиться [здесь](https://github.com/google/highway)).

### Векторные типы и операции

Библиотека предоставляет обобщенные векторные типы, которые абстрагируют конкретные SIMD-регистры и позволяют выполнять операции над несколькими значениями одновременно. Эти типы автоматически выбирают подходящий размер вектора в зависимости от целевой архитектуры.

Основные векторные типы:

- `hwy::V` — шаблонный тип вектора, параметризованный типом элементов и количеством элементов;
- `hwy::ScalableV` — масштабируемые векторы для архитектур с переменной длиной вектора (SVE, RISC-V V);
- `hwy::FixedV` — векторы фиксированного размера для точного контроля над использованием регистров;
- `hwy::Mask` — тип масок для условных операций над векторами;
- `hwy::Vec` и `hwy::Mask` для конкретных типов данных (например, `Vec128<float>`).

### Базовые векторные операции

Highway предоставляет полный набор операций для работы с векторами, включая арифметические, логические, побитовые операции и операции сравнения. Все операции гарантированно компилируются в оптимальные SIMD-инструкции для целевой платформы.

Основные операции:

- `Add()`, `Sub()`, `Mul()`, `Div()` — арифметические операции;
- `And()`, `Or()`, `Xor()`, `Not()` — побитовые операции;
- `ShiftLeft()`, `ShiftRight()` — сдвиги;
- `Equal()`, `GreaterThan()`, `LessThan()` — операции сравнения;
- `Min()`, `Max()` — минимальное и максимальное значения;
- `Sqrt()`, `Abs()`, `Round()` — математические функции.

### Загрузка и сохранение данных

Библиотека предоставляет эффективные методы для загрузки данных из памяти в векторные регистры и сохранения результатов обратно в память. Эти операции включают поддержку различных режимов выравнивания и шаблонов доступа.

Функции загрузки и сохранения:

- `Load()` — загрузка вектора из выровненной памяти;
- `LoadU()` — загрузка вектора из невыровненной памяти;
- `Store()` — сохранение вектора в выровненную память;
- `StoreU()` — сохранение вектора в невыровненную память;
- `Stream()` — потоковое сохранение с минимизацией загрязнения кэша;
- `Gather()` и `Scatter()` — сборка вектора из разреженной памяти и разборка вектора в разреженную память.

### Управление масками и условные операции

Highway предоставляет развитую систему масок для выполнения условных операций над векторами. Маски позволяют выбирать элементы векторов на основе условий, что является важным аспектом векторного программирования.

Операции с масками:

- `MaskFromVec()` — создание маски из вектора сравнения;
- `IfThenElse()` — условный выбор элементов из двух векторов;
- `MaskedLoad()` и `MaskedStore()` — загрузка и сохранение с маской;
- `Compress()` и `CompressStore()` — сжатие вектора на основе маски;
- `Expand()` — расширение сжатого вектора.

### Диспетчеризация во время выполнения

Highway использует систему диспетчеризации во время выполнения для выбора оптимальной реализации кода в зависимости от доступных SIMD-инструкций процессора. Это позволяет одному двоичному файлу эффективно работать на разных поколениях процессоров.

Механизмы диспетчеризации:

- `HWY_DYNAMIC_DISPATCH` — макрос для автоматической диспетчеризации функций;
- `hwy::SupportedTargets()` — получение битовой маски поддерживаемых целевых архитектур;
- `hwy::ChooseCompileTarget()` — выбор целевой архитектуры для компиляции;
- Множественные реализации функции с тегами целевых архитектур.

### Интеграция и использование

Highway легко интегрируется в проекты на C++ благодаря своей header-only природе. Библиотека требует поддержки C++11 или новее и может использоваться в различных областях, где требуется высокая производительность вычислений.

**Типичные сценарии использования:**
- Обработка изображений и видео (фильтрация, преобразование цветовых пространств);
- Обработка аудиосигналов и цифровая фильтрация;
- Научные вычисления и симуляции;
- Машинное обучение и нейронные сети (активации, свёртки);
- Криптографические алгоритмы и хеширование;
- Анализ данных и статистические вычисления.
