AVX
Ця стаття не містить посилань на джерела. (березень 2017) |
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 запроваджує наступні нововведення:
- Нова схема кодування інструкцій 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) |
- ↑ 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
- Agner Fog (15 вересня 2018). The microarchitecture of Intel, AMD and VIA CPUs: An optimization guide for assembly programmers and compiler makers (PDF). Technical University of Denmark. Архів оригіналу (PDF) за 22 березня 2019. Процитовано 15 серпня 2019.
Це незавершена стаття про апаратне забезпечення. Ви можете допомогти проєкту, виправивши або дописавши її. |