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:

  1. 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.
  2. Dodano kilka rozkazów działających wyłącznie na rejestrach YMM (19 rozkazów).
  3. Dodane czteroargumentowe rozkazy akumulujące wyniki mnożenia wektorów liczb zmiennoprzecinkowych, to znaczy wykonujące obliczenia według schematu (12 rozkazów).
  4. Dodane specjalizowane instrukcje wspomagające szyfrowanie AES (6 rozkazów).
  5. 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).
  6. 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
 

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 × 32 bity – wektor 8 liczb zmiennoprzecinkowych pojedynczej precyzji
  • 4 × 64 bity – wektor 4 liczb zmiennoprzecinkowych podwójnej precyzji

Mnemoniki instrukcji

edytuj

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

Instrukcje AVX działają na rejestrach YMM, niektóre również na XMM.

Nowe rozkazy

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 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

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
  • AESDEC, AESDECLAST – deszyfrowanie
  • AESENC, AESENCLAST – szyfrowanie
  • AESIMC
  • AESKEYGENASSIST

Rozszerzone rozkazy 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

Rozkazy 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 × 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
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

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

Zobacz też

edytuj

Przypisy

edytuj
  1. Westmere – wykonanie i nowe instrukcje :: PCLab.pl [online], pclab.pl [dostęp 2017-11-21] (pol.).

Bibliografia

edytuj
  • Advanced Vector Extensions Programming Reference (dokument 319433-002), Intel, marzec 2008

Linki zewnętrzne

edytuj