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-инструкции для целевой платформы (подробнее с документацией можно ознакомиться здесь).

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

Библиотека предоставляет обобщенные векторные типы, которые абстрагируют конкретные 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 или новее и может использоваться в различных областях, где требуется высокая производительность вычислений.

Типичные сценарии использования:

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

Использование в проекте

Документация по использованию Conan-пакетов для разработки приложений для ОС Аврора.

На сервере Conan библиотеки заранее собраны и размещены под различные версии ОС Аврора 4 и ОC Аврора 5. Для данных версий представлены архитектуры armv7hl, aarch64 и x84_64.

Библиотеку можно использовать в проекте с помощью данного conanfile.py

from conan import ConanFile

class Application(ConanFile):
    settings = "os", "compiler", "arch", "build_type"
    generators = "PkgConfigDeps"

    requires = (
        "highway/1.2.0@aurora",
    )    

Процесс локальной сборки описан в документации.

highway

Performance-portable, length-agnostic SIMD with runtime dispatch
Лицензия
Apache-2.0
Версия
Домашняя страница
Скачать
armv8
1.96 Mb
MD5: ed3fd5aa2dd045ea71f4c9699e84a93e
Updated: 27.12.2025, 17:43:53
x86_64
2.03 Mb
MD5: 9a95318cc6e6da4d418abf697470c000
Updated: 27.12.2025, 17:43:59
armv7
632.16 Kb
MD5: 96bfced7f1479e8a01810753e0c7466e
Updated: 27.12.2025, 17:43:58
Использование в проекте

Мы используем cookies для персонализации сайта и его более удобного использования. Вы можете запретить cookies в настройках браузера.

Пожалуйста ознакомьтесь с политикой использования cookies.