SSE5
Streaming SIMD Extensions 5 (SSE5) – rozszerzenie listy rozkazów SIMD dostępnych w procesorach x86, zdefiniowane przez firmę AMD 30 sierpnia 2007 roku; pierwszym procesorem implementującym SSE5 będzie „Bulldozer” produkowany od 2011 roku[1]. Szczegóły na temat sposobu kodowania instrukcji zostały zrewidowane w maju 2009, ze względu na lepszą kompatybilność z zestawem instrukcji AVX autorstwa Intela.
SSE5 dodaje 82 nowe rozkazy: 30 działających na liczbach zmiennoprzecinkowych oraz 52 na liczbach całkowitych – w sumie SSE5 składa się ze 170 instrukcji, spośród których wiele zostało zaprojektowanych aby zwiększyć wydajność aplikacji jednowątkowych. Prawie wszystkie wykonują działania arytmetyczne i logiczne na wektorach, tj. mnożenie, dodawanie/odejmowanie lub oba naraz, a także przesunięcia lub obroty bitowe. Są również rozkazy pozwalające zaokrąglać liczby, pobierać część ułamkową, porównywać oraz przepisywać wybrane elementy wektorów.
Część instrukcji przyjmuje 3 argumenty wektorowe, z czego jeden jest argumentem docelowym, tj. do niego wpisywany jest wynik działania (rozwiązanie zapożyczone z architektury RISC). Takie rozwiązanie zwiększa średnią ilość instrukcji na cykl dostępną dla kodu x86[2]. Dotychczas praktycznie wszystkie instrukcje[3], nie tylko SSE, były dwuargumentowe, z czego jeden argument był równocześnie docelowy (nadpisywany) i dlatego w wielu przypadkach musiał zostać uprzednio zapamiętany – zaproponowane rozwiązanie eliminuje przynajmniej jedno przypisanie, co upraszcza i skraca kod programu, a także ma pozytywny wpływ na szybkość obliczeń.
Dzięki wprowadzeniu wieloargumentowych instrukcji możliwe stało się wygodne zrealizowanie instrukcji akumulujących wyniki mnożenia (wektorów lub skalarów liczb całkowitych, bądź zmiennoprzecinkowych) – rozkazy FxMADDxx
, FxMSUBxx
, PMACxxx
, PMADxxx
działają według schematu
SSE5 definiuje także nowy typ danych: 16-bitową liczbę zmiennoprzecinkową; na mantysę liczby przeznaczono 10 bitów, na wykładnik 5 bitów, a znak – jeden bit.
AMD twierdzi, że ich instrukcje SSE5 będą zapewniały bardzo duży wzrost wydajnościowy, zwłaszcza w systemach HPC (ang. High Performance Computing), przetwarzaniu multimediów oraz komputerowych systemach bezpieczeństwa. W tych ostatnich nastąpi 5-krotny przyrost wydajności przy szyfrowaniu AES (ang. Advanced Encryption Standard) i 30% wzrost przy przetwarzaniu dyskretnej transformaty kosinusowej (DCT) wykorzystywanej w strumieniach video[2].
Nieścisłość nazw
[edytuj | edytuj kod]Nazwa SSE5 (autorstwa AMD) może sugerować, że zestaw ten zawiera w sobie wszystkie instrukcje zestawu SSE4 (autorstwa Intela). W rzeczywistości tak nie jest, SSE5 nie jest wzbogaceniem SSE4 o nowe instrukcje, a jedynie konkurentem tego drugiego. Podobnie rdzenie procesorów Intela, starsze od Nehalema zawierają tylko część instrukcji SSE4, nazwaną SSE4.1. To stanowi dodatkowe komplikacje dla kompilatorów.
Rozkazy działające na liczbach zmiennoprzecinkowych
[edytuj | edytuj kod]Rozkazy działają na wektorach lub skalarach liczb pojedynczej precyzji (zwykle końcówka mnemonika PS
dla wektorów, SS
dla skalarów), bądź podwójnej precyzji (PD
dla wektorów, SD
dla skalarów).
Instrukcja | Działanie |
---|---|
COMPD COMPS
|
porównanie wektorów |
COMSD COMSS
|
porównanie skalarów |
CVTPH2PS CVTPS2PH
|
konwersja pomiędzy liczbami zmiennoprzecinkowymi 16-bitowymi i 32-bitowymi (pojedynczej precyzji) |
FMADDPD FMADDPS FMADDSD FMADDSS
|
rozkazy czteroargumentowe instr dest, src1, src2, src3 , wykonują:dest := src1 * src2 src3
|
FMSUBPD FMSUBPS FMSUBSD FMSUBSS
|
rozkazy czteroargumentowe wykonują: dest := src1 * src2 - src3
|
FNMADDPD FNMADDPS FNMADDSD FNMADDSS
|
rozkazy czteroargumentowe wykonują: dest := -(src1 * src2) src3
|
FNMSUBPD FNMSUBPS FNMSUBSD FNMSUBSS
|
rozkazy czteroargumentowe wykonują: dest := -(src1 * src2) - src3
|
PERMPD PERMPS
|
utworzenie wektorów z dwóch innych; istnieje możliwość wyboru na jakich pozycjach w wektorze wynikowym mają pojawić się elementy z wektorów źródłowych; można również ustalić jakie dodatkowe działania mają zostać przeprowadzone na każdym z wynikowych elementów:
|
FRCZPD FRCZPS FRCZSD FRCZSS
|
obliczenie części ułamkowej |
ROUNDPD ROUNDPS ROUNDSD ROUNDSS
|
zaokrąglenie liczb |
Rozkazy działające na liczbach całkowitych
[edytuj | edytuj kod]Rozkazy działają na wektorach liczb całkowitych 8-bitowych (końcówka mnemonika B
dla liczb ze znakiem, UB
bez znaku), 16-bitowych (W
/UW
), 32-bitowych (D
/UD
) i 64-bitowych (Q
/UQ
).
Instrukcja | Działanie |
---|---|
PCMOV
|
warunkowe przesłanie, realizuje działanie operatora warunkowego |
PCOMB PCOMW PCOMD PCOMQ
|
porównanie liczb ze znakiem; dostępne relacje:
|
PCOMUB PCOMUW PCOMUD PCOMUQ
|
porównanie liczb bez znaku |
PHADDBD PHADDBW PHADDBQ PHADDWD PHADDWQ PHADDDQ
|
dodawanie dwóch lub czterech sąsiednich elementów (liczby ze znakiem) |
PHADDUBD PHADDUBQ PHADDUBW PHADDUDQ PHADDUWD PHADDUWQ
|
dodawanie dwóch lub czterech sąsiednich elementów (liczby bez znaku) |
PHSUBBW PHSUBDQ PHSUBWD
|
odejmowanie dwóch lub czterech sąsiednich elementów (liczby ze znakiem); dla czterech liczb wykonywane jest działanie |
PMACSDD PMACSDQH PMACSDQL PMACSWD PMACSWW
|
rozkazy czteroargumentowe instr dest, src1, src2, src3 wykonujące działanie dest := (src1 * src2) src3 – wyniki są wprost kopiowane
|
PMACSSDD PMACSSDQH PMACSSDQL PMACSSWD PMACSSWW
|
rozkazy czteroargumentowe instr dest, src1, src2, src3 wykonujące działanie dest := (src1 * src2) src3 – wyniki są nasycane
|
PMADCSWD
|
podobne do ww, z tym że przed po przemnożeniu wektorów, sąsiednie elementy wyniku pośredniego src1 * src2 są do siebie dodawane, i dopiero ten wektor jest dodawany do src3
|
PMADCSSWD
|
wykonuje to samo działanie, co PMADCSWD , z tym, że wyniki są nasycane
|
PPERM
|
działanie rozkazu jest analogiczne do PERMPS /PERMPD , z tą różnicą, że operuje na poziomie bajtów; możliwe są również modyfikacje wynikowych bajtów: negacja, negacja bitowa, negacja bitowa liczby przeciwnej, ustawienie wszystkich bitów na: 0, 1, najstarszy bit lub zanegowany najstarszy bit
|
PROTB PROTW PROTD PROTQ
|
obrót bitowy |
PSHAB PSHAW PSHAD PSHAQ
|
przesunięcie arytmetyczne w prawo |
PSHLB PSHLW PSHLD PSHLQ
|
przesunięcia w lewo |
PTEST
|
testowanie masek bitowych; realizuje to samo działanie co rozkaz PTEST zdefiniowany w SSE4
|
Zobacz też
[edytuj | edytuj kod]Przypisy
[edytuj | edytuj kod]- ↑ Joel Hruska: AMD Fusion now pushed back to 2011. Ars Technica, 14 listopada 2008. (ang.).
- ↑ a b Ashlee Vance: AMD plots single thread boost with x86 extensions. The Register, 30 sierpnia 2007. (ang.).
- ↑ Spośród rozkazów CPU jedynie rozkaz
imul
posiada wersję trójargumentową, wśród rozkazów SSE zaledwie kilka.
Bibliografia
[edytuj | edytuj kod]- AMD64 Technology, 128-Bit SSE5 Instruction Set (43479), sierpień 2007