Advanced Vector Extensions
Z Wikipedii, wolnej encyklopedii
AVX (Advanced Vector Extensions) – rozszerzenie listy rozkazów SSE opublikowane w marcu 2008 przez Intel. Jako pierwszy procesor zawierający ten zestaw instrukcji miał się pojawić w pierwszym kwartale 2011 roku i być oparty na architekturze Sandy Bridge tej firmy. AMD zapowiadał wprowadzenie procesora z AVX na trzeci kwartał 2011 roku – miałby być to układ o architekturze 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 rozkazów).
- Dodane czteroargumentowe rozkazy akumulujące wyniki mnożenia wektorów liczb zmiennoprzecinkowych, to znaczy wykonujące obliczenia według schematu (12 rozkazów).
- Dodane specjalizowane instrukcje wspomagające szyfrowanie AES (6 rozkazów).
- Część rozkazów SSE, głównie tych działających na wektorach liczb zmiennoprzecinkowych, może wykonywać działania na rejestrach YMM (88 rozkazów).
- Rozszerzone kodowanie rozkazów, dzięki któremu możliwe stało się wykonywanie niektórych instrukcji SSE w wariancie trójargumentowym lub czteroargumentowym. Dotychczas wszystkie rozkazy były dwuargumentowe, z czego jeden był docelowy (nadpisywany) i często zachodziła konieczność jego zapisania/przepisania do innego rejestru lub pamięci, jeśli musiał zostać wykorzystany w dalszej części obliczeń – w wariancie trójargumentowym można wprost wskazać docelowy rejestr (rozwiązanie zapożyczone z architektury RISC) (166 rozkazów).
Rejestry

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
W związku z dwukrotnym poszerzeniem rejestru pojawiły się nowe typy wektorowe tylko dla liczb zmiennoprzecinkowych:
- 8 × 32 bity – wektor 8 liczb zmiennoprzecinkowych pojedynczej precyzji
- 4 × 64 bity – wektor 4 liczb zmiennoprzecinkowych podwójnej precyzji
Mnemoniki instrukcji
Mnemoniki rozkazów AVX oraz 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), czyli liczba zmiennoprzecinkowa odpowiednio pojedynczej i podwójnej precyzji
Mnemoniki rozkazów akumulujących wyniki mnożenia rozpoczynają się od VFM
lub VFNM
, natomiast mnemoniki rozkazów wspomagających szyfrowanie od AES
.
Rozkazy AVX
Podsumowanie
Perspektywa
Instrukcje AVX działają na rejestrach YMM, niektóre również na XMM.
Nowe rozkazy
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 128 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)
Liczba rozkazów należących do tej grupy wynosi 12. Wszystkie są czteroargumentowe VFMxxxxx w, x, y, z
i wykonują działanie według schematu
Instrukcje skalarne, czyli działające na pierwszym elemencie wektora (sufiks SD
lub SS
), zachowują się inaczej niż instrukcje skalarne SSE: wpisują wartość zero na pozostałe pozycje wektora wynikowego, podczas gdy w SSE przepisywane są elementy jednego z argumentów.
Lista rozkazów 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
AESDEC
,AESDECLAST
– deszyfrowanieAESENC
,AESENCLAST
– szyfrowanieAESIMC
AESKEYGENASSIST
Rozszerzone rozkazy SSE
Podsumowanie
Perspektywa
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
Rozkazy SSE mogące dodatkowo działać na rejestrach YMM
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 × 64 bity) |
VMOVMSKPS |
utworzenie 8-bitowej maski bitowej z najstarszych bitów wektora liczb zmiennoprzecinkowych pojedynczej precyzji (8 × 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
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 bitowa |
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
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
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
Instrukcja | Działanie |
---|---|
VDPPD |
wyznaczenie iloczynu skalarnego |
VINSERTPS |
wstawienie elementu do wektora XMM |
Rozkazy konwersji
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 |
Zobacz też
Przypisy
Bibliografia
Linki zewnętrzne
Wikiwand - on
Seamless Wikipedia browsing. On steroids.