Відмінності між версіями «AVX»

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку
[перевірена версія][перевірена версія]
(Згрупував про AVX у один розділ. Буде ще про AVX-512)
(→‎Джерела: категоризація; додано дуже важливу статтю, де розповідається про warm-up period при використанні інструкцій AVX і AVX-512)
Рядок 77: Рядок 77:
   
 
== Джерела ==
 
== Джерела ==
{{reflist}}
+
{{reflist|refs=
  +
<ref name=FogMicro>{{cite web
  +
|author = Agner Fog
  +
|title = The microarchitecture of Intel, AMD and VIA CPUs: An optimization guide for assembly programmers and compiler makers
  +
|institution = Technical University of Denmark
  +
|date = 15 September 2018
  +
|url = https://www.agner.org/optimize/microarchitecture.pdf}}</ref>
  +
}}
   
 
{{ВП-портали|Програмування}}
 
{{ВП-портали|Програмування}}
   
 
{{Hardware-stub}}
 
{{Hardware-stub}}
  +
[[Категорія:Архітектура комп'ютера]]
 
[[Категорія:X86-32]]
+
[[Категорія:Інструкції X86]]
  +
[[Категорія:SIMD]]

Версія за 14:29, 15 серпня 2019

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

AVX надає різні поліпшення, нові інструкції і нову схему кодування машинних кодів.

Нововведення 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,[1] що з'явилася 9 червня 2009 року.[2]
  • Windows 7: підтримка додана в Service Pack 1
  • Windows Server 2008 R2: підтримка додана в Service Pack 1

AVX2

AVX-512

Див. також

Джерела

  1. x86: add linux kernel support for YMM state. Процитовано July 13, 2009. 
  2. Linux 2.6.30 - Linux Kernel Newbies. Процитовано July 13, 2009. 
Помилка цитування: Тег <ref> з назвою "FogMicro", визначений у <references>, не використовується в попередньому тексті.