Очікує на перевірку

AVX

Матеріал з Вікіпедії — вільної енциклопедії.
(Перенаправлено з Advanced Vector Extensions)
Перейти до навігації Перейти до пошуку

Advanced Vector Extensions (AVX) — розширення системи команд x86 для мікропроцесорів Intel і AMD. Intel запропонував їх у березні 2008 року і вперше втілив у процесорі Sandy Bridge[1], який вийшов у першому кварталі 2011 року, а пізніше компанія AMD у процесорі Bulldozer[2], який постачала у третьому кварталі 2011 року. AVX надає різні поліпшення, нові інструкції і нову схему кодування машинних кодів.

AVX2 (також відомий як Haswell New Instructions) розширює більшість цілочисельних команд до 256 біт і вводить нові інструкції. Вперше вони були додані Intel з процесорами Haswell, який вийшов у 2013 році.

AVX-512 розширює підтримку AVX до 512-біт за допомогою нового кодування префікса EVEX, запропонованого Intel у липні 2013 року і вперше додані у співпроцесорі Knights Landing, який вийшов у 2016 році.[3][4] У звичайних процесорах AVX-512 був представлений із серверним Skylake та процесорами HEDT у 2017 році.

Нововведення AVX

[ред. | ред. код]

Набір команд AVX запроваджує наступні нововведення:

  • Нова схема кодування інструкцій VEX
  • Ширина векторних регістрів SIMD збільшується з 128 (XMM) до 256 біт (регістри YMM0 - YMM15). Існуючі 128-бітові SSE інструкції будуть використовувати молодшу половину нових YMM регістрів, не змінюючи старшу частину. Для роботи з YMM регістрами додані нові 256-бітові AVX інструкції (новіший стандарт AVX-512 розширює векторні регістри SIMD до 512 біт). Процесорна архітектура Intel Larrabee мала векторні регістри ZMM шириною в 512 біт, і використовувала для роботи з ними SIMD команди з префіксами MVEX і VEX, але при цьому вони не підтримували AVX.
  • Неруйнівні операції. Набір AVX інструкцій використовує триоперандний синтаксис. Наприклад, замість a = a + b можна використовувати c = a + b, при цьому регістр a залишається незміненим. У випадках, коли значення a використовується далі в обчисленнях, це підвищує продуктивність, оскільки позбавляє від необхідності зберігати перед обчисленням і відновлювати після обчислення регістр, що містив a, з іншого регістра або пам'яті.
  • Для більшості нових інструкцій відсутні вимоги до вирівнювання операндів в пам'яті. Однак, рекомендується стежити за вирівнюванням на розмір операнда, щоб уникнути значного зниження продуктивності.
  • Набір інструкцій AVX містить в собі аналоги 128-бітних SSE інструкцій для дійсних чисел. При цьому, на відміну від оригіналів, збереження 128-бітного результату буде обнуляти старшу половину YMM регістра. 128-бітові AVX інструкції зберігають інші переваги AVX, такі як нова схема кодування, триоперандний синтаксис і невирівняний доступ до пам'яті. Рекомендується відмовитися від старих SSE інструкцій на користь нових 128-бітних AVX інструкцій, навіть якщо достатньо двох операндів.

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

[ред. | ред. код]

Нова схема кодування інструкцій VEX[en] використовують префікси 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 [rm: 66 0f 3a 44 /r 00]
  • PCLMULHQLQDQ xmmreg,xmmrm [rm: 66 0f 3a 44 /r 01]
  • PCLMULLQHQDQ xmmreg,xmmrm [rm: 66 0f 3a 44 /r 02]
  • PCLMULHQHQDQ xmmreg,xmmrm [rm: 66 0f 3a 44 /r 03]
  • PCLMULQDQ xmmreg,xmmrm,imm [rmi: 66 0f 3a 44 /r ib]

Застосування

[ред. | ред. код]

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

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

[ред. | ред. код]

Використання YMM-регістрів вимагає підтримки з боку операційної системи. Наступні системи підтримують регістри YMM:

  • Linux: підтримується, починаючи з версії ядра 2.6.30,[5] що з'явилася 9 червня 2009 року.[6]
  • Windows 7: підтримка додана в Service Pack 1
  • Windows Server 2008 R2: підтримка додана в Service Pack 1
Докладніше: AVX-512

Див. також

[ред. | ред. код]

Примітки

[ред. | ред. код]
  1. Kanter, David (25 вересня 2010). Intel's Sandy Bridge Microarchitecture. www.realworldtech.com (амер.). Архів оригіналу за 16 серпня 2019. Процитовано 17 лютого 2018.
  2. Hruska, Joel (24 жовтня 2011). Analyzing Bulldozer: Why AMD's chip is so disappointing - Page 4 of 5 - ExtremeTech. ExtremeTech (амер.). Архів оригіналу за 16 серпня 2019. Процитовано 17 лютого 2018.
  3. James Reinders (23 липня 2013), AVX-512 Instructions, Intel, архів оригіналу за 31 березня 2015, процитовано 20 серпня 2013
  4. Intel Xeon Phi Processor 7210 (16GB, 1.30 GHz, 64 core) Product Specifications. Intel ARK (Product Specs). Архів оригіналу за 7 вересня 2017. Процитовано 16 березня 2018.
  5. x86: add linux kernel support for YMM state, процитовано 13 липня 2009
  6. Linux 2.6.30 - Linux Kernel Newbies, архів оригіналу за 5 квітня 2012, процитовано 13 липня 2009

Джерела

[ред. | ред. код]