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