Advanced vector extensions что это

Обновлено: 30.06.2024

Intel® Advanced Vector Extensions 512 (Intel® AVX-512).

В различных отраслях продолжает возрастать потребность в повышенной вычислительной мощности. Чтобы поддержать повышающийся спрос и усложняющиеся модели использования, мы продолжаем предоставлять оптимизированные под рабочие нагрузки инновационные решения, реализуемые в наборе команд Intel® Advanced Vector Extensions 512 (Intel® AVX-512), которым оснащены новейшие процессоры и сопроцессоры Intel® Xeon Phi™ 1 , а также масштабируемые процессоры Intel® Xeon®.

Усовершенствованные возможности векторной обработки

Благодаря возможностям для осуществления операций с 512-битными векторами набор команд Intel® AVX-512 справится даже с наиболее требовательными вычислительными задачами.

Приложения могут осуществлять 32 операции с плавающей запятой с удвоенной точностью и 64 операции с плавающей запятой с одинарной точностью за тактовый цикл в 512-битных векторах, а также 8 целочисленных типов шириной 64 бит и 16 целочисленных типов шириной 32 бит и до двух 512-битных команд Fused Multiply-Add (FMA). Таким образом, ширина регистров данных, число регистров и ширина команд FMA вдвое больше по сравнению с набором команд Intel® Advanced Vector Extensions 2 (Intel® AVX2) 3 4 .

Повышение производительности для ресурсоемких рабочих нагрузок

Intel® Advanced Vector Extensions 512 (Intel® AVX-512) — это новый набор команд, который повышает производительность различных рабочих нагрузок, включая научное моделирование, финансовую аналитику, искусственный интеллект, глубинное обучение, 3D-моделирование, анализ данных, обработку изображений, аудио, видео, сжатие данных и шифрование 2 .

Ускоряем неускоряемое или знакомимся с SIMD, часть 2 — AVX

Предыдущая часть вызвала бурную дискуссию, в ходе которой выяснилось, что AVX/AVX2 на самом деле есть в десктопных CPU, нет только AVX512. Поэтому продолжаем знакомиться с SIMD, но уже с современной его частью — AVX. А так же разберём некоторые комментарии:

  • медленнее ли _mm256_load_si256 , чем прямое обращение к памяти?
  • влияет ли на скорость использование AVX команд над SSE регистрами?
  • действительно ли так плохо использовать _popcnt ?

Немного про AVX

AVX/AVX2 — это более мощная версия SSE, которая расширяет большинство 128 битных SSE операций до 256 бит, плюс приносит ряд новых инструкций.

Из тонкостей реализации можно выделить то, что на уровне ассемблера AVX использует 3 аргумента, что позволяет не разрушать данные в первых двух. SSE сохраняет результат в одном из аргументов.

Так же нужно учитывать, что при прямой адресации данные должны быть выровнены по 32 байта, в SSE выравнивание по 16.

Дополненная версия бенчмарка

  1. Количество элементов увеличено в 10 000 раз (до 10 240 000), чтобы гарантированно не вместиться в кэш процессора.
  2. Выравнивание изменено с 16 байт на 32 для поддержки AVX.
  3. Добавлены AVX реализации аналогичные SSE.

Новые результаты выглядят так (-O0):

Итого суммарное ускорение в 9+ раз, AVX ожидаемо быстрей SSE почти в 2 раза.

Медленнее ли _mm256_load_si256 , чем прямое обращение к памяти?

Однозначного ответа нет. С -O0 медленнее прямого обращения, но быстрее _mm256_loadu_si256 :

С -O3 быстрее, чем прямое обращение к памяти, но всё ещё ожидаемо медленней _mm256_loadu_si256 .

В продакшн коде всё-таки лучше использовать _mm256_load_si256 вместо прямого обращения, этот вариант компилятор умеет лучше оптимизировать.

Влияет ли на скорость использование AVX команд над SSE регистрами?

Короткий ответ — нет. Для эксперимента я собрал и запустил бенчмарк с -mavx2 и с -msse4.2 .

-mavx2
-msse4.2
bonus

Действительно ли так плохо использовать _popcnt ?

В одном из комментариев Antervis написал:

а потом, в конце цикла, сделать одно горизонтальное сложение (не забывая про переполнение).

Использование Intel AVX: пишем программы завтрашнего дня

Чтобы убедиться в работоспособности AVX кода лучше написать к нему Unit-тесты. Однако встаёт вопрос: как запустить эти Unit-тесты, если ни один ныне продаваемый процессор не поддерживает AVX? В этом вам поможет специальная утилита от Intel — Software Development Emulator (SDE). Всё, что умеет SDE — это запускать программы, на лету эмулируя новые наборы инструкций. Разумеется, производительность при этом будет далека от таковой на реальном железе, но проверить корректность работы программы таким образом можно. Использовать SDE проще простого: если у вас есть unit-тест для AVX кода в файле avx-unit-test.exe и его нужно запускать с параметром «Hello, AVX!», то вам просто нужно запустить SDE с параметрами
sde -- avx-unit-test.exe "Hello, AVX!"
При запуске программы SDE сэмулирует не только AVX инструкции, но также и инструкции XGETBV и CPUID, так что если вы используете предложенный ранее метод для детектирования поддержки AVX, запущенная под SDE программа решит, что AVX действительно поддерживается. Кроме AVX, SDE (вернее, JIT-компилятор pin, на котором SDE построен) умеет эмулировать SSE3, SSSE3, SSE4.1, SSE4.2, SSE4a, AES-NI, XSAVE, POPCNT и PCLMULQDQ инструкции, так что даже очень старый процессор не помешает вам разрабатывать софт под новые наборы инструкций.

Оценка производительности AVX кода

Некоторое представление о производительности AVX кода можно получить с помощью другой утилиты от Intel — Intel Architecture Code Analyzer (IACA). IACA позволяет оценить время выполнения линейного участка кода (если встречаются команды условных переходов, IACA считает, что переход не происходит). Чтобы использовать IACA, нужно сначала пометить специальными маркерами участки кода, которые вы хотите проанализировать. Маркеры выглядят следующим образом:
; Начало участка кода, который надо проанализировать
%macro IACA_START 0
mov ebx, 111
db 0x64, 0x67, 0x90
%endmacro

  • -32 — означает, что входной объектный файл (MS COFF) содержит 32-битный код. Для 64-битного кода нужно указывать -64. Если на вход IACA подаётся не объектный файл (.obj), а исполняемый модуль (.exe или .dll), то этот аргумент можно не указывать.
  • -arch AVX — показывает IACA, что нужно анализировать производительность этого кода на будущем процессоре Intel с поддержкой AVX (т.е. Sandy Bridge). Другие возможные значения: -arch nehalem и -arch westmere.
  • -cp DATA_DEPENDENCY просит IACA показать, какие инструкции находятся на критическом путе для данных (т.е. какие инструкции нужно соптимизировать, чтобы результат работы этого кода вычислялся быстрее). Другое возможное значение: -cp PERFORMANCE просит IACA показать, какие инструкции «затыкают» конвеер процессора.
  • -mark 0 говорит IACA проанализировать все помеченные маркерами участки кода. Если задать -mark n, IACA будет анализировать только n-ый размеченный участок кода.
  • -o avx-sample задаёт имя файла, в который будут записаны результаты анализа. Можно опустить этот параметр, тогда результаты анализа будут выведены в консоль.

Analysis Report
---------------
Total Throughput: 2 Cycles; Throughput Bottleneck: FrontEnd, Port2_ALU, Port2_DATA, Port4
Total number of Uops bound to ports: 6
Data Dependency Latency: 14 Cycles; Performance Latency: 15 Cycles

N - port number, DV - Divider pipe (on port 0), D - Data fetch pipe (on ports 2 and 3)
CP - on a critical Data Dependency Path
N - number of cycles port was bound
X - other ports that can be used by this instructions
F - Macro Fusion with the previous instruction occurred
^ - Micro Fusion happened
* - instruction micro-ops not bound to a port
@ - Intel(R) AVX to Intel(R) SSE code switch, dozens of cycles penalty is expected
! - instruction not supported, was not accounted in Analysis

| Num of | Ports pressure in cycles | |
| Uops | 0 - DV | 1 | 2 - D | 3 - D | 4 | 5 | |
------------------------------------------------------------
| 1 | | | | 1 | 2 | X | X | | | CP | vmovups ymm0, ymmword ptr [ecx]
| 2^ | | | | X | X | 1 | 1 | | 1 | | vbroadcastss ymm1, dword ptr [edx]
| 1 | 1 | | | | | | | | | CP | vmulps ymm0, ymm0, ymm1
| 2^ | | | | 1 | | X | | 2 | | CP | vmovups ymmword ptr [ecx], ymm0
| 0* | | | | | | | | | | | vzeroupper

Самыми важными метриками здесь являются Total Throughput и Data Dependency Latency. Если код, который вы оптимизируете, это небольшая подпрограмма, и в программе есть зависимость по данным от её результата, то вам нужно стараться сделать Data Dependency Latency как можно меньше. В качестве примера может служить приведённый выше листинг подпрограммы vec4_dot_avx. Если же оптимизируемый код — это часть цикла, обрабатывающего большой массив элементов, то ваша задача — уменьшать Total Throughput (вообще-то эта метрика должна была бы называться Reciprocal Throughput, ну да ладно).

Использование AVX в коде на C/C++
  • Microsoft C/C++ Compiler начиная с версии 16 (входит в Visual Studio 2010)
  • Intel C++ Compiler начиная с версии 11.1
  • GCC начиная с версии 4.4
  • /arch:AVX — для Microsoft C/C++ Compiler и Intel C++ Compiler под Windows
  • -mavx — для GCC и Intel C++ Compiler под Linux
  • /QxAVX — для Intel C++ Compiler
  • /QaxAVX — для Intel C++ Compiler
Определение поддержки AVX системой
  • Windows 7
  • Windows Server 2008 R2
  • Linux с ядром 2.6.30 и выше

Нетрудно заметить, что маски XSTATE_MASK_* соответствуют аналогичным битам регистра XFEATURE_ENABLED_MASK.
В дополнение к этому, в Windows DDK есть описание функции RtlGetEnabledExtendedFeatures и констант XSTATE_MASK_XXX, как две капли воды похожих на GetEnabledExtendedFeatures и XSTATE_MASK_* из WinNT.h. Т.о. для определения поддержки AVX со стороны Windows можно воспользоваться следующим кодом:
int isAvxSupportedByWindows() const DWORD64 avxFeatureMask = XSTATE_MASK_LEGACY_SSE | XSTATE_MASK_GSSE;
return GetEnabledExtendedFeatures( avxFeatureMask ) == avxFeatureMask;
>
Если ваша программа должна работать не только в Windows 7 и Windows 2008 R2, то функцию GetEnabledExtendedFeatures нужно подгружать динамически из kernel32.dll, т.к. в других версиях Windows этой функции нет.

В Linux, насколько мне известно, нет отдельной функции, чтобы узнать о поддержке AVX со стороны ОС. Но вы можете воспользоваться тем фактом, что поддержка AVX было добавлена в ядро 2.6.30. Тогда остаётся только проверить, что версия ядра не меньше этого значения. Узнать версию ядра можно с помощью функции uname.

Использование AVX-инструкций
Тестирование AVX кода

Если вы используете набор инструкций AVX посредством intrinsic-функций, то, кроме запуска этого кода под эмулятором SDE, у вас есть ещё одна возможность — использовать специальный заголовочный файл, эмулирующий 256-битные AVX intrinsic-функции через intrinsic-функции SSE1-SSE4.2. В этом случае у вас получится исполняемый файл, который можно запустить на процессорах Nehalem и Westmere, что, конечно, быстрее эмулятора. Однако учтите, что таким методом не получиться обнаружить ошибки генерации AVX-кода компилятором (а они вполне могут быть).

Оценка производительности AVX кода

Использование IACA для анализа производительности AVX кода, созданного C/C++ компилятором из intrinsic-функций почти ничем не отличается от анализа ассемблерного кода. В дистрибутиве IACA можно найти заголовочный файл iacaMarks.h, в котором описаны макросы-маркеры IACA_START и IACA_END. Ими нужно пометить анализируемые участки кода. В коде подпрограммы маркер IACA_END должен находиться до оператора return, иначе компилятор «соптимизирует», выкинув код маркера. Макросы IACA_START/IACA_END используют inline-ассемблер, который не поддерживается Microsoft C/C++ Compiler для Windows x64, поэтому если для него нужно использовать специальные варианты макросов — IACA_VC64_START и IACA_VC64_END.

Заключение

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

Связанная продукция и решения

Повысьте производительность с помощью набора команд Intel® AVX-512

Intel® Advanced Vector Extensions 512 (Intel® AVX-512), новейший набор векторных команд x86, включает в себя до двух команд FMA (Fused Multiply-Add) и другие оптимизации для повышения производительности наиболее ресурсоемких вычислительных задач.

Серверная продукция

Процессоры Intel® справляются с любыми рабочими нагрузками — от обработки бизнес-данных с интенсивным обращением к памяти до облачных вычислений — и повышают эффективность центра обработки данных.

Семейство процессоров Intel® Xeon Phi™

Исключите ограничения производительности в узлах, упростите модернизацию кода и создайте энергоэффективную архитектуру благодаря семейству продукции Intel® Xeon Phi™.

Семейство процессоров Intel® Xeon®

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

Корпоративный центр обработки данных

Получите доступ к ресурсам, созданным на основе обширного опыта Intel во всех вопросах, связанных с центрами обработки данных.

Как понять технологию Intel® Crypto Acceleration

Узнайте больше о наборе команд Intel AVX-512 и технологии Intel® Crypto Acceleration, чтобы понять и оптимизировать использование этих команд, которые теперь доступны в масштабируемых процессорах Intel® Xeon® 3-го поколения.

Информация о продукте и производительности
1 Семейство процессоров Intel® Xeon Phi™ 7200/семейство сопроцессоров Intel® Xeon Phi™ 7200 или более поздней серии.

Результаты эталонных тестов получены до применения недавних пакетов исправлений ПО и обновлений встроенного ПО, предназначенных для устранения уязвимостей под названием «Spectre» и «Meltdown». После установки этих обновлений данные результаты могут быть неприменимы к вашему устройству или системе.

Intel® AVX 2.0 позволяет выполнять 16 операций с плавающей запятой в секунду с удвоенной точностью и 32 операции с плавающей запятой в секунду с одинарной точностью за тактовый цикл в 256-битных векторах, а также до двух 256-битных команд Fused Multiply-Add (FMA).

Технология расширений набора команд Intel®

Расширения набора инструкций Intel® — это дополнительные инструкции, которые могут увеличить производительность при выполнении одних и тех же операций над несколькими объектами данных.

Расширения наборов команд могут включать:

  • Единая Инструкция для множественных данных (SIMD)
  • Процессоры Intel® Streaming SIMD Extensions (Intel® SSE, Intel® SSE2, Intel® SSE3 и Intel® SSE4)
  • Intel® Advanced Vector Extensions (Intel® AVX, Intel® AVX2 и Intel® AVX-512)

Нажмите или в теме, чтобы получить подробную информацию

    .
  • Перейдите на страницу спецификации продукции и введите номер процессоров Intel в поле поиска.
  • На вкладке Advanced Technologies найдите расширения набора команд.

Enter number of the Intel processors


Как узнать, какие расширения набора команд Intel моей системы имеют? Есть ли какое бы то ни было средство, которое отображает эту информацию?

Вы можете использовать программу Intel для идентификации, нажмите на вкладку " технологии ЦП " и найдите расширения набора инструкций Intel®. См. Следующий пример:


Потоковые SIMD-расширения (SSE)

SSE — это процессорная технология, которая обеспечивает единую инструкцию для нескольких данных. Более старые процессоры обрабатывают только один элемент данных на каждой инструкции. SSE позволяет выполнять инструкции для обработки нескольких элементов данных. Она используется в ресурсоемких приложениях, таких как 3D-графика, для ускорения обработки.

SSE предназначен для замены технологии MMX™. Она расширяется по поколениям процессоров Intel®, включая SSE2, SSE3/SSE3S и SSE4. Каждая итерация привела новые инструкции и повышенную производительность.

Потоковые SIMD-расширения 2 (SSE2)

SSE2 расширяет технологии MMX и SSE Благодаря дополнению 144 инструкций, обеспечивающих повышенную производительность для широкого спектра приложений. Инструкции SIMD Integer, представленные с помощью технологии MMX, расширены с 64 на 128 бит. Это удваивает эффективную скорость выполнения операций с типом SIMD Integer.

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

Первоначальные инструкции SSE усовершенствованы для поддержки гибкого и более высокого динамического диапазона вычислительной мощности. Это делается за счет поддержки арифметических операций над несколькими типами данных. Примерами могут служить двухбайтовые слова и четыре слова. Инструкции SSE2 позволяют разработчикам программного обеспечения обеспечить максимальную гибкость. Они могут реализовывать алгоритмы и обеспечивать повышение производительности при выполнении программного обеспечения, такого как MPEG-2, MP3 и 3D Graphics.

Потоковые SIMD-расширения 3 (SSE3)

В процессоре Intel® Pentium® 4 на базе процессоров Intel-нанометровая тактовая частота представляет собой набор потоковых SIMD-расширений 3 (SSE3), который включает 13 более команд SIMD по сравнению с SSE2.90 13 новых инструкций в основном предназначены для улучшения синхронизации потоков и определенных областей приложения, например для мультимедиа и игр.

Потоковые SIMD-расширения 4 (SSE4)

SSE4 состоит из 54 инструкций. Набор, состоящий из 47 инструкций, который называется SSE 4.1 в документации Intel, доступен в Penryn. SSE 4.2, второй набор, состоящий из семи оставшихся инструкций, впервые доступен в Nehalem-процессоре Intel® Core™ i7. Корпорация Intel имеет обратную информацию от разработчиков при разработке набора инструкций.

Intel® Advanced Vector Extensions (Intel® AVX)

Intel® AVX — это 256-разрядное расширение набора команд Intel® SSE, предназначенное для приложений с интенсивной обработкой плавающих точек (FP). Intel AVX повышает производительность из-за более широкого спектра векторов, нового расширяемого синтаксиса и обширных функциональных возможностей. Intel AVX2 был выпущен в 2013, расширяя возможности обработки векторных изображений в доменах с плавающей запятой и целочисленными данными. Это приводит к более высокой производительности и более эффективному управлению данными в широком диапазоне различных приложений. Примерами могут быть обработка изображений и аудио/видео, инженерные симуляции, финансовая аналитика, 3D-моделирование и анализ.

Intel® Advanced Vector Extensions 512 (Intel® AVX-512)

Intel® AVX-512 позволяет обрабатывать два раза больше элементов данных, которые Intel AVX/AVX2 может обрабатывать с помощью одной инструкции и в четыре раза больше возможностей Intel SSE. Инструкции Intel AVX-512 имеют важное значение, так как они открывают более высокую производительность для самых ресурсоемких вычислительных задач. Инструкции Intel AVX-512 предлагают наивысший уровень поддержки компилятора в конструкции возможностей.

Раскройте весь потенциал своих приложений

Ознакомьтесь с подробной информацией о решениях для разработчиков, которые позволят вам еще больше оптимизировать работу ваших приложений и воспользоваться преимуществами набора инструкций Intel® AVX-512.

Читайте также: