SSE5
Szablon:Dopracować 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
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
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 |
|---|---|
COMPDCOMPS
|
porównanie wektorów |
COMSDCOMSS
|
porównanie skalarów |
CVTPH2PSCVTPS2PH
|
konwersja pomiędzy liczbami zmiennoprzecinkowymi 16-bitowymi i 32-bitowymi (pojedynczej precyzji) |
FMADDPDFMADDPSFMADDSDFMADDSS
|
rozkazy czteroargumentowe instr dest, src1, src2, src3, wykonują:dest := src1 * src2 + src3
|
FMSUBPDFMSUBPSFMSUBSDFMSUBSS
|
rozkazy czteroargumentowe wykonują: dest := src1 * src2 - src3
|
FNMADDPDFNMADDPSFNMADDSDFNMADDSS
|
rozkazy czteroargumentowe wykonują: dest := -(src1 * src2) + src3
|
FNMSUBPDFNMSUBPSFNMSUBSDFNMSUBSS
|
rozkazy czteroargumentowe wykonują: dest := -(src1 * src2) - src3
|
PERMPDPERMPS
|
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:
|
FRCZPDFRCZPSFRCZSDFRCZSS
|
obliczenie części ułamkowej |
ROUNDPDROUNDPSROUNDSDROUNDSS
|
zaokrąglenie liczb |
Rozkazy działające na liczbach całkowitych
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 |
PCOMBPCOMWPCOMDPCOMQ
|
porównanie liczb ze znakiem; dostępne relacje:
|
PCOMUBPCOMUWPCOMUDPCOMUQ
|
porównanie liczb bez znaku |
PHADDBDPHADDBWPHADDBQPHADDWDPHADDWQPHADDDQ
|
dodawanie dwóch lub czterech sąsiednich elementów (liczby ze znakiem) |
PHADDUBDPHADDUBQPHADDUBWPHADDUDQPHADDUWDPHADDUWQ
|
dodawanie dwóch lub czterech sąsiednich elementów (liczby bez znaku) |
PHSUBBWPHSUBDQPHSUBWD
|
odejmowanie dwóch lub czterech sąsiednich elementów (liczby ze znakiem); dla czterech liczb wykonywane jest działanie |
PMACSDDPMACSDQHPMACSDQLPMACSWDPMACSWW
|
rozkazy czteroargumentowe instr dest, src1, src2, src3 wykonujące działanie dest := (src1 * src2) + src3 – wyniki są wprost kopiowane
|
PMACSSDDPMACSSDQHPMACSSDQLPMACSSWDPMACSSWW
|
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
|
PROTBPROTWPROTDPROTQ
|
obrót bitowy |
PSHABPSHAWPSHADPSHAQ
|
przesunięcie arytmetyczne w prawo |
PSHLBPSHLWPSHLDPSHLQ
|
przesunięcia w lewo |
PTEST
|
testowanie masek bitowych; realizuje to samo działanie co rozkaz PTEST zdefiniowany w SSE4
|
Zobacz też
Przypisy
Bibliografia
- AMD64 Technology, 128-Bit SSE5 Instruction Set (43479), sierpień 2007
- ↑ Szablon:Cytuj stronę
- ↑ 2,0 2,1 Szablon:Cytuj stronę
- ↑ Spośród rozkazów CPU jedynie rozkaz
imulposiada wersję trójargumentową, wśród rozkazów SSE zaledwie kilka.