Advanced vector extensions 2 avx2 какие процессоры поддерживают

Обновлено: 07.07.2024

AVX 2 (Advanced Vector Extensions 2) - расширение системы команд процессора, разработанное компанией Intel в дополнение к набору инструкций AVX. Впервые использовано в 2013 г. в процессорах Intel на ядре Haswell.

• добавлена инструкция Fused Multiply Add (FMA), объединяющая в себе операции сложения и умножения (а это ключевые действия в цифровой обработке сигналов);

• реализована возможность операций с 256-битными целочисленными векторами;

• реализована поддержка так называемых gather-инструкций, благодаря которым перестает действовать строгое требование непрерывного расположения данных в памяти. Теперь данные могут собираться из разных адресов памяти;

• добавлены инструкции манипуляций/операций над битами.

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


Технологии и инструкции, используемые в процессорах

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

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

Так, полюбившийся многим браузер Google Chrome не работает без поддержки процессором SSE2. Инструкции AVX могут в разы ускорить обработку фото- и видеоконтента. А недавно один мой знакомый на достаточно быстром Phenom II (6 ядер) не смог запустить игру Mafia 3, поскольку его процессор не поддерживает инструкции SSE4.2.

Если аббревиатуры SSE, MMX, AVX, SIMD вам ни о чем не говорят и вы хотели бы разобраться в этом вопросе, изложенная здесь информация станет неплохим подспорьем.


Таблица совместимости процессоров и материнских плат AMD

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

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


Сравнение процессоров

В таблицу можно одновременно добавить до 6 процессоров, выбрав их из списка (кнопка "Добавить процессор"). Всего доступно больше 2,5 тыс. процессоров Intel и AMD.

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

Дополнительные рекомендации по использованию таблицы можно найти внизу страницы.


Спецификации процессоров

В этой базе собраны подробные характеристики процессоров Intel и AMD. Она содержит спецификации около 2,7 тысяч десктопных, мобильных и серверных процессоров, начиная с первых Пентиумов и Атлонов и заканчивая последними моделями.

Информация систематизирована в алфавитном порядке и будет полезна всем, кто интересуется компьютерной техникой.

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

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

Для получения подробной информации о любом процессоре достаточно нажать на его название.


Как проверить стабильность процессора

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

В статье описан порядок проверки процессора при помощи программы Prime95, которая, по мнению многих экспертов и оверлокеров, является лучшим средством для этих целей.



ПОКАЗАТЬ ЕЩЕ

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

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

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

image

Это короткий пост об исследовании поведения AVX2 и AVX-512 в связи с лицензионным даунклокингом новых чипов Intel Ice Lake.

Лицензионный даунклокинг 1 — это малоизвестный эффект, при котором пределы частот опускаются ниже номинальных в случае выполнения определённых SIMD-инструкций, особенно тяжёлых инструкций с плавающей запятой или инструкций с 512-битной шириной.

Подробности о подобном виде даунклокинга можно прочитать в этом ответе на StackOverflow, и мы уже довольно детально объясняли низкоуровневую механику подобных переходов. Также можно найти инструкции о том, как воспользоваться широкими SIMD (Single Instruction Multiple Data: тип или расширение архитектуры набора команд, например, Intel AVX или ARM NEON, способные выполнять множественные идентичные операции с элементами, упакованными в SIMD-регистр) с учётом этой проблемы 2 .

Информация по ссылкам написана в контексте Skylake-SP (SKX, серверной архитектуры Intel Skylake, включающей в себя Skylake-SP, Skylake-X и Skylake-W), которые стали первым поколением чипов с поддержкой AVX-512.

Какова же ситуация с Ice Lake — с самыми новыми чипами, поддерживающими как инструкции AVX-512 из SKX, так и имеющими совершенно новый набор инструкций AVX-512? Нам придётся смотреть на эти новые инструкции издалека, и мы никогда не сможем воспользоваться ими из-за даунклокинга?

Прочитайте статью, чтобы разобраться, или просто перейдите к разделу «Итоги».

AVX-Turbo

Мы будем использовать утилиту avx-turbo для измерения зависимости частот от количества ядер и набора инструкций. Этот инструмент работает просто: выполняет заданный набор инструкций на заданном количестве ядер, измеряя частоту, достигнутую во время теста.

Например, тест avx256_fma_t , измеряющий затраты на тяжёлые 256-битные инструкции с высокой ILP (Instruction level parallelism: величина параллелизма на межинструкционном уровне суперскалярного процессора), выполняет следующую последовательность FMA:

Результаты Ice Lake

Я запускал avx-turbo описанным выше образом на Ice Lake i5-1035G4 — клиентском процессоре Ice Lake среднего диапазона мощности, работающего с частотой до 3,7 ГГц. Полные результаты скрыты в gist, а здесь я представлю самые важные результаты по полученным частотам (все значения указаны в ГГц):

Как и ожидалось, максимальное падение частоты происходит при увеличении количества активных ядер, но просмотрите вниз каждый столбец, чтобы оценить влияние на категории инструкций. Вдоль этой оси почти никакого даунклокинга не происходит! Только при одном активном ядре возникает снижение при широких инструкциях, и всего лишь на жалкие 100 МГц: с 3 700 МГц до 3 600 МГц при использовании любых 512-битных инструкций.

Во всех остальных случаях, в том числе и при нескольких активных ядрах, а также тяжёлых 256-битных лицензионный даунклокинг равен нулю: всё работает так же быстро, как и со скалярными инструкциями.

Виды лицензий

Здесь существует и ещё одно изменение. В архитектуре SKX есть три лицензии, или категории инструкций, относящихся к даунклокингу: L0, L1 и L2. Здесь, в клиентском ICL, их всего две 3 и они неточно соответствуют трём категориям в SKX.

Лицензии в SKX соответствуют ширине и тяжести инструкций следующим образом:

Ширина Лёгкие Тяжёлые
Скалярные/128 L0 L0
256 L0 L1
512 L1 L2

В частности, обратите внимание на то, что тяжёлые 256-битные инструкции имеют ту же лицензию, что и лёгкие 512-битные.

В клиентских ICL схема такова:

Ширина Лёгкие Тяжёлые
Скалярные/128 L0 L0
256 L0 L0
512 L1 L1

Здесь тяжёлые 256-битные и лёгкие 512-битные инструкции находятся в разных категориях! На самом деле, похоже, здесь не применяется концепция противопоставления лёгких и тяжёлых инструкций: разбивка на категории целиком зависит от ширины 4 .

Ну и что?

Ну и что же из этого?

По меньшей мере, это означает, что нам нужно изменить нашу мысленную модель затратности инструкций AVX-512 относительно частот. Вместо того, чтобы говорить, что они «обычно вызывают значительный даунклокинг», про этот чип Ice Lake можно сказать, что AVX-512 вызывает незначительный или нулевой лицензионный даунклокинг, и я предполагаю, что это справедливо также для других клиентских чипов Ice Lake.

Однако это смена наших ожиданий имеет важный изъян: лицензионный даунклокинг не является единственным источником даунклокинга. Мы также можем столкнуться с ограничениями мощности, тепловыделения или тока. Некоторые конфигурации способны выполнять широкие SIMD-инструкции на всех ядрах только в течение короткого времени, а затем превышают пределы рабочей мощности. В моём случае ноутбук за 250 долларов, на котором проводилось тестирование, имел чрезвычайно плохое охлаждение, и вместо ограничений мощности я столкнулся с пределом тепловыделения (100°C) всего спустя несколько секунд после запуска тяжёлых инструкций на всех ядрах.

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

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

Итоги

Вот, какие выводы я сделал.

  • Процессор Ice Lake i5-1035 демонстрирует всего 100 МГц лицензионного даунклокинга с одним активным ядром при выполнении 512-битных инструкций.
  • Во всех прочих случаях даунклокинг отсутствует.
  • Турбочастота выполнения 512-битных инструкций на всех ядрах равна 3,3 ГГц, что составляет 89% от максимума частоты выполнения скалярных операций на одном ядре (3,7 ГГц), поэтому в рамках ограничений мощности и тепловыделения этот чип имеет очень «плоскую» частотную зависимость.
  • В отличие от архитектуры SKX, этот чип Ice Lake не использует разделение на «лёгкие»
    и «тяжёлые» инструкции для масштабирования частот: FMA-операции выполняются так же, как и более лёгкие операции.

Обсуждения и общение

Этот пост можно обсудить на on Hacker News.

Если у вас есть вопросы или другая обратная связь, то можете оставить комментарий к оригиналу поста. Мне были бы также интересны результаты на других чипах ICL, например, на версиях i3 и i7: дайте мне знать, если у вас они есть, и мы сможем получить результаты.

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