Как включить avx инструкции windows 10

Diablo 2 Resurrected Forums

Loading

Как включить виртуализацию в Windows 10 без выхода в биос

Виртуализация необходима для работы некоторых программ, например Oracle VM VirtualBox или BlueStacks. В этой статье я расскажу, как включить виртуализацию в Windows 10 без выхода в биос (bios).

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

Диспетчер задач Windows 10

Диспетчер задач Windows 10 - производительность

Если виртуализация отключена, читайте статью дальше.

Заходим в панель управления. Сделать это можно несколькими способами. Самый простой – набрать запрос в поисковой строке.

Заходим в панель управления Windows 10

В опции Просмотр, выберите Крупные значки, нажмите Программы и компоненты.

Windows 10 панель управления

Далее выбираем Включение или отключение компонентов Windows -> HuperV-> ОК.

Включение или отключение компонентов Windows

Включение или отключение компонентов Windows

Ждем, пока Windows установит компонент, и перезагружаем компьютер.

Процесс включения виртуализации Windows 10

Далее нажимаем кнопку Закрыть и перезагружаем компьютер.

Виртуализация включена!

Если виртуализация не включилась, тогда вам нужно включить ее в биосе:

  • Как включить виртуализацию в биосе на материнской плате Gigabyte.

Активная виртуализация в Windows 10

Итак, мы рассмотрели вопрос: как включить виртуализацию в Windows 10 без выхода в биос? Если действия, описанные выше вам не помогли, рекомендую прочитать статью как включить виртуализацию в bios.

Видео: как включить виртуализацию в Windows 10 без выхода

Тег video не поддерживается вашим браузером.
Скачайте видео.


Анатолий Бузов

Анатолий Бузов / об авторе

Обучаю HTML, CSS, PHP. Создаю и продвигаю сайты, скрипты и программы. Занимаюсь информационной безопасностью. Рассмотрю различные виды сотрудничества.


Содержание

  1. Аппаратная виртуализация в Windows 10 – как включить в БИОСе и операционной системе
  2. Что такое виртуализация?
  3. Требования к системе
  4. Включение виртуализации
  5. Настройки BIOS
  6. Конфигурация системы
  7. PowerShell
  8. Как настроить виртуализацию на персональном компьютере
  9. Как понять, поддерживает ли процессор технологию виртуализации?
  10. Общая информация
  11. Как войти в BIOS на ПК?
  12. Альтернатива
  13. Как включить виртуализацию в Windows 10
  14. Что такое виртуализация и зачем она нужна?
  15. Выводы
  16. Об авторе
  17. Перезагрузка Bluestacks
  18. Системные требования
  19. Принцип работы

Аппаратная виртуализация в Windows 10 – как включить в БИОСе и операционной системе

Для работы некоторых программ от Windows требуется включение дополнительных функций. Часть функций включает в себя программные пакеты, обеспечивающие работу приложений. Другая же часть, открывает доступ к специфическим функциям, среди которых возможность виртуализации. Разберём, как включить виртуализацию на Windows 10, — одну из функций, которые не задействованы в системе.

Что такое виртуализация?

Виртуализация (VT) — возможность создать среду для выполнения программ в рамках другой, работающей среды. То есть, запустив Windows можно запустить другую программу, которая позволит запустить, например систему Android с целью запустить какую-то игру или протестировать работу приложения.

Такое приложение носит название «эмулятор» — программа, запускающая рабочую копию ОС в пределах уже запущенной ОС. Используются такие возможности для разных целей:

  1. Запуск игр, характерных для другой ОС. Яркие примеры – Wine для Linux (запускает Windows игры) и BlueStacks (запуск Андроид игр и приложений на Windows).
  2. Тестирование созданного софта. Например, проверять, как работают Андроид программы в разных условиях, минуя их установку на смартфон.
  3. Запуск сомнительных пакетов. Можно выполнить инсталляцию софта загруженного с сомнительного сайта, чтобы убедиться в отсутствии вирусов и «легальных троянов».
  4. Разделение мощностей в пределах серверной «машины». Используется при хостинге сайтов, чтобы каждому из них соответствовал собственный сервер.

Требования к системе

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

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

Отсутствие русскоязычного интерфейса для программы вообще не играет роли. Ответы «Yes» и «No» очевидны и соответствуют наличию функции или её отсутствию.

Включение виртуализации

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

Настройки BIOS

Начать следует с BIOS. Многие материнские платы имеют в БИОСе переключение данной функции. Зачастую, по умолчанию, состояние аппаратной виртуализации является выключенным. Поэтому разберёмся, как это проверить и где искать:

  1. Перезагрузить компьютер.
  2. Войти в настройкиBIOS. Вызов настроек может различаться. Для стационарных ПК в основном используется кнопка «delete». Ноутбуки разных производителей используют разные вариации от «F2» до «Esc» и выбор пункта «entersetup». Подробнее можно найти в документации конкретной модели.
  3. Теперь следует проверить разделы «Chipset», «Advanced», «CPU» на наличие строки «Virtualization». Увы, в этом моменте каждый разработчик сделал по-своему: даже название пункта может содержать только слово «virtual».
  4. Переставить значение на «Enabled» (могут быть и варианты «On/Off») и сохранить изменения (зачастую «F10»).

Теперь поддержка функции разрешена на уровне BIOS. Если опция уже выставлена в нужное положение, то менять ничего не нужно.

Конфигурация системы

Проверив настройки BIOS можно перейти и в настройки системы. Тут расположение опции неочевидно. Также, стоит отметить, что в версии Home этот компонент не поддерживается. Это не значит, что виртуализация полностью заблокирована, но проблемы с эмуляторами могут возникать. Посмотрим, как включить виртуализацию в системе Windows:

  1. Открыть меню «Пуск», где ввести слово «компонент».
  2. Выбрать «Включение … компонентов …», что вызовет следующее окно:
  3. В нём потребуется найти «Hyper-V» напротив которого ставится галочка.
  4. Нажимаем «Ок» и ждём завершения установки.

Примечание: На изображении показана ситуация, когда виртуализация выключена в BIOS. Управление службой установится без проблем, а вот платформа (основная часть службы) – нет. При этом запуск эмуляторов будет возможен (многим из них требуется именно «средства управления…»).

PowerShell

Можно выполнить действия выше быстрее и проще. Потребуется вызвать «PowerShell», чтобы ввести несколько команд вместо нескольких кликов мышью:

  1. Вызвать меню «Пуск» и ввести «PowerShell».
  2. Нажать «запуск от имени администратора».
  3. Запустить выполнение следующей команды:

  1. Нажать «Y» для перезагрузки компьютера.

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

Как настроить виртуализацию на персональном компьютере

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

В этой инструкции подробно о том, как включить виртуализацию в БИОС/UEFI и о возможных проблемах, которые могут возникнуть при её включении на компьютерах и ноутбуках с Windows 10, 8.1 или Windows 7.

  • Включение виртуализации в БИОС/UEFI
  • Проблемы при включении виртуализации
  • Видео инструкция

Как понять, поддерживает ли процессор технологию виртуализации?

Определите модель процессора, который установлен в вашем персональном компьютере. Для этого зайдите в диспетчер задач (вызвать его можно, одновременно зажав клавиши Cntrl+Alt+Delete — всем хорошо знакомая и во многих случаях просто незаменимая связка), перейдите во вкладку «Производительность» и найдите там пункт «ЦП (центральный процессор». Справа от динамических показаний будет написана модель вашего процессора.

Альтернативный вариант: зайдите в панель управления (клик правой клавишей мыши по кнопке «Пуск»), перейдите во вкладку «Система и безопасность» и найдите пункт «Система». Название процессора будет указано в правом нижнем углу под общими сведениями.

После того, как вы определите модель процессора, скачайте специальную утилиту для диагностики его возможностей. Обратите внимание: для разных моделей необходимо использовать разные программы. Для процессоров Intel — Intel Processor Identification Utility, для AMD — AMD-V. Скачивайте утилиты только с официальных сайтов компаний-производителей, в противном случае велика вероятность занести на компьютер вредоносное ПО.

Общая информация

Для начала вам следует проверить, поддерживается ли данная технология компьютером или ноутбуком на аппаратном уровне. Сделать это проще всего с помощью утилиты LeoMoon CPU-V. Используется она так:

  1. Откройте страницу https://leomoon.com/downloads/desktop-apps/leomoon-cpu-v/.
  2. Пролистайте ее до конца и кликните на оранжевую кнопку DOWNLOAD.

  • Извлеките содержимое архива leomoon-dot-com_leomoon-cpu-v_win.zip в любой каталог.
  • Откройте файл LeoMoon CPU-V.exe.

    Верхние два блока нас не интересуют, поэтому обратите внимание на нижние:

    • VT-x Supported – наличие поддержки Virtualization Technology
    • VT-xEnabled – ее состояние.


    Соответственно, в левом блоке должна обязательно стоять зеленая галочка, иначе функция попросту не предусмотрена. В таком случае ее активировать будет нельзя до замены процессора. А в правом блоке может быть как зеленый значок, так и красный. При первом варианте вам ничего делать не нужно, а при втором – нужно вручную включить виртуализацию для Нокса. Давайте разберемся, как это сделать.

    Как войти в BIOS на ПК?

    Чтобы настроить виртуализацию, необходимо войти в раздел системных настроек — BIOS. Сделать это можно как при помощи специальных «горячих клавиш», так и непосредственно из рабочей среды компьютера.

    В первом случае перезапустите устройство и в момент, когда на экране появится логотип компании-производителя, нажмите нужную клавишу. Обратите внимание: у разных моделей горячие клавиши тоже разные, ими могут быть F8, F12, F2, Delete и так далее. Подробный список горячих клавиш для каждой модели можно без труда отыскать в интернете.

    Во втором случае откройте панель управления, найдите вкладку «Обновление и безопасность», а затем «Восстановление». Выберите пункт «Особые варианты загрузки», дождитесь, пока компьютер выполнит перезагрузку и в появившемся окне щелкните по строке «Диагностика» — «Дополнительные параметры» — «Параметры встроенного ПО UEFI». Компьютер снова перезапустится, после чего перед вами откроется окно с необходимыми настройками.

    Альтернатива

    Владельцы Windows Home, которым недоступен Hyper-V, могут пользоваться бесплатным альтернативным решением от Oracle. В отличие от продукта Microsoft приложение VirtualBox работает в 32-битных системах, имеет больше возможностей и менее требовательно к ресурсам. Для него не требуется специальный набор процессорных инструкций.

    Запускаться в VirtualBox будут практически все существующие операционные системы, чего не скажешь о Hyper-V. В нем выбор ограничен несколькими версиями Windows, а с недавних пор еще и Linux.

    Как включить виртуализацию в Windows 10

    Чтобы запустить собственное средство виртуализации операционной системы Windows 10, первым делом вызовите командную строку (клавиши WIN+R). Наберите в открывшемся окне слово control, после чего нажмите клавишу Enter.

    На экране появится панель управления системой. Далее перейдите во вкладку под названием «Программы и компоненты».

    Из нее перейдите во вкладку «Включение и выключение компонентов Windows».

    Найдите утилиту под названием Hyper-V, раскройте связанное с ним контекстное меню и расставьте галочки напротив всех имеющихся элементов, чтобы их активировать.

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

    Что такое виртуализация и зачем она нужна?

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

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

    Выводы

    Теперь вы знаете как включить AMD V в BIOS материнской платы MSI. Если вам нужно работать с виртуальными машинами, без этой функции не обойтись.

    Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

    No related photos.

    (10 оценок, среднее: 4,10 из 5)

    Об авторе

    admin
    Администратор te4h.ru, интересуюсь новыми технологиями, криптовалютой, искусственным интеллектом, свободным программным обеспечением и Linux.

    1. Владимир 02.03.2019 Ответить
      У меня на Acer с Ryzen совершенно другой Биос
    • admin 02.03.2019 Ответить

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

      Vitalii 05.07.2019 Ответить

      В UEFI биосе от АМІ нет ничего подобного, ни SVM, ни AMD-V, и вообще ничего, связанного с vіrtualization. Весь чердак сломал, но ответов в нете не нашел. Виртуализацию в антивирусе отключал, чипсет — последние драйвера, биос самый свежий. Хз крч.

      mawtt 21.07.2019 Ответить

      в расширенные настройки ядра зайди и там SVM будет вклбчи и вуаля.

    XYZ 11.08.2019 Ответить

    Большое спасибо, очень помогло, т.к. у меня как раз msi+ryzen. Сменил все железо, VirtualBox отказывался запускать старые виртуалки. Ругался на выключенную аппаратную виртуализцию. Главное, в меню статуса CPU виртуализация была enabled. Нашел через поиск, а она выключена. Без поиска найти не мог эту настройку, в меню ОС даже не заглянул, окерклокинг же а не сеттингс)))

    adward 07.10.2019 Ответить

    Вот у меня обе опции — и в расширенных настройках, и через поиск — в обоих случаях стоит [Включено] , а Android Studio упорно не хочет устанавливать компонент Intel x86 Emulator Accelerator (HAXM Installer).

    Ругается — говорит: Your CPU does not support required features (VT-x or SVM). Unfortunately, your computer does not support hardware accelerated virtualization.

    Может эта надстройка еще где то «гаситься»? VITALY выше пишет что «Виртуализацию в антивирусе отключал» — я, конечно, такого в антивирусе вообще не наблюдаю, но мало ли, вдруг где то помимо байоса его можно как то перекрывать?

      Дмитрий 12.10.2019 Ответить

    потому что AMD не Intel

    Денис Соколов 04.02.2020 Ответить

    Ну прям «Капитан очевидность » .Козе понятно что Rezer (стоящий у меня в Pc выпущен коорп. AMD и что ?? PS проблема ровно такая-же как и у ADWART.

    Даниил 22.12.2019 Ответить

    Так долго искал ответ и нашёл спасибо вам!

    Перезагрузка Bluestacks

    Когда движок не запускается, это будет выглядеть примерно так:

    Прогресс загрузки просто стоит на месте, и всё.

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

    Если это не помогает, тогда можно применить универсальный способ борьбы с любыми неполадками Windows: перезагрузить весь компьютер.

    Системные требования

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

    Запуск движка виртуализации
    Для запуска BlueStacks необходимы следующие минимальные системные требования:

    • Windows 7/8.1/10;
    • 2 гигабайта оперативной памяти;
    • 4 гигабайта свободного пространства на жестком диске.

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

    Принцип работы

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

  • Аббревиатура AVX расшифровывается как Advanced Vector Extensions. Это наборы инструкций для процессоров Intel и AMD, идея создания которых появилась в марте 2008 года. Впервые такой набор был встроен в процессоры линейки Intel Haswell в 2013 году. Поддержка команд в Pentium и Celeron появилась лишь в 2020 году.

    Прочитав эту статью, вы более подробно узнаете, что такое инструкции AVX и AVX2 для процессоров, а также — как узнать поддерживает ли процессор AVX.

    AVX и AVX2 – что это такое

    AVX/AVX2 — это улучшенные версии старых наборов команд SSE. Advanced Vector Extensions расширяют операционные пакеты со 128 до 512 бит, а также добавляют новые инструкции. Например, за один такт процессора без инструкций AVX будет сложена 1 пара чисел, а с ними — 10. Эти наборы расширяют спектр используемых чисел для оптимизации подсчёта данных.

    Наличие у процессоров поддержки AVX весьма желательно. Эти инструкции предназначены, прежде всего, для выполнения сложных профессиональных операций. Без поддержки AVX всё-таки можно запускать большинство игр, редактировать фото, смотреть видео, общаться в интернете и др., хотя и не так комфортно.

    Как узнать, поддерживает ли процессор AVX

    Далее будут показаны несколько простых способов узнать это. Некоторые из методов потребуют установки специального ПО.

    1. Таблица сравнения процессоров на сайте Chaynikam.info.

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

    В открывшемся окне вам будет предложено указать параметры выбора нужного процессора. Все указывать не обязательно.

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

    2. Утилита CPU-Z.

    Один из самых простых и надёжных способов узнать поддерживает ли процессор AVX инструкции, использовать утилиту для просмотра информации о процессоре — CPU-Z. Скачать утилиту можно на официальном сайте. После завершения установки ярлык для запуска утилиты появится на рабочем столе. Запустите её.

    В строке Instructions показаны все инструкции и другие технологии, поддерживаемые вашим процессором.

    3. Поиск на сайте производителя.

    Ещё один способ узнать, есть ли AVX на процессоре, воспользоваться официальным сайтом производителя процессоров. В строке поиска браузера наберите название процессора и выполните поиск. Если у вас процессор Intel, выберите соответствующую страницу в списке и перейдите на неё. На этой странице вам будет предоставлена подробная информация о процессоре.

    Если у вас процессор от компании AMD, то лучше всего будет воспользоваться сайтом AMD. Выберите пункт меню Процессоры, далее — пункт Характеристики изделия и затем, выбрав тип (например, Потребительские процессоры), выполните переход на страницу Спецификации процессоров. На этой странице выполните поиск вашего процессора по названию и посмотрите подробную информацию о нём.

    Выводы

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

    Была ли эта статья полезной?

    ДаНет

    Оцените статью:

    Очень плохоПлохоПойдетХорошоОгонь! (7 оценок, среднее: 5,00 из 5)

    Загрузка…

    Об авторе

    Над статьей работал не только её автор, но и другие люди из команды te4h, администратор (admin), редакторы или другие авторы. Ещё к этому автору могут попадать статьи, авторы которых написали мало статей и для них не было смысла создавать отдельные аккаунты.

    Введение

    Новый набор SIMD инструкций для x86-процессоров Intel AVX был представлен публике ещё в марте 2008 года. И хотя реализации этих инструкций в железе ждать ещё полгода, спецификацию AVX уже можно считать устоявшейся, а поддержка набора инструкций AVX добавлена в новые версии компиляторов и ассемблеров. В данной статье рассмотрены практические вопросы оптимизации для Intel AVX подпрограмм на языках C/C++ и ассемблер.

    Набор команд AVX

    Все команды AVX, а также некоторые другие команды, описаны в справочнике, который можно найти на сайте Intel, посвященному AVX. В некотором смысле, набор команд AVX представляет собой расширение наборов команд SSE, которые уже поддерживаются всеми современными процессорами. В частности, AVX расширяет изначально 128-битные регистры SSE до 256 бит. Новые 256-битные регистры обозначаются как ymm0-ymm15 (для 32-битной программы доступны только ymm0-ymm7); при этом 128-битные SSE регистры xmm0-xmm15 ссылаются на младшие 128 бит соответствующего AVX регистра.
    AVX & SSE registers
    Чтобы эффективно работать с новыми 256-битными регистрами, в AVX было добавлено несметное количество инструкций. Однако, большинство из них представляет собой лишь немного изменённые версии уже знакомых нам инструкций SSE.
    Так, каждая инструкция из SSE (а также SSE2, SSE3, SSSE3, SSE4.1, SSE4.2 и AES-NI) имеет в AVX свой аналог с префиксом v. Кроме префикса, такие AVX-инстукции отличаются от своих SSE-собратьев тем, что могут иметь три операнда: первый операнд указывает, куда писать результат, а остальные два — откуда брать данные. Трёхоперандные инструкции хороши тем, что во-первых позволяют избавиться от лишних операций копирования регистров в коде, а во-вторых упрощают написание хороших оптимизирующих компиляторов. SSE2-код
    movdqa xmm2, xmm0
    punpcklbw xmm0, xmm1
    punpckhbw xmm2, xmm1

    может быть переписан с AVX как
    vpunpckhbw xmm2, xmm0, xmm1
    vpunpcklbw xmm0, xmm0, xmm1
    .
    При этом команды с префиксом v зануляют старшие 128 бит того AVX регистра, в который они пишут. Например, инструкция vpaddw xmm0, xmm1, xmm2 занулит старшие 128-бит регистра ymm0.
    Кроме того, некоторые SSE-инструкции были расширены в AVX для работы с 256-битными регистрами. К таким инструкциям относятся все команды, работающие с числами с плавающей точкой (как одинарной, так и двойной точности). Например следующий AVX код
    vmovapd ymm0, [esi]
    vmulpd ymm0, ymm0, [edx]
    vmovapd [edi], ymm0

    обрабатывает сразу 4 double.
    Вдобавок, AVX включает в себя некоторые новые инструкции

    • vbroadcastss/vbroadcastsd/vbroadcastf128 — заполнение всего AVX регистра одним и тем же загруженным значением
    • vmaskmovps/vmaskmovpd — условная загрузка/сохранение float/double чисел в AVX регистр в зависимости от знака чисел в другом AVX регистре
    • vzeroupper — обнуление старших 128 бит всех AVX регистров
    • vzeroall — полное обнуление всех AVX регистров
    • vinsertf128/vextractf128 — вставка/получение любой 128-битной части 256-битного AVX регистра
    • vperm2f128 — перестановка 128-битных частей 256-битного AVX регистра. Параметр перестановки задаётся статически.
    • vpermilps/vpermilpd — перестановка float/double чисел внутри 128-битных частей 256-битного AVX регистра. При этом параметры перестановки берутся из другого AVX регистра.
    • vldmxcsr/vstmxcsr — загрузка/сохранение управляющих параметров AVX (куда ж без этого!)
    • xsaveopt — получение подсказки о том, какие AVX-регистры содержат данные. Эта команда сделана для разработчиков ОС и помогает им ускорить переключение контекста.

    Использование AVX в ассемблерном коде

    На сегодня AVX поддерживается всеми популярными ассемблерами для x86:

    • GAS (GNU Assembler) — начиная с версии binutils 2.19.50.0.1, но лучше использовать 2.19.51.0.1, которая поддерживает более позднюю спецификацию AVX
    • MASM — начиная с версии 10 (входит в Visual Studio 2010)
    • NASM — начиная с версии 2.03, но лучше использовать последнюю версию
    • YASM — начиная с версии 0.70, но лучше использовать последнюю версию
    Определение поддержки AVX системой

    Первое, что нужно сделать перед использованием AVX — убедиться, что система его поддерживает. В отличие от разных версий SSE, для использования AVX требуется его поддержка не только процессором, но и операционной системой (ведь она должна теперь сохранять верхние 128-бит AVX регистров при переключении контекста). К счастью, разработчики AVX предусмотрели способ узнать о поддержке этого набора инструкций операционной системой. ОС сохраняет/восстанавливает контекст AVX с помощью специальных инструкций XSAVE/XRSTOR, а конфигурируются эти команды с помощью расширенных контрольных регистров (extended control register). На сегодня есть только один такой регистр — XCR0, он же XFEATURE_ENABLED_MASK. Получить его значение можно, записав в ecx номер регистра (для XCR0 это, естественно, 0) и вызвав команду XGETBV. 64-битное значение регистра будет сохранено в паре регистров edx:eax. Выставленный нулевой бит регистра XFEATURE_ENABLED_MASK означает, что команда XSAVE сохраняет состояние FPU-регистров (впрочем, этот бит всегда выставлен), выставленный первый бит — сохранение SSE-регистров (младшие 128 бит AVX регистра), а выставленный второй бит — сохранение старших 128 бит AVX регистра. Т.о. чтобы быть уверенным, что система сохраняет состояние AVX регистров при переключении контекстов, нужно убедиться, что в регистре XFEATURE_ENABLED_MASK выставлены биты 1 и 2. Однако, это ещё не всё: прежде, чем вызывать команду XGETBV, нужно убедиться, что ОС действительно использует инструкции XSAVE/XRSTOR для управления контекстами. Делается это с помощью вызова инструкции CPUID с параметром eax = 1: если ОС включила управление сохранением/восстановлением контекста с помощью инструкций XSAVE/XRSTOR, то после выполениния CPUID в 27-ом бите регистра ecx будет единица. Вдобавок, неплохо бы проверить, что сам процессор поддерживает набор инструкций AVX. Делается это аналогично: вызвать CPUID с eax = 1 и убедиться, что после этого в 28-ом бите регистра ecx находится единица. Всё вышесказанное можно выразить следующим кодом (скопированном, с небольшими изменениями, из Intel AVX Reference):
    ; extern "C" int isAvxSupported()
    _isAvxSupported:
        xor eax, eax
        cpuid
        cmp eax, 1 ; Поддерживает ли CPUID параметр eax = 1?
        jb not_supported
        mov eax, 1
        cpuid
        and ecx, 018000000h ; Проверяем, что установлены биты 27 (ОС использует XSAVE/XRSTOR)
        cmp ecx, 018000000h ; и 28 (поддержка AVX процессором)
        jne not_supported
        xor ecx, ecx ; Номер регистра XFEATURE_ENABLED_MASK/XCR0 есть 0
        xgetbv ; Регистр XFEATURE_ENABLED_MASK теперь в edx:eax
        and eax, 110b
        cmp eax, 110b ; Убеждаемся, что ОС сохраняет AVX регистры при переключении контекста
        jne not_supported
        mov eax, 1
        ret
    not_supported:
        xor eax, eax
        ret

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

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

    • Крайне нежелательно смешивать SSE- и AVX-инструкции (в том числе AVX-аналоги SSE-инструкций). Чтобы перейти от выполнения AVX-инструкций к SSE-инструкциям процессор сохраняет в специальном кэше верхние 128 бит AVX регистров, на что может уйти полсотни тактов. Когда после SSE-инструкций процессор снова вернётся к выполнению AVX-инструкций, он восстановит верхние 128 бит AVX регистров, на что уйдёт ещё полсотни тактов. Поэтому смешивание SSE и AVX инструкций приведёт к заметному снижению производительности. Если вам нужна какая-то команда из SSE в AVX-коде, воспользуйтесь её AVX-аналогом с префиксом v.
    • Сохранения верхней части AVX регистров при переходе к SSE-коду можно избежать, если занулить верхние 128 бит AVX регистров с помощью команды vzeroupper или vzeroall. Несмотря на то, что эти команды зануляют все AVX регистры, они работают очень быстро. Правилом хорошего тона будет использовать одну из этих команд перед выходом из подпрограммы, использующей AVX.
    • Команды загрузки/сохранения выровненных данных vmovaps/vmovapd/vmovdqa требуют, чтобы данные были выровнены на 16 байт, даже если сама команда загружает 32 байта.
    • На Windows x64 подпрограмма не должна изменять регистры xmm6-xmm15. Т.о., если вы используете эти регистры (или соответствующие им регистры ymm6-ymm15), вы должны сохранить их в стеке в начале подпрограммы и восстановить из стека перед выходом из подпрограммы.
    • Ядро Sandy Bridge будет способно запускать на выполнение две 256-битные AVX-команды с плавающей точкой каждый такт (одно умножение и одно сложение) благодаря расширению исполнительных устройств до 256 бит. Ядро Bulldozer будет иметь два универсальных 128-битных исполнительных устройства для команд с плавающей точкой, что позволит ему выполнять одну 256-битную AVX-команду за такт (умножение, сложение либо совмещённое умножение и сложение (fused multiply-add); при использовании последней операции можно надеяться на такую же производительность, как и у Sandy Bridge).

    Теперь вы знаете всё, чтобы писать код с использованием AVX. Например, такой:
    ; extern "C" double _vec4_dot_avx( double a[4], double b[4] )
    _vec4_dot_avx:
    %ifdef X86
        mov eax, [esp + 8 + 0] ; eax = a
        mov edx, [esp + 8 + 8] ; edx = b
        vmovupd ymm0, [eax] ; ymm0 = *a
        vmovupd ymm1, [edx] ; ymm1 = *b
    %else
        vmovupd ymm0, [rcx] ; ymm0 = *a
        vmovupd ymm1, [rdx] ; ymm1 = *b
    %endif
        vmulpd ymm0, ymm0, ymm1 ; ymm0 = ( a3 * b3, a2 * b2, a1 * b1, a0 * b0 )
        vperm2f128 ymm1, ymm0, ymm0, 010000001b ; ymm1 = ( +0.0, +0.0, a3 * b3, a2 * b2 )
        vaddpd xmm0, xmm0, xmm1 ; ymm0 = ( +0.0, +0.0, a1 * b1 + a3 * b3, a0 * b0 + a2 * b2 )
        vxorpd xmm1, xmm1, xmm1 ; ymm1 = ( +0.0, +0.0, +0.0, +0.0 )
        vhaddpd xmm0, xmm0, xmm1 ; ymm0 = ( +0.0, +0.0, +0.0, a0 * b0 + a1 * b1 + a2 * b2 + a3 * b3 )
    %ifdef X86 ; На 32-битной архитектуре возвращаемые числа с плавающей точкой должны быть в st(0)
        sub esp, 8
        vmovsd [esp], xmm0
        vzeroall ; Содержимое SSE-регистров не важно: зануляем полностью
        fld qword [esp]
        add esp, 8
    %else
        vzeroupper ; В xmm0 содержится возвращаемое значение, поэтому зануляем только верхние 128 бит
    %endif
        ret

    Тестирование 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

    ; Конец участка кода, который надо проанализировать
    %macro IACA_END 0
        mov ebx, 222
        db 0x64, 0x67, 0x90
    %endmacro


    Теперь следует окружить этими макросами тот участок кода, который вы хотите проанализировать
    IACA_START
    vmovups ymm0, [ecx]
    vbroadcastss ymm1, [edx]
    vmulps ymm0, ymm0, ymm1
    vmovups [ecx], ymm0
    vzeroupper
    IACA_END

    Скомпилированный с этими макросами объектный файл нужно скормить IACA:
    iaca -32 -arch AVX -cp DATA_DEPENDENCY -mark 0 -o avx-sample.txt avx-sample.obj
    Параметры для IACA нужно понимать так

    • -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 задаёт имя файла, в который будут записаны результаты анализа. Можно опустить этот параметр, тогда результаты анализа будут выведены в консоль.

    Результат запуска IACA приведён ниже:
    Intel(R) Architecture Code Analyzer Version - 1.1.3
    Analyzed File - avx-sample.obj
    Binary Format - 32Bit
    Architecture  - Intel(R) AVX

    *******************************************************************
    Intel(R) Architecture Code Analyzer Mark Number 1
    *******************************************************************

    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

    Port Binding in cycles:
    -------------------------------------------------------
    |  Port  |  0 - DV |  1 |  2 -  D |  3 -  D |  4 |  5 |
    -------------------------------------------------------
    | Cycles |  1 |  0 |  0 |  2 |  2 |  1 |  1 |  2 |  1 |
    -------------------------------------------------------

    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++

    Поддержка AVX реализована в следующих популярных компиляторах:

    • Microsoft C/C++ Compiler начиная с версии 16 (входит в Visual Studio 2010)
    • Intel C++ Compiler начиная с версии 11.1
    • GCC начиная с версии 4.4

    Для использования 256-битных инструкций AVX в дистрибутив этих компиляторов включен новый заголовочный файл immintrin.h с описанием соответствующих intrinsic-функций. Включение этого заголовочного файла автоматически влечёт за собой включение заголовочных файлов всех SSE-intrinsic’ов. Что касается 128-битных инструкций AVX, то для них нет ни только отдельных хидеров, но и отдельных intrinsics-функций. Вместо этого для них используются intrinsic-функции для SSEx-инструкций, а тип инструкций (SSE или AVX), в которые будут компилироваться вызовы этих intrinsic-функций задаётся в параметрах компилятора. Это означает, что смешать SSE и AVX формы 128-битных инструкций в одном компилируемом файле не получится, и если вы хотите иметь и SSE, и AVX версии функций, то вам придётся писать их в разных компилируемых файлах (и компилировать эти файлы с разными параметрами). Параметры компиляции, которые включают компиляцию SSEx intrinsic-функций в AVX инструкции следующие:

    • /arch:AVX — для Microsoft C/C++ Compiler и Intel C++ Compiler под Windows
    • -mavx — для GCC и Intel C++ Compiler под Linux
    • /QxAVX — для Intel C++ Compiler
    • /QaxAVX — для Intel C++ Compiler

    Следует иметь в виду, что данные команды не только изменяют поведение SSEx intrinsic-функций, но и разрешают компилятору генерировать AVX инструкции при компиляции обычного C/C++ кода (/QaxAVX говорит Интеловскому компилятору сгенерировать две версии кода — с AVX инструкциями и с базовыми x86 инструкциями).
    Чтобы со всеми этими intrinsic’ами было проще разобраться, Intel сделал интерактивный справочник — Intel Intrinsic Guide, который включает в себя описание всех intrinsic-функций, которые поддерживаются интеловскими процессорами. Для тех инструкций, которые уже реализованы в железе, указаны также latency и throughput. Скачать этот справочник можно с сайта Intel AVX (есть версии для Windows, Linux и Mac OS X).

    Определение поддержки AVX системой

    В принципе, для распознавания поддержки AVX системой можно использовать приведённый ранее ассемблерный код, переписав его на inline-ассемблере, либо просто прилинковав собранный ассемблером объектный файл. Однако, если использование inline-ассемблера невозможно (например, из-за coding guidelines, либо потому, что компилятор его не поддерживает, как в случае Microsoft C/C++ Compiler’а для Windows x64), то you are in deep shit. Проблема в том, что intrinsic-функции для инструкции xgetbv не существует! Таким образом, задача разбивается на две части: проверить, что процессор поддерживает AVX (это можно сделать кроссплатформенно) и проверить, что ОС поддерживает AVX (тут уж придётся писать свой код для каждой ОС).
    Проверить, что процессор поддерживает AVX можно используя всё ту же инструкцию CPUID, для которой есть intrinsic-функция void __cpuid( int cpuInfo[4], int infoType ). Параметр infoType задаёт значение регистра eax перед вызовом CPUID, а cpuInfo после выполнения функции будет содежать регистры eax, ebx, ecx, edx (именно в таком порядке). Т.о. получаем следующий код:
    int isAvxSupportedByCpu() {
        int cpuInfo[4];
        __cpuid( cpuInfo, 0 );
        if( cpuInfo[0] != 0 ) {
            __cpuid( cpuInfo, 1 );
            return cpuInfo[3] & 0x10000000; // Возвращаем ноль, если 28-ой бит в ecx сброшен
        } else {
            return 0; // Процессор не поддерживает получение информации о поддерживаемых наборах инструкций
        }
    }

    С поддержкой со стороны ОС сложнее. AVX на сегодня поддерживается следующими ОС:

    • Windows 7
    • Windows Server 2008 R2
    • Linux с ядром 2.6.30 и выше

    В Windows была добавлена возможность узнать о поддержке операционкой новых наборов инструкций в виде функции GetEnabledExtendedFeatures из kernel32.dll. К сожалению, эта функция документирована чуть менее, чем никак. Но кое-какую информацию о ней раздобыть всё же можно. Эта функция описана в файле WinBase.h из Platform SDK:
    WINBASEAPI
    DWORD64
    WINAPI
    GetEnabledExtendedFeatures(
        __in DWORD64 FeatureMask
        );

    Значения для параметра FeatureMask можно найти в хидере WinNT.h:
    //
    // Known extended CPU state feature IDs
    //

    #define XSTATE_LEGACY_FLOATING_POINT        0
    #define XSTATE_LEGACY_SSE                   1
    #define XSTATE_GSSE                         2

    #define XSTATE_MASK_LEGACY_FLOATING_POINT   (1i64 << (XSTATE_LEGACY_FLOATING_POINT))
    #define XSTATE_MASK_LEGACY_SSE              (1i64 << (XSTATE_LEGACY_SSE))
    #define XSTATE_MASK_LEGACY                  (XSTATE_MASK_LEGACY_FLOATING_POINT | XSTATE_MASK_LEGACY_SSE)
    #define XSTATE_MASK_GSSE                    (1i64 << (XSTATE_GSSE))

    #define MAXIMUM_XSTATE_FEATURES             64

    Нетрудно заметить, что маски 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-кода с использованием intrinsic-функций не вызовет у вас затруднений, если вы когда-либо использовали MMX или SSE посредством intrinsic’ов. Единственное, о чём нужно позаботиться дополнительно, это вызвать функцию _mm256_zeroupper() в конце подпрограммы (как нетрудно догадаться, эта intrinsic-функция генерирует инструкцию vzeroupper). Например, приведённая выше ассемблерная подпрограмма vec4_dot_avx может быть переписана на intrinsic’ах так:
    double vec4_dot_avx( double a[4], double b[4] ) {
        // mmA = a
        const __m256d mmA = _mm256_loadu_pd( a );
        // mmB = b
        const __m256d mmB = _mm256_loadu_pd( b );
        // mmAB = ( a3 * b3, a2 * b2, a1 * b1, a0 * b0 )
        const __m256d mmAB = _mm256_mul_pd( mmA, mmB );
        // mmABHigh = ( +0.0, +0.0, a3 * b3, a2 * b2 )
        const __m256d mmABHigh = _mm256_permute2f128_pd( mmAB, mmAB, 0x81 );
        // mmSubSum = ( +0.0, +0.0, a1 * b1 + a3 * b3, a0 * b0 + a2 * b2 )
        const __m128d mmSubSum = _mm_add_pd(
            _mm256_castpd256_pd128( mmAB ),
            _mm256_castpd256_pd128( mmABHigh )
        );
        // mmSum = ( +0.0, +0.0, +0.0, a0 * b0 + a1 * b1 + a2 * b2 + a3 * b3 )
        const __m128d mmSum = _mm_hadd_pd( mmSubSum, _mm_setzero_pd() );
        const double result = _mm_cvtsd_f64( mmSum );
        _mm256_zeroupper();
        return result;
    }

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

    Упражнение

    Приведённый код подпрограммы vec4_dot_avx не является оптимальным с точки зрения производительности. Попробуйте переписать её более оптимально. Какая у вас получалась Data Dependency Latency?

    Введение

    Для многих разработчиков, работающих с вычислениями, критическую роль играет производительность. Один из способов повышения скорости работы приложения — использовать инструкции набора команд SIMD. Один из наборов команд — набор AVX (Advanced Vector Extensions), который был разработан компанией Intel и включает в себя команды для работы с векторами данных.

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

    Что же делать в этом случае? Вариант — использование эмулятора инструкций AVX. В этой статье мы рассмотрим, как использовать эмулятор AVX для оптимизации производительности вашего приложения.

    Шаг 1: Выбор эмулятора

    Существует множество программных эмуляторов инструкций AVX. Некоторые из них — OpenBLAS, MKL, LIBXSMM. В этой статье мы будем использовать эмулятор AVX от компании Intel — SVML (Short Vector Math Library).

    Шаг 2: Установка и настройка SVML

    SVML является частью Intel Compiler Suite и, как правило, устанавливается вместе с компилятором. Если вы не используете компилятор Intel, вы можете установить SVML через пакетный менеджер вашей операционной системы.

    После установки необходимо указать путь к библиотеке SVML в настройках вашей IDE. В Visual Studio это можно сделать через Configuration Properties → Linker → General → Additional Library Directories. Также необходимо добавить libsvml в список библиотек, используемых вашим проектом.

    Шаг 3: Использование инструкций AVX

    После установки и настройки SVML можно начать использовать инструкции набора AVX. В качестве примера рассмотрим вычисление суммы элементов массива.

    #include <immintrin.h> // загрузка заголовочного файла для использования инструкций AVX
    
    float sum(float* data, size_t n) {
        __m256 sum_vec = _mm256_setzero_ps(); // инициализация вектора суммы
    
        for (size_t i = 0; i < n; i += 8) { // обход массива с шагом 8
            __m256 data_vec = _mm256_load_ps(&data[i]); // загрузка 8 элементов массива в вектор
            sum_vec = _mm256_add_ps(sum_vec, data_vec); // добавление вектора элементов к вектору суммы
        }
    
        float sum = 0.0f;
        for (size_t i = 0; i < 8; i++) { // суммирование элементов вектора суммы
            sum += sum_vec[i];
        }
    
        for (size_t i = n - n % 8; i < n; i++) { // суммирование оставшихся элементов
            sum += data[i];
        }
    
        return sum;
    }
    

    Этот код загружает элементы массива в векторы по 8 штук и складывает векторы. После этого оставшиеся элементы массива суммируются стандартным способом.

    Заключение

    Использование эмулятора инструкций AVX может значительно ускорить выполнение приложения на процессорах без поддержки AVX. Однако не стоит забывать, что производительность приложения может зависеть от многих факторов, таких как HDD/SSD, объем оперативной памяти, версия операционной системы, и др. В любом случае, использование инструкций набора AVX может дать дополнительный прирост скорости работы приложения в целом.

    Понравилась статья? Поделить с друзьями:
  • Как вести ип для начинающих пошаговая инструкция упрощенка
  • Как вести ип для начинающих пошаговая инструкция для бухгалтера
  • Как взять товар в кредит на вайлдберриз пошаговая инструкция
  • Как взять талончик в мфц через госуслуги пошаговая инструкция через телефон
  • Как вести инстаграм для бизнеса инструкция