Avx операциях что обеспечит больший. Наборы инструкций AVX

09.05.2019
15 октября 2016 в 15:34

Intel добавит в CPU инструкции для глубинного обучения

  • Искусственный интеллект ,
  • Процессоры

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

Если код загружается 64-битными словами (8 байт), то теоретически, если не брать в учёт другие факторы, можно ускорить его выполнение в восемь раз, если использовать инструкции AVX-512.

Расширение AVX-512 для системы команд x86 поддерживает 8 регистров масок, 512-разрядные упакованные форматы для целых и дробных чисел и операции над ними, тонкое управление режимами округления (позволяет переопределить глобальные настройки), операции broadcast, подавление ошибок в операциях с дробными числами, операции gather/scatter, быстрые математические операции, компактное кодирование больших смещений.

В первоначальный набор AVX-512 входит восемь групп инструкций:

  • AVX-512 Conflict Detection Instructions (CDI)
  • AVX-512 Exponential and Reciprocal Instructions (ERI)
  • AVX-512 Prefetch Instructions (PFI)
  • AVX-512 Vector Length Extensions (VL)
  • AVX-512 Byte and Word Instructions (BW)
  • AVX-512 Doubleword and Quadword Instructions (DQ)
  • AVX-512 Integer Fused Multiply Add (IFMA)
  • AVX-512 Vector Byte Manipulation Instructions (VBMI)
Семейство AVX-512 поддерживается в сопроцессоре Intel Xeon Phi (ранее Intel MIC) Knights Landing, некоторых процессорах Skylake Xeon (SKX), а также будущих процессорах Cannonlake, которые появятся в продаже в 2017 году. Перечисленные процессоры поддерживают не все из инструкций. Например, Knights Landing Xeon Phi поддерживает только CD, ER и PF. Процессор Skylake Xeon (SKX) поддерживает CD, VL, BW и DQ. Процессор Cannonlake - CD, VL, BW, DQ, IFMA.

Естественно, не любой код можно обратить в векторные инструкции, но и не нужно делать это со всем кодом, пишет в своём блоге Дэниель Лемир (Daniel Lemire), профессор информатики Университета Квебека. По его словам, важно оптимизировать «горячий код», который отнимает больше всего ресурсов процессора. Во многих системах «горячий код» построен из ряда циклов, которые прокручиваются миллиарды раз. Вот именно его следует оптимизировать, в этом основная выгода.

Например, если такой питоновский код перекомпилировать со стандартных 64-битных инструкций в AVX-512 с помощью MKL Numpy , то время исполнения снижается с 6-7 секунд до 1 секунды на том же процессоре.

Import numpy as np np.random.seed(1234) xx = np.random.rand(1000000).reshape(1000, 1000) %timeit np.linalg.eig(xx)

Аппаратная поддержка глубинного обучения

Нейросети и глубинное обучение - один из ярких трендов последнего времени. Google, Facebook и другие крупные компании пытаются применить нейросети где только можно: в системах рекомендаций, распознавании лиц, переводах текстов, распознавании речи, классификации фотографий и даже в настольных играх вроде го (но это скорее ради пиара, чем для коммерческой выгоды). Кое-кто пытается применить глубинное обучение в нестандартных областях, таких как .

Среди венчурных инвесторов сейчас есть понимание, что самая эффективная схема быстро разбогатеть - запустить стартап в области глубинного обучения, который сразу купит компания из «большой пятёрки» (Facebook, Google, Apple, Microsoft, Amazon). Эти фирмы в последнее время жёстко конкурируют в области скупки талантов, так что стартап уйдёт мгновенно и за большую цену из расчёта минимум $10 млн за сотрудника. Такой бизнес-план стал сейчас ещё проще, поскольку компании выпускают инструменты для разработки с открытыми исходниками, как это сделала Google с TensorFlow .

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

Дело не в том, что инженеры Intel проспали тренд. Просто графические процессоры сами по себе без всяких специальных инструкций лучше приспособлены для расчётов deep learning.

Тем не менее, Intel готовит контратаку, в результате которой ситуация может перевернуться с ног на голову. В сентябре компания опубликовала новое справочное руководство Intel Architecture Instruction Set Extensions Programming Reference с указанием всех инструкций, которые будут поддерживаться в будущих процессорах. Если заглянуть в этот документ, то нас ждёт приятный сюрприз. Оказывается, семейство инструкций AVX-512 разбили на несколько групп и расширили.

В частности, две группы инструкций специально предназначены для глубинного обучения: AVX512_4VNNIW и AVX512_4FMAPS. Судя по описанию, эти инструкции могут быть полезными не только в глубинном обучении, но и во многих других задачах.

  • AVX512_4VNNIW: Vector instructions for deep learning enhanced word variable precision
  • AVX512_4FMAPS: Vector instructions for deep learning floating-point single precision

Обработка строк

Наборы инструкций SSE4.2

Чтение WC памяти

Операция чтения, позволяющая ускорить (до 7.5 раз) работу с write-combining областями памяти.

Эти инструкции выполняют арифметические сравнения между всеми возможными парами полей (64 или 256 сравнений!) из обоих строк, заданных содержимым xmm1 и xmm2/m128. Затем булевые результаты сравнений обрабатываются для получения нужных результатов. Непосредственный аргумент imm8 управляет размером (байтовые или unicode строки, до 16/8 элементов каждая), знаковостью полей (элементов строк), типом сравнения и интерпретацией результатов.

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

Все они оказывают влияние на флаги процессора: SF устанавливается если в xmm1 не полная строка, ZF - если в xmm2/m128 не полная строка, CF - если результат не нулевой, OF - если младший бит результата не нулевой. Флаги AF и PF сбрасываются.

Advanced Vector Extensions (AVX) - расширение системы команд x86 для микропроцессоров Intel и AMD, предложенное Intel в марте 2008.

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

Улучшения:

Размер векторных регистров SIMD увеличивается с 128 (XMM) до 256 бит (регистры YMM0 - YMM15). Существующие 128-битные инструкции будут использовать младшую половину новых YMM регистров. В будущем возможно расширение до 512 или 1024 бит.

Неразрушающие операции. Набор инструкций AVX позволяет использовать любую двухоперандную инструкцию XMM в трёхоперандном виде без модификации двух регистров-источников, с отдельным регистром для результата. Например, вместо a = a + b можно использовать c = a + b, при этом регистр a остаётся неизменённым. AVX не поддерживает неразрушающие формы операций над обычными регистрами общего назначения, такими как EAX, но такая поддержка, возможно, будет добавлена в последующих расширениях.

Требования выравнивания данных для операндов SIMD в памяти ослаблены.

Новая система кодирования машинных кодов VEX предоставляет новый набор префиксов кода, которые расширяют пространство возможных машинных кодов. Добавлены инструкции с количеством операндов более трёх. Векторные регистры SIMD могут быть больше 128-ми бит.

Новые инструкции:

Также в спецификации AVX описана группа инструкций PCLMUL (Parallel Carry-Less Multiplication, Parallel CLMUL)

Применение:

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

Сегодня хочу завести разговор на тему, что такое avx инструкции в процессоре, где и для чего они используются.

Среднестатистический покупашка идет в магазин и хочет купить компьютер / ноутбук для работы и для игр. На практике это - помощней и подешевле, чтоб реферат в ворде написать после чего играть.
Что касается процессоров - на полках лежат сердитые пеньки равные по мощности ай-третьим. Неужели i3 это маркетинговый заговор? Неужели Pentium это "такой ай три только дешевле"? И да и нет. А дело вот в чем.

Чтобы написать реферат в ворде - хватит самого дешевого Celeron (причем можно взять "процессор затычку" еще дешевле, если брать его на барахолке с чеком и остатком гарантии).
Чтобы после реферата сыграть во все игры - подойдет Pentium обладающий задатками ай-третьего (2 ядра 4 потока). Для игр AVX-инструкции не обязательны (лишь бы нужные SSE были).

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

Зачем нужны AVX инструкции

Что входит в ряд профессиональных задач? Как правило, лишенные AVX камни так же лишены и аппаратного ускорения виртуализации.
Разработка под android, которая потребует виртуалку этого самого ведроида (некоторые эмуляторы даже не запустятся, некоторые будут работать уныло сильно загружая ядра).
Пережевывание мультимедийных данных (от обработки фоточек до кодирования видео и запиливания трехмерной графики, так что - уже летсплейщикам стоит раскошелиться на процессор подороже).

Если без AVX

В процессоре есть регистры для инструкций.
SSE-регистр 128-битный, а AVX-регистр 256-битный.
Таким образом, чтобы не выносить ничей мозг анатомией камня, скажем просто - 256 не влезет в 128.

Без AVX тоже можно обрабатывать фоточки, жевать видео и пилить три-дэ. Но есть нюансы...
Если по-проще, то старый 8-ядерный Xeon (не умеющий AXV) будет пилить видосы с той же скоростью что современный i3 (умеющий AVX).

У процессора есть конвейер: узнал откуда брать из памяти, взял из памяти, вычислил, отправил результаты в память.
Упрощенно конвейер с и без AVX можно изобразить так.

Как видите - операций во втором случае меньше. Из чего логично предположить, что AVX-считалочка работает быстрее (в каждом вычислительном такте). А раз быстрее в каждом такте - тогда имея меньше гигагерц можно вычислять быстрее.

Еще одна вкусность AVX это дополнительный операнд. Используется не 2 операнда а 3, что так же сокращает конвейер. Допустим мы хотим сложить X и Y.
Код: Обычная операция, где 2 операнда (X=X+Y) заставит перезаписывать один из операндов.
AVX операция, где 3 операнда (Z=X+Y) позволяет записать результат в третий операнд.
Сложна? Ок, давайте бум прощэ.

Пилить видосы имея AVX получится быстрее. Ибо, помимо вышеописанного, добавляется плюшка оптимальной разбивки кадров.
Комп пересчитывает не каждый кадр. Он разбивает кадр на прямоугольники и сравнивает их, а если находится подходящий - использует готовый кусочек.
Тут AVX научился работать с видосиками оптимальнее (кому интересно - почитайте у профессионалов, а я ограничусь красивой картинкой).

Раньше разбивка была - как показано слева. AVX-разбивка умеет более умно - как показано справа.

Подводя итог

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

В моем коде на С++ используется SSE, и теперь я хочу улучшить его, чтобы поддерживать AVX, когда он доступен. Поэтому я обнаруживаю, что AVX доступен и вызывает функцию, использующую команды AVX. Я использую Win7 SP1 + VS2010 SP1 и процессор с AVX.

Чтобы использовать AVX, необходимо включить следующее:

#include "immintrin.h"

а затем вы можете использовать встроенные функции AVX, такие как _mm256_mul_ps , _mm256_add_ps и т.д. Проблема заключается в том, что по умолчанию VS2010 производит код, который работает очень медленно и показывает предупреждение:

предупреждение C4752: найдено расширенные векторные расширения Intel (R); рассматривать использование /arch: AVX

Кажется, VS2010 фактически не использует инструкции AVX, но вместо этого имитирует их. Я добавил /arch:AVX в параметры компилятора и получил хорошие результаты. Но этот параметр говорит компилятору, когда это возможно, использовать команды AVX. Так что мой код может упасть на CPU, который не поддерживает AVX!

Итак, вопрос заключается в том, как заставить VS2010-компилятор создавать AVX-код, но только когда я прямо указываю встроенные функции AVX. Для SSE он работает, я просто использую внутренние функции SSE, и он генерирует код SSE без каких-либо параметров компилятора, таких как /arch:SSE . Но для AVX он по какой-то причине не работает.

2 ответов

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

См. стр. 102 руководства Agner Fog:

Каждый раз, когда вы неправильно переключаетесь между командами SSE и AVX, вы платите чрезвычайно высокий штраф (~ 70).

Когда вы компилируете без /arch:AVX , VS2010 будет генерировать инструкции SSE, но все равно будет использовать AVX везде, где у вас есть встроенные функции AVX. Поэтому вы получите код с инструкциями SSE и AVX, которые будут иметь такие штрафы за переключение состояний. (VS2010 знает это, поэтому он выдает предупреждение, которое вы видите.)

Следовательно, вы должны использовать либо все SSE, либо все AVX. Задание /arch:AVX указывает компилятору использовать все AVX.

Похоже, вы пытаетесь создать несколько путей кода: один для SSE и один для AVX. Для этого я предлагаю вам разделить ваш SSE и AVX-код на два разных блока компиляции. (один скомпилирован с /arch:AVX и один без него). Затем соедините их вместе и сделайте диспетчер для выбора на основе того, на каком оборудовании оно работает.

Если вам требуется для объединения SSE и AVX, обязательно используйте _mm256_zeroupper() или _mm256_zeroall() , чтобы избежать штрафов за переключение состояний.

/* Use VZEROUPPER to avoid the penalty of switching from AVX to SSE. See Intel Optimization Manual (April 2011, version 248966), Section 11.3 */ #define VLEAVE _mm256_zeroupper

Затем VLEAVE(); вызывается в конце каждой функции, используя встроенные инструкции для AVX.

Улучшения

  • Новая схема кодирования инструкций VEX
  • Размер векторных регистров SIMD увеличивается со 128 (XMM) до 256 бит (регистры YMM0 - YMM15). Существующие 128-битные SSE инструкции будут использовать младшую половину новых YMM регистров, не изменяя старшую часть. Для работы с YMM регистрами добавлены новые 256-битные AVX инструкции. В будущем возможно расширение векторных регистров SIMD до 512 или 1024 бит.

Новая схема кодирования

Новая схема кодирования инструкций VEX использует VEX префикс. В настоящий момент существуют два VEX префикса, длиной 2 и 3 байта. Для 2-х байтного VEX префикса первый байт равен 0xC5, для 3-х байтного 0xC4. В 64-битном режиме первый байт VEX префикса уникален. В 32-битном режиме возникает конфликт с инструкциями LES и LDS, который разрешается старшим битом второго байта, он имеет значение только в 64-битном режиме, через неподдерживаемые формы инструкций LES и LDS. Длина существующих AVX инструкций, вместе с VEX префиксом, не превышает 11 байт. В следующих версиях ожидается появление более длинных инструкций.

Новые инструкции

Инструкция Описание
VBROADCASTSS, VBROADCASTSD, VBROADCASTF128 Копирует 32-х, 64-х или 128-ми битный операнд из памяти во все элементы векторного регистра XMM или YMM.
VINSERTF128 Замещает младшую или старшую половину 256-ти битного регистра YMM значением 128-ми битного операнда. Другая часть регистра-получателя не изменяется.
VEXTRACTF128 Извлекает младшую или старшую половину 256-ти битного регистра YMM и копирует в 128-ми битный операнд-назначение.
VMASKMOVPS, VMASKMOVPD Условно считывает любое количество элементов из векторного операнда из памяти в регистр-получатель, оставляя остальные элементы несчитанными и обнуляя соответствующие им элементы регистра-получателя. Также может условно записывать любое количество элементов из векторного регистра в векторный операнд в памяти, оставляя остальные элементы операнда памяти неизменёнными
VPERMILPS, VPERMILPD Переставляет 32-х или 64-х битные элементы вектора согласно операнду-селектору (из памяти или из регистра).
VPERM2F128 Переставляет 4 128-ми битных элемента двух 256-ти битных регистров в 256-ти битный операнд-назначение с использованием непосредственной константы (imm) в качестве селектора.
VZEROALL Обнуляет все YMM регистры и помечает их как неиспользуемые. Используется при переключении между 128-ми битным режимом и 256-ти битным.
VZEROUPPER Обнуляет старшие половины всех регистров YMM. Используется при переключении между 128-ми битным режимом и 256-ти битным.

Также в спецификации AVX описана группа инструкций PCLMUL (Parallel Carry-Less Multiplication, Parallel CLMUL)

  • PCLMULLQLQDQ xmmreg,xmmrm
  • PCLMULHQLQDQ xmmreg,xmmrm
  • PCLMULLQHQDQ xmmreg,xmmrm
  • PCLMULHQHQDQ xmmreg,xmmrm
  • PCLMULQDQ xmmreg,xmmrm,imm

Применение

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

Поддержка в операционных системах

Использование YMM регистров требует поддержки со стороны операционной системы. Следующие системы поддерживают регистры YMM:

Микропроцессоры с AVX

Совместимость между реализациями Intel и AMD обсуждается в XOP instruction set .

Будущие расширения

Схема кодирования инструкций VEX легко допускает дальнейшее расширение набора инструкций AVX. В следующей версии, AVX2, планируется добавить инструкции для работы с целыми числами, FMA3 (увеличит производительность при обработке чисел с плавающей запятой в 2 раза ), загрузку распределенного в памяти вектора (gather) и прочее.

Различные планируемые дополнения системы команд x86 :

  • CLMUL
  • AMD FMA4
  • AMD XOP
  • AMD CVT16

Примечания


Наборы расширения базовых инструкций процессоров семейства x86
MMX | MMXEXT | SSE | SSE2 | SSE3 | SSSE3 | SSE4 | ATA | 3DNow! | 3DNowExt | SSE5 | AVX | AES

Wikimedia Foundation . 2010 .

  • Управление государственной безопасности (Венгрия)

Смотреть что такое "AVX" в других словарях:

    Avx - {{{image}}} Sigles d une seule lettre Sigles de deux lettres > Sigles de trois lettres AAA à DZZ EAA à HZZ IAA à LZZ MAA à PZZ QAA à TZZ UAA à XZZ … Wikipédia en Français

    AVX - Sigles d’une seule lettre Sigles de deux lettres > Sigles de trois lettres Sigles de quatre lettres Sigles de cinq lettres Sigles de six lettres Sigles de sept… … Wikipédia en Français