AVX
Ця стаття не містить посилань на джерела. (березень 2017) |
Advanced Vector Extensions (AVX) — розширення системи команд x86 для мікропроцесорів Intel і AMD. Вони були запропоновані Intel у березні 2008 року і вперше додані Intel з процесорами 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 запроваджує наступні нововведення:
- Нова схема кодування інструкцій 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
Цей розділ потребує доповнення. (серпень 2019) |
Цей розділ потребує доповнення. (серпень 2019) |
- ↑ Kanter, David (25 вересня 2010). Intel's Sandy Bridge Microarchitecture. www.realworldtech.com (амер.). Архів оригіналу за 16 серпня 2019. Процитовано 17 лютого 2018.
- ↑ Hruska, Joel (24 жовтня 2011). Analyzing Bulldozer: Why AMD's chip is so disappointing - Page 4 of 5 - ExtremeTech. ExtremeTech (амер.). Архів оригіналу за 16 серпня 2019. Процитовано 17 лютого 2018.
- ↑ James Reinders (23 липня 2013), AVX-512 Instructions, Intel, архів оригіналу за 31 березня 2015, процитовано 20 серпня 2013
- ↑ Intel Xeon Phi Processor 7210 (16GB, 1.30 GHz, 64 core) Product Specifications. Intel ARK (Product Specs). Архів оригіналу за 7 вересня 2017. Процитовано 16 березня 2018.
- ↑ x86: add linux kernel support for YMM state, процитовано 13 липня 2009
- ↑ Linux 2.6.30 - Linux Kernel Newbies, архів оригіналу за 5 квітня 2012, процитовано 13 липня 2009
<ref>
з назвою "FogMicro", визначений у <references>
, не використовується в попередньому тексті.
Це незавершена стаття про апаратне забезпечення. Ви можете допомогти проєкту, виправивши або дописавши її. |