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 |
|---|---|
VBROADCASTSSVBROADCASTSDVBROADCASTF128
|
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 |
VMASKMOVPSVMASKMOV
|
przesłanie wybranych elementów z do pamięci (przesłania 128 lub 256-bitowe) |
VPERMILPDVPERMILPS
|
dowolna permutacja elementów wektora |
VPERMIL2PDVPERMIL2PSVPERM2F128
|
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) |
VPTESTPSVPTESTPD
|
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 |
VLDMXCSRVSTMXCSR
|
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 |
|---|---|
VFMADDPDVFMADDPSVFMADDSDVFMADDSS
|
lub |
VFMSUBPDVFMSUBPSVFMSUBSDVFMSUBSS
|
|
VFNMADDPDVFNMADDPSVFNMADDSDVFNMADDSS
|
|
VFNMSUBPDVFNMSUBPSVFNMSUBSDVFNMSUBSS
|
|
VFMADDSUBPDVFMADDSUBPS
|
przy czym dla parzystego wykonywane jest dodawanie, dla nieparzystego – odejmowanie |
VFMSUBADDPDVFMSUBADDPS
|
przy czym dla nieparzystego wykonywane jest dodawanie, dla parzystego – odejmowanie |
Wspomagające szyfrowanie algorytmem AES
[edytuj | edytuj kod]AESDEC,AESDECLAST– deszyfrowanieAESENC,AESENCLAST– szyfrowanieAESIMCAESKEYGENASSIST
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 |
|---|---|
VCVTDQ2PDVCVTDQ2PS
|
konwersja 32-bitowych liczb całkowitych na zmiennoprzecinkowe |
VCVTPD2DQVCVTTPD2DQVCVTPS2DQVCVTTPS2DQ
|
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 |
VLDDQUVMOVDQUVMOVUPDVMOVUPS
|
załadowanie 256 bitów z pamięci (adresy pamięci dowolne) |
VMOVPADVMOVAPSVMOVDQA
|
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) |
VMOVSHDUPVMOVSLDUP
|
powielenie elementów o nieparzystych/parzystych indeksach w wektorze liczb 32-bitowych |
VPTEST
|
|
VRCPPS
|
aproksymacja odwrotności |
VRSQRTPS
|
aproksymacja odwrotności pierwiastka |
VROUNDPDVROUNDPS
|
zaokrąglanie |
VSHUFPDVSHUFPS
|
utworzenie wektora z elementów dwóch innych wekorów |
VSQRTPDVSQRTPS
|
pierwiastek |
VUNPCKHPDVUNPCKHPSVUNPCKLPDVUNPCKLPS
|
Trójargumentowe instrukcje SSE mogące działać na rejestrach XMM oraz YMM
[edytuj | edytuj kod]| Instrukcja | Działanie |
|---|---|
VADDPDVADDPS
|
dodawanie |
VSUBPDVSUBPS
|
odejmowanie |
VMULPDVMULPSVMULSDVMULSS
|
mnożenie |
VDIVPDVDIVPSVDIVSDVDIVSS
|
dzielenie |
VSUBADDPDVSUBADDPS
|
naprzemienne dodawanie i odejmowanie |
VHADDPDVHADDPS
|
dodawanie sąsiednich elementów |
VHSUBPDVHSUBPS
|
odejmowanie sąsiednich elementów |
VMAXPDVMAXPSVMINPDVMINPS
|
wybranie maksymalnych/minimalnych wartości z dwóch wektorów |
VANDPDVANDPS
|
iloczyn bitowy |
VANDNPDVANDNPS
|
iloczyn bitowy z jednym z argumentów zanegowanym |
VORPDVORPS
|
suma bitowa |
VXORPDVXORPS
|
różnica symetryczna |
VCMPPDVCMPPSVCMPSDVCMPSS
|
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 |
VMOVSDVMOVSS
|
wpisanie pojedynczej liczby zmiennoprzecinkowej podwójnej/pojedynczej precyzji |
VRCPSS
|
aproksymacja odwrotności |
VRSQRTSS
|
aproksymacja odwrotności pierwiastka |
VROUNDSDVROUNDSS
|
zaokrąglanie |
VSQRTSDVSQRTSS
|
pierwiastek |
VPACKSSDWVPACKSSWB
|
konwersja liczb całkowitych 32-bitowych na 16-bitowe/16-bitowych na 8-bitowe; wyniki są nasycane |
VPACKUSDWVPACKUSWB
|
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 |
|---|---|
VADDSDVADDSS
|
dodawanie skalarne |
VSUBSDVSUBSS
|
odejmowanie skalarne |
VMAXSDVMAXSSVMINSDVMINSS
|
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 |
VMOVHPDVMOVHPS
|
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 |
VMOVLPDVMOVLPS
|
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) |
VPADDBVPADDWVPADDDVPADDQ
|
dodawanie wektorów liczb całkowitych (8-, 16-, 32- i 64-bitowych) |
VPSUBBVPSUBWVPSUBDVPSUBQ
|
odejmowanie wektorów liczb całkowitych (8-, 16-, 32- i 64-bitowych) |
VPADDSBVPADDSW
|
dodawanie z nasyceniem wektorów liczb całkowitych ze znakiem (8- i 16-bitowych) |
VPSUBSBVPSUBSW
|
odejmowanie z nasyceniem wektorów liczb całkowitych ze znakiem (8- i 16-bitowych) |
VPSUBUSBVPSUBUSW
|
odejmowanie z nasyceniem wektorów liczb całkowitych bez znaku (8- i 16-bitowych) |
VPHADDWVPHADDD
|
dodawanie sąsiednich elementów wektorów liczb całkowitych (16- i 32-bitowych) |
VPHSUBWVPHSUBD
|
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 |
VPADDUSBVPADDUSW
|
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 |
VPANDVPORVPXORVPANDN
|
działania bitowe: iloczyn, suma, różnica symetryczna, iloczyn z zanegowanym jednym z argumentów |
VPAVGBVPAVGW
|
średnia arytmetyczna wektorów |
VPCMPEQBVPCMPEQWVPCMPEQDVPCMPEQQ
|
testowanie relacji równości liczb całkowitych (8-, 16-, 32- i 64-bitowych) |
VPCMPGTBVPCMPGTWVPCMPGTDVPCMPGTQ
|
testowanie relacji większości liczb całkowitych ze znakiem (8-, 16-, 32- i 64-bitowych) |
VPINSRBVPINSRWVPINSRDVPINSRQ
|
|
VMPADDWDVMPADDUBSW
|
mnożenie wektorowe, następnie dodawanie sąsiednich elementów |
VPMAXSBVPMINSBVPMAXSWVPMINSWVPMAXSDVPMINSD
|
wybranie maksymalnych/minimalnych liczb całkowitych ze znakiem (z wektorów 8-, 16- i 32-bitowych liczb) |
VPMAXUSBVPMINUSBVPMAXUSWVPMINUSWVPMAXUSDVPMINUSD
|
wybranie maksymalnych/minimalnych liczb całkowitych bez znaku (z wektorów 8-, 16- i 32-bitowych liczb) |
VPMULHUWVPMULHW
|
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 |
VPMULLWVPMULLD
|
mnożenie liczb 16-bitowych/32-bitowych ze znakiem, zapis młodszego słowa wyniku |
VPMULDQVPMULUDQ
|
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 |
VPSHUFBVPHSHUFDVPHSHUFHWVPHSUFLW
|
permutacje wektorów |
VPSIGNBVPSIGNWVPSIGND
|
|
VPSQLLDQVPSRLDQVPSLLWVPSLLDVPSLLQVPSRAWVPSRADVPSRLWVPSRLDVPSRLQ
|
przesunięcie bitowe |
VPUNPCKLBWVPUNPCKLWDVPUNPCKLDQVPUNPCKLQDQVPUNPCKHBWVPUNPCKHWDVPUNPCKHDQVPUNPCKHQDQ
|
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 |
|---|---|
VBLENDPDVBLENDPSVBLENDVPDVBLENDVPS
|
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 |
|---|---|
VCVTSD2SIVCVTTSD2SI
|
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 |
VCVTSS2SIVCTTSS2SI
|
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)].