AVX-512 — это 512-битные расширения 256-битных инструкций SIMD Advanced Vector Extensions для архитектуры набора инструкций x86 (ISA), предложенные Intel в июле 2013 года и впервые реализованные в Intel Xeon Phi x200 2016 года (Knights Landing), [1] , а затем в ряде процессоров AMD и других Intel (см. список ниже). AVX-512 состоит из нескольких расширений, которые могут быть реализованы независимо. [2] Эта политика является отходом от исторического требования реализации всего блока инструкций. Для всех реализаций AVX-512 требуется только основное расширение AVX-512F (AVX-512 Foundation).
Помимо расширения большинства 256-битных инструкций, расширения вводят различные новые операции, такие как новые преобразования данных, операции разброса и перестановки. [2] Количество регистров AVX увеличено с 16 до 32, и добавлено восемь новых «регистров масок», которые позволяют выбирать переменные и смешивать результаты инструкций. В процессорах с расширением длины вектора (VL), включенным в большинство процессоров с поддержкой AVX-512 (см. § Процессоры с AVX-512), эти инструкции также могут использоваться для векторов размером 128 и 256 бит.
AVX-512 — не первый набор 512-битных инструкций SIMD, который Intel представила в процессорах: более ранние 512-битные инструкции SIMD, использовавшиеся в сопроцессорах Xeon Phi первого поколения, полученные из проекта Larrabee компании Intel , похожи, но несовместимы на уровне двоичного кода и совместимы лишь частично на уровне исходного кода. [1]
Преемником AVX-512 является AVX10 , анонсированный в июле 2023 года [3] , который будет работать как на ядрах производительности, так и на ядрах эффективности .
Набор инструкций AVX-512 состоит из нескольких отдельных наборов, каждый из которых имеет свой собственный уникальный бит CPUID. Однако они обычно группируются по поколению процессоров, которое их реализует.
F, CD, ER, PF: представлены в Xeon Phi x200 (Knights Landing) и Xeon Gold/Platinum ( Skylake SP "Purley"), причем последние два (ER и PF) предназначены только для Knights Landing.
VL, DQ, BW: представлены в Skylake X и Cannon Lake .
IFMA, VBMI: введены с Cannon Lake . [5]
4VNNIW, 4FMAPS: введены в Knights Mill . [6] [7]
VPOPCNTDQ: Инструкция по подсчету популяции векторов . Представлена в Knights Mill и Ice Lake . [8]
VNNI, VBMI2, BITALG: введены в Ice Lake. [8]
VP2INTERSECT: представлен в Tiger Lake.
GFNI, VPCLMULQDQ, VAES: введены с Ice Lake. [8]
Префикс VEX, используемый AVX и AVX2, хотя и был гибким, не оставлял достаточно места для функций, которые Intel хотела добавить в AVX-512. Это привело к определению нового префикса под названием EVEX .
По сравнению с VEX, EVEX имеет следующие преимущества: [7]
Расширенные регистры, бит ширины SIMD и регистры маски операции AVX-512 являются обязательными и требуют поддержки со стороны ОС.
Инструкции AVX-512 разработаны для смешивания с 128/256-битными инструкциями AVX/AVX2 без потери производительности. Однако расширения AVX-512VL позволяют использовать инструкции AVX-512 на 128/256-битных регистрах XMM/YMM, поэтому большинство инструкций SSE и AVX/AVX2 имеют новые версии AVX-512, закодированные с префиксом EVEX, которые позволяют получить доступ к новым функциям, таким как opmask и дополнительные регистры. В отличие от AVX-256, новые инструкции не имеют новой мнемоники, но разделяют пространство имен с AVX, что делает различие между закодированными версиями VEX и EVEX инструкции неоднозначным в исходном коде. Поскольку AVX-512F работает только с 32- и 64-битными значениями, инструкции SSE и AVX/AVX2, которые работают с байтами или словами, доступны только с расширением AVX-512BW (поддержка байтов и слов). [7]
Ширина файла регистров SIMD увеличена с 256 бит до 512 бит и расширена с 16 до 32 регистров ZMM0–ZMM31. К этим регистрам можно обращаться как к 256-битным регистрам YMM из расширений AVX и 128-битным регистрам XMM из потоковых расширений SIMD , а устаревшие инструкции AVX и SSE могут быть расширены для работы с 16 дополнительными регистрами XMM16-XMM31 и YMM16-YMM31 при использовании закодированной формы EVEX.
Векторные инструкции AVX-512 могут указывать регистр opmask для управления тем, какие значения записываются в место назначения, кодировка инструкций поддерживает 0–7 для этого поля, однако, только регистры opmask k1–k7 (из k0–k7) могут использоваться в качестве маски, соответствующей значению 1–7, тогда как значение 0 зарезервировано для указания того, что регистр opmask не используется, т. е. жестко закодированная константа (вместо 'k0') используется для указания немаскированных операций. Специальный регистр opmask 'k0' по-прежнему является функционирующим, допустимым регистром, его можно использовать в инструкциях по манипулированию регистром opmask или использовать в качестве регистра opmask назначения. [9] Флаг управляет поведением opmask, которое может быть либо «нулевым», что обнуляет все, что не выбрано маской, либо «слиянием», что оставляет все, что не выбрано, нетронутым. Поведение слияния идентично инструкциям смешивания.
Регистры opmask обычно имеют ширину 16 бит, но могут быть до 64 бит с расширением AVX-512BW. [7] Однако сколько бит фактически используется, зависит от типа вектора маскируемых инструкций. Для 32-битных одиночных float или двойных слов 16 бит используются для маскирования 16 элементов в 512-битном регистре. Для двойных float и четверных слов используется максимум 8 бит маски.
Регистр opmask является причиной того, что несколько побитовых инструкций, которые, естественно, не имеют ширины элементов, были добавлены в AVX-512. Например, побитовые И, ИЛИ или 128-битное перемешивание теперь существуют как в двухсловном, так и в четырехсловном вариантах, с единственным отличием в окончательной маскировке.
Регистры opmask имеют новое мини-расширение инструкций, работающих непосредственно с ними. В отличие от остальных инструкций AVX-512, все эти инструкции закодированы VEX. Первоначальные инструкции opmask являются 16-битными (Word) версиями. С AVX-512DQ были добавлены 8-битные (Byte) версии для лучшего соответствия потребностям маскирования 8 64-битных значений, а с AVX-512BW были добавлены 32-битные (Double) и 64-битные (Quad) версии, чтобы они могли маскировать до 64 8-битных значений. Инструкции KORTEST и KTEST можно использовать для установки флагов x86 на основе регистров масок, чтобы их можно было использовать вместе с не-SIMD x86 ветвлениями и условными инструкциями.
Многие инструкции AVX-512 являются просто версиями EVEX старых инструкций SSE или AVX. Однако есть несколько новых инструкций и старых инструкций, которые были заменены новыми версиями AVX-512. Новые или сильно переработанные инструкции перечислены ниже. Эти базовые инструкции также включают расширения из AVX-512VL и AVX-512BW, поскольку эти расширения просто добавляют новые версии этих инструкций вместо новых инструкций.
Нет версий инструкций смешивания с префиксом EVEX из SSE4 ; вместо этого в AVX-512 есть новый набор инструкций смешивания, использующих регистры маски в качестве селекторов. Вместе с общими инструкциями сравнения в маску ниже они могут использоваться для реализации общих тернарных операций или cmov, аналогично VPCMOV из XOP .
Поскольку смешивание является неотъемлемой частью кодирования EVEX, эти инструкции также можно считать базовыми инструкциями перемещения. Используя режим смешивания обнуления, их также можно использовать в качестве инструкций маскирования.
AVX-512F имеет четыре новые инструкции сравнения. Как и их аналоги XOP , они используют непосредственное поле для выбора между 8 различными сравнениями. Однако, в отличие от своего вдохновения XOP, они сохраняют результат в регистре маски и изначально поддерживают только сравнения двойных и четверных слов. Расширение AVX-512BW предоставляет версии байта и слова. Обратите внимание, что для инструкций можно указать два регистра маски, один для записи и один для объявления обычного маскирования. [7]
Последний способ установки масок — использование Logical Set Mask. Эти инструкции выполняют либо AND, либо NAND, а затем устанавливают целевую opmask на основе результирующих значений, равных нулю или ненулевым. Обратите внимание, что, как и инструкции сравнения, они принимают два регистра opmask, один как целевой, а другой — как обычную opmask.
Инструкции сжатия и расширения соответствуют одноименным операциям APL . Они используют opmask немного иначе, чем другие инструкции AVX-512. Compress сохраняет только значения, отмеченные в маске, но сохраняет их сжатыми, пропуская и не резервируя место для неотмеченных значений. Expand работает наоборот, загружая столько значений, сколько указано в маске, а затем распространяя их на выбранные позиции.
Добавлен новый набор инструкций перестановки для полных двух входных перестановок. Все они принимают три аргумента, два исходных регистра и один индекс; результат выводится либо перезаписью первого исходного регистра, либо индексного регистра. AVX-512BW расширяет инструкции, включая также 16-битные (словные) версии, а расширение AVX-512_VBMI определяет байтовые версии инструкций.
Добавлены две новые инструкции, которые могут логически реализовать все возможные побитовые операции между тремя входами. Они принимают три регистра в качестве входных данных и 8-битное непосредственное поле. Каждый бит на выходе генерируется с использованием поиска трех соответствующих битов на входах для выбора одной из 8 позиций в 8-битном непосредственном поле. Поскольку с использованием трех битов возможны только 8 комбинаций, это позволяет выполнять все 3 возможные входные побитовые операции. [7] Это единственные побитовые векторные инструкции в AVX-512F; версии EVEX двух исходных побитовых векторных инструкций SSE и AVX AND, ANDN, OR и XOR были добавлены в AVX-512DQ.
Разница между версиями doubleword и quadword заключается только в применении opmask.
Добавлен ряд инструкций преобразования или перемещения; они завершают набор инструкций преобразования, доступных в SSE2.
Среди уникальных новых функций AVX-512F есть инструкции по разложению значений с плавающей точкой и обработке специальных значений с плавающей точкой . Поскольку эти методы являются совершенно новыми, они также существуют в скалярных версиях.
Это второй набор новых методов с плавающей точкой, который включает новое масштабирование и приблизительное вычисление обратного значения и обратного значения квадратного корня. Приблизительные обратные инструкции гарантируют относительную ошибку не более 2 −14 . [7]
Инструкции в обнаружении конфликтов AVX-512 (AVX-512CD) предназначены для эффективного вычисления бесконфликтных подмножеств элементов в циклах, которые обычно не могут быть безопасно векторизованы. [10]
Инструкции AVX-512 экспоненциальные и обратные (AVX-512ER) содержат более точные приблизительные обратные инструкции, чем в основе AVX-512; относительная ошибка не более 2 −28 . Они также содержат две новые экспоненциальные функции, которые имеют относительную ошибку не более 2 −23 . [7]
Инструкции предварительной выборки AVX-512 (AVX-512PF) содержат новые операции предварительной выборки для новой функциональности разброса и сбора, представленной в AVX2 и AVX-512. T0
Предварительная выборка означает предварительную выборку в кэш уровня 1 и T1
означает предварительную выборку в кэш уровня 2.
Два набора инструкций выполняют несколько итераций обработки. Они обычно встречаются только в продуктах Xeon Phi.
AVX-512DQ добавляет новые инструкции doubleword и quadword. AVX-512BW добавляет версии байтов и слов тех же инструкций, а также добавляет версии байтов и слов инструкций doubleword/quadword в AVX-512F. Несколько инструкций, которые получают только формы слов с AVX-512BW, получают формы байтов с расширением AVX-512_VBMI ( VPERMB
, VPERMI2B
, VPERMT2B
, VPMULTISHIFTQB
).
В набор инструкций маски были добавлены две новые инструкции: KADD
и KTEST
(формы B и W с AVX-512DQ, D и Q с AVX-512BW). Остальные инструкции маски, которые имели только формы слов, получили формы байтов с AVX-512DQ и формы двойных/четверных слов с AVX-512BW. KUNPCKBW
был расширен до KUNPCKWD
и KUNPCKDQ
с помощью AVX-512BW.
Среди инструкций, добавленных AVX-512DQ, есть несколько инструкций SSE и AVX, которые не получили версий AVX-512 с AVX-512F, среди них все две инструкции побитового ввода и инструкции извлечения/вставки целочисленных значений.
Ниже приведены совершенно новые инструкции.
Введены три новые операции с плавающей точкой. Поскольку они не только новые для AVX-512, они имеют как упакованные/SIMD, так и скалярные версии.
Инструкции VFPCLASS
проверяют, является ли значение с плавающей точкой одним из восьми специальных значений с плавающей точкой, какое из восьми значений вызовет бит в регистре выходной маски, контролируется непосредственным полем. Инструкции VRANGE
выполняют минимальные или максимальные операции в зависимости от значения непосредственного поля, которое также может контролировать, выполняется ли операция абсолютно или нет, и отдельно то, как обрабатывается знак. Инструкции VREDUCE
работают с одним источником и вычитают из него целую часть исходного значения плюс количество бит, указанных в непосредственном поле его дроби.
Расширить VPCOMPRESS и VPEXPAND с помощью байтовых и словесных вариантов. Новые инструкции сдвига.
Инструкции векторной нейронной сети: [11] AVX512-VNNI добавляет инструкции с кодировкой EVEX , описанные ниже. С AVX-512F эти инструкции могут работать с 512-битными векторами, а AVX-512VL дополнительно добавляет поддержку 128- и 256-битных векторов.
Более позднее расширение AVX-VNNI добавляет кодировки VEX этих инструкций, которые могут работать только с 128- или 256-битными векторами. AVX-VNNI не является частью набора AVX-512, не требует AVX-512F и может быть реализовано независимо.
Целочисленные объединенные инструкции умножения-сложения. AVX512-IFMA добавляет инструкции с кодировкой EVEX , описанные ниже.
Отдельное расширение набора инструкций AVX-IFMA определяет кодировку VEX этих инструкций. Это расширение не является частью набора AVX-512 и может быть реализовано независимо.
Новые инструкции поля Галуа полезны для криптографии, [12] поскольку их можно использовать для реализации S-box-ов в стиле Rijndael, таких как те, что используются в AES, Camellia и SM4 . [13] Эти инструкции также можно использовать для битовой манипуляции в сетях и обработке сигналов. [12]
GFNI — это автономное расширение набора инструкций, которое может быть включено отдельно от AVX или AVX-512. В зависимости от того, указывает ли ЦП поддержку AVX и AVX-512F, поддержка GFNI позволяет использовать устаревшие (SSE), VEX или EVEX-кодированные инструкции, работающие на 128, 256 или 512-битных векторах.
VPCLMULQDQ с AVX-512F добавляет EVEX-кодированную 512-битную версию инструкции PCLMULQDQ . С AVX-512VL он добавляет EVEX-кодированные 256- и 128-битные версии. VPCLMULQDQ отдельно (то есть на процессорах, отличных от AVX512) добавляет только VEX-кодированную 256-битную версию. (На доступность 128-битной версии с кодировкой VEX указывают различные биты CPUID: PCLMULQDQ и AVX.) Более широкие, чем 128-битные, вариации инструкции выполняют одну и ту же операцию над каждой 128-битной частью входных регистров, но они не расширяют ее для выбора квадрослов из различных 128-битных полей (значение операнда imm8 то же самое: выбирается либо младшее, либо старшее квадрослово 128-битного поля).
Инструкции AES с кодировкой VEX и EVEX . Более широкие, чем 128-битные вариации инструкции выполняют ту же операцию на каждой 128-битной части входных регистров. Версии VEX могут использоваться без поддержки AVX-512.
Инструкции по ускорению ИИ, работающие с числами Bfloat16 .
Расширение более раннего набора инструкций F16C , добавляющее комплексную поддержку чисел с плавающей точкой binary16 (также известных как FP16, float16 или числа с плавающей точкой половинной точности). Новые инструкции реализуют большинство операций, которые ранее были доступны для чисел с плавающей точкой одинарной и двойной точности, а также вводят новые инструкции для комплексных чисел и инструкции преобразования. Поддерживаются скалярные и упакованные операции.
В отличие от инструкций формата одинарной и двойной точности, операнды половинной точности не сбрасываются условно в ноль ( FTZ ) и не обрабатываются условно как ноль ( DAZ ) на основе MXCSR
настроек. Субнормальные значения обрабатываются на полной скорости аппаратным обеспечением для облегчения использования полного динамического диапазона чисел FP16. Инструкции, которые создают числа FP32 и FP64, по-прежнему учитывают бит MXCSR.FTZ
. [14]
^Примечание 1 : Intel официально не поддерживает семейство инструкций AVX-512 на микропроцессорах Alder Lake . В начале 2022 года Intel начала отключать в кремнии (сплавлять) AVX-512 в микропроцессорах Alder Lake, чтобы помешать клиентам включать AVX-512. [35] В старых процессорах семейства Alder Lake с некоторыми устаревшими комбинациями BIOS и ревизий микрокода можно было выполнять инструкции семейства AVX-512 при отключении всех ядер эффективности, которые не содержат кремний для AVX-512. [36] [37] [24]
Intel Vectorization Advisor (начиная с версии 2017) поддерживает собственную производительность AVX-512 и анализ качества векторного кода (для процессоров "Core", Xeon и Intel Xeon Phi ). Наряду с традиционным профилем горячих точек, рекомендациями Advisor и "бесшовной" интеграцией диагностики векторизации Intel Compiler, анализ Advisor Survey также предоставляет метрики AVX-512 ISA и новые "признаки", специфичные для AVX-512, например, Scatter, Compress/Expand, mask usage. [38] [39]
На некоторых процессорах (в основном до Ice Lake Intel) инструкции AVX-512 могут вызывать даже большее снижение частоты, чем у предшественников, что приводит к штрафу за смешанные рабочие нагрузки. Дополнительное понижение частоты запускается 512-битной шириной векторов и зависит от характера выполняемых инструкций; использование 128- или 256-битной части AVX-512 (AVX-512VL) не запускает его. В результате gcc и clang по умолчанию предпочитают использовать 256-битные векторы для целевых процессоров Intel. [40] [41] [42]
Компиляторы C/ C++ также автоматически обрабатывают развертывание циклов и предотвращают остановку конвейера , чтобы использовать AVX-512 наиболее эффективно, что означает, что программист, использующий встроенные функции языка для попытки принудительного использования AVX-512, иногда может получить худшую производительность по сравнению с кодом, сгенерированным компилятором, когда он сталкивается с циклами, явно прописанными в исходном коде. [43] В других случаях использование встроенных функций AVX-512 в коде C/C++ может привести к улучшению производительности по сравнению с просто написанным C/C++. [44]
Существует множество примеров приложений AVX-512 , включая обработку мультимедиа, криптографию, видеоигры , [45] нейронные сети , [46] и даже OpenJDK , который использует AVX-512 для сортировки . [47]
В часто цитируемой цитате 2020 года Линус Торвальдс сказал: «Я надеюсь, что AVX-512 умрет мучительной смертью, и что Intel начнет устранять реальные проблемы вместо того, чтобы пытаться создавать магические инструкции, чтобы затем создавать бенчмарки, на которых они могут хорошо выглядеть» [48], заявив, что он предпочел бы потратить бюджет транзисторов на дополнительные ядра и целочисленную производительность, и что он «ненавидит» бенчмарки с плавающей точкой . [49]
Numenta рекламирует свою «крайне разреженную » [50] технологию нейронных сетей, которая, по их словам, устраняет необходимость в графических процессорах , поскольку их алгоритмы работают на центральных процессорах с AVX-512. [51] Они заявляют о десятикратном ускорении по сравнению с A100 в основном потому, что их алгоритмы уменьшают размер нейронной сети, сохраняя при этом точность , с помощью таких методов, как алгоритм разреженного эволюционного обучения (SET) [52] и предвидение обрезки. [53]
Более новые процессоры x86-64 также поддерживают новые инструкции Galois Field (GFNI), которые позволяют реализовать Camellia s-box более простым способом и добиться еще более высокой производительности.
{{cite web}}
: CS1 maint: неподходящий URL ( ссылка )