Advanced Vector Extensions
AVX (Advanced Vector Extensions) – rozszerzenie zestawu instrukcji SSE opublikowane w marcu 2008 przez firmę Intel. Jako pierwszy procesor zawierający ten zestaw instrukcji miał się pojawić w pierwszym kwartale 2011 roku i być oparty na układzie Sandy Bridge firmy Intel. AMD zapowiadał wprowadzenie procesora z AVX na trzeci kwartał 2011 roku - miałby być to układ BullDozer.
Rozszerzenia:
- W AVX wprowadzono 256-bitowe rejestry - 2 razy większe niż wykorzystywane dotychczas w SSE. Nowych rejestrów jest 16 i w asemblerze noszą nazwy YMM0...YMM15. W dalszych wersjach AVX mogą pojawić się jeszcze większe rejestry, 512-, a nawet 1024-bitowe.
- Dodano kilka rozkazów działających wyłącznie na rejestrach YMM (19 instrukcji).
- Dodane 4-argumentowe rozkazy akumulujące wyniki mnożenia wektorów liczb zmiennoprzecinkowych, tj. wykonujące obliczenia według schematu
(12 instrukcji). - Dodane specjalizowane instrukcje wspomagające szyfrowanie AES (6 instrukcji).
- Część rozkazów SSE, głównie tych działających na wektorach liczb zmiennoprzecinkowych, może wykonywać działania na rejestrach YMM (88 instrukcji).
- Rozszerzone kodowanie rozkazów, dzięki któremu możliwe stało się wykonywanie niektórych rozkazów SSE w wariancie 3-argumentowym lub 4-argumentowym. Dotychczas wszystkie rozkazy były 2-argumentowe z czego jeden był docelowy (nadpisywany) i często zachodziła konieczność jego zapisania/przepisania do innego rejestru czy pamięci, jeśli musiał zostać wykorzystany w dalszej części obliczeń - w wariancie 3-argumentowym można wprost wskazać docelowy rejestr (rozwiązanie zapożyczone z architektury RISC) (166 instrukcji).
Rejestry [edytuj]
Mikroprocesor pracujący w trybie 32-bitowym ma dostęp do pierwszych 8 rejestrów (0..7), w trybie 64-bitowym do wszystkich. Istniejące rejestry SSE (XMM0...XMM7) zostały zamapowane na młodsze 128 bitów rejestrów YMM0...YMM7.
Typy danych [edytuj]
W związku z dwukrotnym poszerzeniem rejestru pojawiły się nowe typy wektorowe tylko dla liczb zmiennoprzecinkowych:
- 8 x 32 bity - wektor 8 liczb zmiennoprzecinkowych pojedynczej precyzji
- 4 x 64 bity - wektor 4 liczb zmiennoprzecinkowych podwójnej precyzji
Mnemoniki instrukcji [edytuj]
Mnemoniki instrukcji AVX jak również SSE działających na 256-bitowych rejestrach rozpoczynają się literą V. Typ danych, na jakich działają określa sufiks:
- PS, PD - wektor liczb zmiennoprzecinkowych,
- SS, SD - skalar (pierwszy element wektora), tj. liczba zmiennoprzecinkowa, odpowiednio, pojedynczej i podwójnej precyzji
Mnemoniki instrukcji akumulujących wyniki mnożenia rozpoczynają się od VFM lub VFNM, natomiast mnemoniki rozkazów wspomagających szyfrowanie od AES.
Instrukcje AVX [edytuj]
Instrukcje AVX działają na rejestrach YMM, niektóre również na XMM.
Nowe instrukcje [edytuj]
| Instrukcja | Działanie |
|---|---|
| VBROADCASTSS VBROADCASTSD VBROADCASTF128 |
powielenie liczby 32-, 64- lub 128-bitowej pobranej z pamięci w rejestrze XMM lub YMM |
| VEXTRACTF128 | przepisanie starszych lub młodszych 128 bitów z rejestru YMM do pamięci lub rejestru XMM (zerując starsze 12 bitów stowarzyszonego z nim rejestru YMM) |
| VINSERTF128 | wpisanie 128 bitów z rejestru XMM lub pamięci do starszej lub młodszej połówki źródłowego rejestru YMM i przepisanie tak utworzonego wektora docelowego YMM |
| VMASKMOVPS VMASKMOV |
przesłanie wybranych elementów z do pamięci (przesłania 128 lub 256-bitowe) |
| VPERMILPD VPERMILPS |
dowolna permutacja elementów wektora |
| VPERMIL2PD VPERMIL2PS VPERM2F128 |
dowolna permutacja elementów z dwóch wektorów; dodatkowo można wskazać które elementy wektora wynikowego mają zostać wyzerowane |
| PCLMULQDQ | ang. carry-less-multiplication - mnożenie liczb binarnych 64-bitowych[1], w którym przy dodawaniu nie uwzględnia się przeniesień (kolejne bity wyniku to efekt wykonania pewnej liczby różnic symetrycznych) |
| VPTESTPS VPTESTPD |
rozkazy podobne do VPTEST (PTEST, patrz opis SSE4), przy czym działania bitowe nie są przeprowadzane na całych rejestrach, lecz na bitach znaków liczb zmiennoprzecinkowych |
| VZEROALL | w trybie 64-bitowym wyzerowanie wszystkich rejestrów YMM, w trybie 32-bitowym - YMM0..YMM7 |
| VZEROUPPER | w trybie 64-bitowym wyzerowanie bitów 128..255 we wszystkich rejestrach YMM, w trybie 32-bitowym - w rejestrach YMM0..YMM7 |
| VLDMXCSR VSTMXCSR |
załadowanie/zapis zawartości rejestru kontrolnego z/do pamięci |
Akumulujące wyniki mnożenia (FMA) [edytuj]
Liczba instrukcji należących do tej grupy wynosi 12. Wszystkie są czteroargumentowe VFMxxxxx w, x, y, z i wykonują działanie według schematu
.
Instrukcje skalarne, tj. działające na pierwszym elemencie wektora (sufiks SD lub SS), zachowują się inaczej niż instrukcje skalarne SSE: wpisują bowiem wartość zero na pozostałe pozycje wektora wynikowego, podczas gdy w SSE przepisywane są elementy jednego z argumentów.
Lista instrukcji FMA:
| Instrukcja | Działanie |
|---|---|
| VFMADDPD VFMADDPS VFMADDSD VFMADDSS |
, lub ![]() |
| VFMSUBPD VFMSUBPS VFMSUBSD VFMSUBSS |
![]() |
| VFNMADDPD VFNMADDPS VFNMADDSD VFNMADDSS |
![]() |
| VFNMSUBPD VFNMSUBPS VFNMSUBSD VFNMSUBSS |
![]() |
| VFMADDSUBPD VFMADDSUBPS |
, przy czym dla parzystego wykonywane jest dodawanie, dla nieparzystego - odejmowanie |
| VFMSUBADDPD VFMSUBADDPS |
, przy czym dla nieparzystego wykonywane jest dodawanie, dla parzystego - odejmowanie |
Wspomagające szyfrowanie algorytmem AES [edytuj]
- AESDEC, AESDECLAST - deszyfrowanie
- AESENC, AESENCLAST - szyfrowanie
- AESIMC
- AESKEYGENASSIST
Rozszerzone instrukcje SSE [edytuj]
AVX rozszerza możliwości instrukcji SSE na dwa sposoby:
- umożliwia przeprowadzanie obliczeń na dwa razy szerszych rejestrach YMM
- rozszerza liczbę argumentów z dwóch na trzy lub trzech na cztery
Instrukcje SSE mogące dodatkowo działać na rejestrach YMM [edytuj]
| Instrukcja | Działanie |
|---|---|
| VCVTDQ2PD VCVTDQ2PS |
konwersja 32-bitowych liczb całkowitych na zmiennoprzecinkowe |
| VCVTPD2DQ VCVTTPD2DQ VCVTPS2DQ VCVTTPS2DQ |
konwersja liczb zmiennoprzecinkowych podwójnej/pojedynczej precyzji na 32-bitowe liczby całkowite |
| VCVTPD2PS | konwersja liczb zmiennoprzecinkowych podwójnej precyzji na liczby pojedynczej precyzji |
| VCVTPS2PD | konwersja liczb zmiennoprzecinkowych pojedynczej precyzji na liczby podwójnej precyzji |
| VLDDQU VMOVDQU VMOVUPD VMOVUPS |
załadowanie 256 bitów z pamięci (adresy pamięci dowolne) |
| VMOVPAD VMOVAPS VMOVDQA |
załadowanie 256 bitów z pamięci (adresy pamięci wyrównane do granicy 256 bitów) |
| VMOVDDUP | powielenie elementów |
| VMOVMSKPD | utworzenie 4-bitowej maski bitowej z najstarszych bitów wektora liczb zmiennoprzecinkowych podwójnej precyzji (4 x 64 bity) |
| VMOVMSKPS | utworzenie 8-bitowej maski bitowej z najstarszych bitów wektora liczb zmiennoprzecinkowych pojedynczej precyzji (8 x 32 bity) |
| VMOVSHDUP VMOVSLDUP |
powielenie elementów o nieparzystych/parzystych indeksach w wektorze liczb 32-bitowych |
| VPTEST | |
| VRCPPS | aproksymacja odwrotności |
| VRSQRTPS | aproksymacja odwrotności pierwiastka |
| VROUNDPD VROUNDPS |
zaokrąglanie |
| VSHUFPD VSHUFPS |
utworzenie wektora z elementów dwóch innych wekorów |
| VSQRTPD VSQRTPS |
pierwiastek |
| VUNPCKHPD VUNPCKHPS VUNPCKLPD VUNPCKLPS |
Trójargumentowe instrukcje SSE mogące działać na rejestrach XMM oraz YMM [edytuj]
| Instrukcja | Działanie |
|---|---|
| VADDPD VADDPS |
dodawanie |
| VSUBPD VSUBPS |
odejmowanie |
| VMULPD VMULPS VMULSD VMULSS |
mnożenie |
| VDIVPD VDIVPS VDIVSD VDIVSS |
dzielenie |
| VSUBADDPD VSUBADDPS |
naprzemienne dodawanie i odejmowanie |
| VHADDPD VHADDPS |
dodawanie sąsiednich elementów |
| VHSUBPD VHSUBPS |
odejmowanie sąsiednich elementów |
| VMAXPD VMAXPS VMINPD VMINPS |
wybranie maksymalnych/minimalnych wartości z dwóch wektorów |
| VANDPD VANDPS |
iloczyn bitowy |
| VANDNPD VANDNPS |
iloczyn bitowy z jednym z argumentów zanegowanym |
| VORPD VORPS |
suma bitowy |
| VXORPD VXORPS |
różnica symetryczna |
| VCMPPD VCMPPS VCMPSD VCMPSS |
porównania (rozszerzono także z 8 do 32 liczbę relacji, które można sprawdzić) |
| VCVTSD2SS | konwersja liczby zmiennoprzecinkowej podwójnej precyzji na pojedynczej precyzji |
| VCVTSS2SD | konwersja liczby zmiennoprzecinkowej pojedynczej precyzji na podwójnej precyzji |
| VMOVSD VMOVSS |
wpisanie pojedynczej liczby zmiennoprzecinkowej podwójnej/pojedynczej precyzji |
| VRCPSS | aproksymacja odwrotności |
| VRSQRTSS | aproksymacja odwrotności pierwiastka |
| VROUNDSD VROUNDSS |
zaokrąglanie |
| VSQRTSD VSQRTSS |
pierwiastek |
| VPACKSSDW VPACKSSWB |
konwersja liczb całkowitych 32-bitowych na 16-bitowe/16-bitowych na 8-bitowe; wyniki są nasycane |
| VPACKUSDW VPACKUSWB |
konwersja liczb całkowitych 32-bitowych na 16-bitowe bez znaku/16-bitowych na 8-bitowe bez znaku; wyniki są nasycane |
Trójargumentowe instrukcje SSE mogące działać wyłącznie na rejestrach XMM [edytuj]
Rozkazy działające na wektorach liczb zmiennoprzecinkowych:
| Instrukcja | Działanie |
|---|---|
| VADDSD VADDSS |
dodawanie skalarne |
| VSUBSD VSUBSS |
odejmowanie skalarne |
| VMAXSD VMAXSS VMINSD VMINSS |
wybranie maksymalnych/minimalnych wartości z dwóch skalarów |
| VMOVHLPS | przepisanie starszych 64 bitów (64..127) rejestru XMM na najmłodsze pozycje (0..63), wyzerowanie starszych 128 bitów stowarzyszonego z nim rejestru YMM |
| VMOVLHPS | przepisanie młodszych 64 bitów (0..63) rejestru XMM na najmłodsze pozycje (0..63), wyzerowanie starszych 128 bitów stowarzyszonego z nim rejestru YMM |
| VMOVHPD VMOVHPS |
skopiowanie bitów młodszych 64 bitów (0..63) argumentu na pozycje 0..63 i 64..127 rejestru XMM, wyzerowanie starszych 128 bitów stowarzyszonego z nim rejestru YMM |
| VMOVLPD VMOVLPS |
Rozkazy działające na wektorach liczb całkowitych:
| Instrukcja | Działanie |
|---|---|
| VMPSADBW | wyznaczenie 8 kolejnych sum modułów różnic (dokładny opis działania w artykule SSE4) |
| VPADDB VPADDW VPADDD VPADDQ |
dodawanie wektorów liczb całkowitych (8-, 16-, 32- i 64-bitowych) |
| VPSUBB VPSUBW VPSUBD VPSUBQ |
odejmowanie wektorów liczb całkowitych (8-, 16-, 32- i 64-bitowych) |
| VPADDSB VPADDSW |
dodawanie z nasyceniem wektorów liczb całkowitych ze znakiem (8- i 16-bitowych) |
| VPSUBSB VPSUBSW |
odejmowanie z nasyceniem wektorów liczb całkowitych ze znakiem (8- i 16-bitowych) |
| VPSUBUSB VPSUBUSW |
odejmowanie z nasyceniem wektorów liczb całkowitych bez znaku (8- i 16-bitowych) |
| VPHADDW VPHADDD |
dodawanie sąsiednich elementów wektorów liczb całkowitych (16- i 32-bitowych) |
| VPHSUBW VPHSUBD |
odejmowanie sąsiednich elementów wektorów liczb całkowitych (16- i 32-bitowych) |
| VPHADDSW | dodawanie z nasyceniem sąsiednich elementów wektorów 16-bitowych liczb całkowitych |
| VPHSUBSW | odejmowanie z nasyceniem sąsiednich elementów wektorów 16-bitowych liczb całkowitych |
| VPADDUSB VPADDUSW |
dodawanie z nasyceniem wektorów liczb całkowitych bez znaku (8- i 16-bitowych) |
| VPALIGNR | połączenie dwóch wektorów 16-bajtowych w 32-bitowy i wybranie z niego zakresu 16 bajtów |
| VPAND VPOR VPXOR VPANDN |
działania bitowe: iloczyn, suma, różnica symetryczna, iloczyn z zanegowanym jednym z argumentów |
| VPAVGB VPAVGW |
średnia arytmetyczna wektorów |
| VPCMPEQB VPCMPEQW VPCMPEQD VPCMPEQQ |
testowanie relacji równości liczb całkowitych (8-, 16-, 32- i 64-bitowych) |
| VPCMPGTB VPCMPGTW VPCMPGTD VPCMPGTQ |
testowanie relacji większości liczb całkowitych ze znakiem (8-, 16-, 32- i 64-bitowych) |
| VPINSRB VPINSRW VPINSRD VPINSRQ |
|
| VMPADDWD VMPADDUBSW |
mnożenie wektorowe, następnie dodawanie sąsiednich elementów: ) |
| VPMAXSB VPMINSB VPMAXSW VPMINSW VPMAXSD VPMINSD |
wybranie maksymalnych/minimalnych liczb całkowitych ze znakiem (z wektorów 8-, 16- i 32-bitowych liczb) |
| VPMAXUSB VPMINUSB VPMAXUSW VPMINUSW VPMAXUSD VPMINUSD |
wybranie maksymalnych/minimalnych liczb całkowitych bez znaku (z wektorów 8-, 16- i 32-bitowych liczb) |
| VPMULHUW VPMULHW |
mnożenie liczb 16-bitowych ze znakiem/bez znaku, zapis starszego słowa wyniku |
| VPMULHRSW | mnożenie liczb 16-bitowych ze znakiem, zapis starszego słowa wyniku po zaokrągleniu |
| VPMULLW VPMULLD |
mnożenie liczb 16-bitowych/32-bitowych ze znakiem, zapis młodszego słowa wyniku |
| VPMULDQ VPMULUDQ |
mnożenie liczb 32-bitowych ze znakiem/bez znaku, zapis pełnego 64-bitowego wyniku |
| VPSADBW | obliczenie odległości wektorów w metryce manhattan, tj. suma modułów różnic bajtów ( ) |
| VPSHUFB VPHSHUFD VPHSHUFHW VPHSUFLW |
permutacje wektorów |
| VPSIGNB VPSIGNW VPSIGND |
|
| VPSQLLDQ VPSRLDQ VPSLLW VPSLLD VPSLLQ VPSRAW VPSRAD VPSRLW VPSRLD VPSRLQ |
przesunięcie bitowe |
| VPUNPCKLBW VPUNPCKLWD VPUNPCKLDQ VPUNPCKLQDQ VPUNPCKHBW VPUNPCKHWD VPUNPCKHDQ VPUNPCKHQDQ |
naprzemienne kopiowanie elementów z dwóch wektorów |
Czteroargumentowe instrukcje SSE mogące działać na rejestrach XMM oraz YMM [edytuj]
| Instrukcja | Działanie |
|---|---|
| VBLENDPD VBLENDPS VBLENDVPD VBLENDVPS |
przepisanie wybranych elementów wektora |
| VDPPS | wyznaczenie iloczynu skalarnego |
| VPBLENDVB | przepisanie wybranych bajtów wektora |
| VPBLENDW | przepisanie wybranych słów wektora |
Czteroargumentowe instrukcje SSE mogące działać tylko na rejestrach XMM [edytuj]
| Instrukcja | Działanie |
|---|---|
| VDPPD | wyznaczenie iloczynu skalarnego |
| VINSERTPS | wstawienie elementu do wektora XMM |
Rozkazy konwersji [edytuj]
Wersje SSE działają na 32-bitowych liczbach całkowitych, AVX - 64-bitowych.
| Instrukcja | Działanie |
|---|---|
| VCVTSD2SI VCVTTSD2SI |
konwersja liczby zmiennoprzecinkowej podwójnej precyzji na 64-bitową liczbę całkowitą |
| VCVTSI2SD | konwersja 64-bitowej liczby całkowitej na liczbę zmiennoprzecinkową podwójnej precyzji |
| VCVTSS2SI VCTTSS2SI |
konwersja liczby zmiennoprzecinkowej pojedynczej precyzji na 64-bitową liczbę całkowitą |
| VCVTSI2SS | konwersja 64-bitowej liczby całkowitej na liczbę zmiennoprzecinkową pojedynczej precyzji |
Bibliografia [edytuj]
- Advanced Vector Extensions Programming Reference (dokument 319433-002), Intel, marzec 2008
,
lub 



, przy czym dla
parzystego wykonywane jest dodawanie, dla nieparzystego - odejmowanie
, przy czym dla
)
)