AVX2 — расширение набора инструкций x86¶
AVX2 (Advanced Vector Extensions 2) — расширение набора инструкций процессоров архитектуры x86-64, разработанное компанией Intel и впервые представленное в 2013 году. Расширение расширяет возможности AVX (появившегося в 2011 году), добавляя 256-битные целочисленные SIMD-инструкции, операции с векторами общего назначения и улучшенные инструкции для работы с битовыми масками. AVX2 является обязательным компонентом набора инструкций AVX-512 и входит в состав всех современных процессоров Intel (начиная с микроархитектуры Haswell, 2013 год) и AMD (начиная с микроархитектуры Excavator, 2015 год, и массово — с Zen, 2017 год).
¶История и разработка
Работа над AVX2 началась после выхода AVX в 2011 году. Первоначально расширение планировалось под названием AVX2, однако в ходе разработки оно получило рабочее обозначение Haswell New Instructions (Haswell New Instructions, HNI), поскольку его дебют был привязан к выходу микроархитектуры Haswell в 2013 году. Спецификация AVX2 была опубликована Intel в 2013 году одновременно с выходом первых процессоров Haswell.
Ключевой мотивацией разработки стало расширение возможностей SIMD-программирования за счёт целочисленных операций. Первоначальный AVX был ориентирован преимущественно на операции с плавающей точкой, что ограничивало его применимость в задачах обработки изображений, криптографии, сжатия данных и других областях, где требуется работа с целыми числами.
¶Технические особенности
AVX2 расширяет набор инструкций AVX следующим образом:
- Целочисленные 256-битные SIMD-операции — арифметические, логические и сравнительные операции над векторами целых чисел шириной 256 бит (например, четыре 64-битных или восемь 32-битных целых чисел).
- Шифтовые операции — сдвиги целочисленных векторов на переменное количество бит, что ранее было доступно только для векторов плавающей точки.
- Gather-инструкции — загрузка данных из памяти по индексам, хранящимся в векторном регистре (например,
VPGATHERDD,VPGATHERQD). Это позволяет эффективно реализовывать таблицы поиска и разреженные операции над массивами. - Битовые операции —
VANDPS,VORPS,VXORPSи аналогичные инструкции для целочисленных векторов. - Улучшенные инструкции перемещения и конкатенации —
VPERM2I128,VPBLENDDи другие.
Все 256-битные регистры YMM используются полностью; при работе с целыми числами старшие 128 бит регистра YMM используются так же, как и младшие. Это отличает AVX2 от AVX, где целочисленные операции ограничивались 128-битными XMM-регистрами.
¶Поддержка в процессорах
| Производитель | Микроархитектура | Год выхода |
|---|---|---|
| Intel | Haswell, Broadwell и новее | 2013 |
| AMD | Excavator (частично), Zen и новее | 2015–2017 |
| VIA | Zhaoxin (некоторые модели) | 2019+ |
В мобильных и серверных процессорах обеих компаний поддержка AVX2 стала стандартом начиная с поколения 2017 года. Некоторые процессоры AMD семейства Zen (Ryzen первого поколения) официально поддерживают AVX2, однако при работе с 256-битными инструкциями используют два 128-битных конвейера, что снижает производительность по сравнению с Intel.
¶Применение
AVX2 активно используется в следующих областях:
- Мультимедиа и обработка изображений — кодирование и декодирование видео (H.264, H.265, AV1), фильтрация, преобразования цветовых пространств.
- Криптография — алгоритмы AES, SHA, ChaCha20 и другие получают значительное ускорение за счёт целочисленных SIMD-операций.
- Машинное обучение — инференс нейронных сетей, особенно в фреймворках, использующих собственные SIMD-реализации (например, в компонентах TensorFlow и PyTorch).
- Сжатие данных — алгоритмы LZ4, Zstandard, brotli.
- Игры и графика — физические расчёты, генерация геометрии, обработка звука.
¶Программная поддержка
Для использования AVX2 доступны инструменты всех основных компиляторов: GCC (начиная с версии 4.7), Clang, Microsoft Visual C++ (с опцией /arch:AVX2). В GCC и Clang инструкции AVX2 включаются через атрибут target("avx2") или флаг -mavx2. Большинство стандартных библиотек (например, glibc) содержат специализированные реализации функций для процессоров с поддержкой AVX2, выбираемые автоматически во время выполнения.
Для определения поддержки AVX2 программно используется инструкция CPUID с функциональным номером 7, подфункцией 0, EBX-бит 5.
¶AVX2 и AVX-512
AVX2 является промежуточным этапом между AVX и AVX-512. В отличие от AVX-512, использующего 512-битные регистры ZMM и маскирующие регистры k0–k7, AVX2 работает только с 256-битными регистрами YMM. Процессоры с поддержкой AVX-512 также поддерживают AVX2. Практическое значение AVX2 сохраняется в связи с тем, что ряд процессоров (например, AMD Zen 1–Zen 3 и некоторые поколения Intel) не поддерживают AVX-512, а энергопотребление 512-битных инструкций выше.
¶Источники
- Intel 64 and IA-32 Architectures Software Developer's Manual
- Agner Fog — Instruction Tables
- AMD64 Architecture Programmer's Manual
- LLVM Language Reference Manual
- GCC x86 Built-in Functions Documentation
