Advanced Vector Extensions
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
[edytuj | edytuj kod]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 | edytuj kod]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
[edytuj | edytuj kod]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
[edytuj | edytuj kod]Instrukcje AVX działają na rejestrach YMM, niektóre również na XMM.
Nowe rozkazy
[edytuj | edytuj kod]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)
[edytuj | edytuj kod]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
[edytuj | edytuj kod]AESDEC
,AESDECLAST
– deszyfrowanieAESENC
,AESENCLAST
– szyfrowanieAESIMC
AESKEYGENASSIST
Rozszerzone rozkazy SSE
[edytuj | edytuj kod]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
[edytuj | edytuj kod]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
[edytuj | edytuj kod]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
[edytuj | edytuj kod]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 | edytuj kod]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 | edytuj kod]Instrukcja | Działanie |
---|---|
VDPPD
|
wyznaczenie iloczynu skalarnego |
VINSERTPS
|
wstawienie elementu do wektora XMM |
Rozkazy konwersji
[edytuj | edytuj kod]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ż
[edytuj | edytuj kod]Przypisy
[edytuj | edytuj kod]- ↑ Westmere – wykonanie i nowe instrukcje :: PCLab.pl [online], pclab.pl [dostęp 2017-11-21] (pol.).
Bibliografia
[edytuj | edytuj kod]- Advanced Vector Extensions Programming Reference (dokument 319433-002), Intel, marzec 2008
Linki zewnętrzne
[edytuj | edytuj kod]- Strona producenta nt AVX. softwareprojects.intel.com. [zarchiwizowane z tego adresu (2008-09-17)].