SSE2
Streaming SIMD Extensions 2 (SSE2) – zestaw instrukcji SIMD, rozszerzający istniejący SSE. Nowe cechy:
- działania wektorowe i skalarne na liczbach zmiennoprzecinkowych podwójnej precyzji;
- umożliwienie wykonywania działań całkowitoliczbowych na 128-bitowych rejestrach XMM - dotychczas były to możliwe tylko dla 64-bitowych rejestrów MMX;
- większa kontrola nad pamięcią podręczną.
Technologia ta została wprowadzona w procesorach rodziny Pentium 4 oraz Athlon 64.
Typy danych
edytujSSE2 wykorzystuje typy danych zdefiniowane w MMX i SSE, definiuje także kilka nowych typów danych: w większości wektorów o określonych rozmiarach.
Typy zmiennoprzecinkowe:
- wektor 2 liczb zmiennoprzecinkowych podwójnej precyzji (2 x 64 bity)
- wektor 4 liczb zmiennoprzecinkowych pojedynczej precyzji (4 x 32 bity; wprowadzony w SSE)
Typy całkowite (rozszerzenia typów MMX):
- wektor 16 bajtów - packed byte (16 x 8 bitów)
- wektor 8 słów - packed word (8 x 16 bitów)
- wektor 4 podwójnych słów - packed duble words (4 x 32 bity)
- wektor 2 poczwórnych słów - packed quad words (2 x 64 bity)
- liczba 128-bitowa - long quadword
Analogicznie jak w SSE, rozkazy SSE2 mogą wykonywać działania arytmetyczne na wektorach liczb zmiennoprzecinkowych podwójnej precyzji na dwa sposoby:
- packed (równoległe) — wykonując równocześnie dwa niezależne działania zmiennoprzecinkowe na odpowiadających sobie elementach wektorów;
- scalar (skalarne) — wykonując działanie tylko na pierwszych elementach wektorów.
Rozmiar słowa [bity] |
Rozmiar elementu [bity] |
Liczba elementów wektora | Uwagi |
---|---|---|---|
Liczby zmiennoprzecinkowe | |||
128 | 64 | 2 | SSE2, liczby podwójnej precyzji |
128 | 32 | 4 | SSE, liczby pojedynczej precyzji |
Liczby całkowite (ze znakiem lub bez) | |||
128 | 128 | 1 | SSE2, całe słowo |
128 | 64 | 2 | SSE2, packed quad word |
128 | 32 | 4 | SSE2, packed double word |
128 | 16 | 8 | SSE2, packed word |
128 | 8 | 16 | SSE2, packed byte |
64 | 64 | 1 | MMX, quad word |
64 | 32 | 2 | MMX, packed double word |
64 | 16 | 4 | MMX, packed word |
64 | 8 | 8 | MMX, packed byte |
Mnemoniki rozkazów
edytujTak jak w SSE, również w SSE2 sufiksy mnemoników określają typy danych, na jakich działają określone rozkazy; oprócz tych zdefiniowanych w MMX i SSE pojawiły się nowe dla liczb zmiennoprzecinkowych podwójnej precyzji:
PD
- wektory,SD
- skalary.
Działania zmiennoprzecinkowe
edytujDziałania arytmetyczne
edytuj- dodawanie (
ADDPD
,ADDSD
) - odejmowanie (
SUBPD
,SUBSD
) - dzielenie (
DIVPD
,DIVSD
) - mnożenie (
MULPD
,MULSD
) - pierwiastek kwadratowy (
SQRTPD
,SQRTSD
) - wartość maksymalna (
MAXPD
,MAXSD
) - wartość minimalna (
MINPD
,MINSD
)
Działania logiczne
edytujWykonywane są na poziomie bitów, a nie liczb:
- suma (
ORPD
), - iloczyn (
ANDPD
), - iloczyn negacji (
ANDNPD
) - jeden z argumentów jest negowany przed obliczeniem iloczynu, - różnica symetryczna (
XORPD
),
Porównanie
edytujRozkazy porównania SSE2 działają w taki sam sposób jak SSE, jedna różnica to oczywiście rozmiary elementów wektorów:
- rozkazom SSE2
CMPPD
iCMPSD
odpowiadają rozkazy SSECMPPS
iCMPSS
; - rozkazom SSE2
COMISD
iUCOMISD
odpowiadają rozkazy SSECOMISS
iUCOMISS
.
Rozmieszczanie elementów w wektorach
edytujSHUFPD
UNPCKLPD
,UNPCKHPD
Konwersje między liczbami zmiennoprzecinkowymi i całkowitymi
edytuj- liczby zmiennoprzecinkowe podwójnej precyzji:
- konwersje wektorowe:
CVTPD2PI
,CVTTPD2PI
- liczby zmiennoprzecinkowe na 32-bitowe liczby całkowiteCVTPD2PQ
,CVTTPD2PQ
- liczby zmiennoprzecinkowe na 64-bitowe liczby całkowiteCVTPI2PD
- 32-bitowe liczby całkowite na liczby zmiennoprzecinkoweCVTDQ2PD
- 64-bitowe liczby całkowite na liczby zmiennoprzecinkowe
- konwersje skalarne:
CVTSD2SI
,CVTTSD2SI
- liczba zmiennoprzecinkowa na 32-bitową liczbę całkowitąCVTSI2SD
- 32-bitowa liczba całkowita na liczbę zmiennoprzecinkową
- konwersje wektorowe:
- liczby zmiennoprzecinkowe pojedynczej precyzji:
- konwersje wektorowe:
CVTPS2DQ
,CVTTPS2DQ
- liczby zmiennoprzecinkowe na 64-bitowe liczby całkowite
- konwersja skalarna:
CVTDQ2PS
- 64-bitowa liczba całkowita na liczbę zmiennoprzecinkową
- konwersje wektorowe:
Konwersje między liczbami zmiennoprzecinkowymi pojedynczej i podwójnej precyzji
edytuj- konwersje wektorów (po dwa elementy):
CVTPS2PD
- z pojedynczej na podwójną precyzjęCVTPD2PS
- z podwójnej na pojedynczą precyzję
- konwersje skalarów:
CVTSS2SD
- z pojedynczej na podwójną precyzjęCVTPS2SS
- z podwójnej na pojedynczą precyzję
Rozkazy całkowitoliczbowe
edytujPMULUDQ
- mnożenie 32-bitowych liczb bez znaku, wyniki są 64-bitowePADDQ
- dodawanie 64-bitowych liczb ze znakiemPSUBQ
- odejmowanie 64-bitowych liczb ze znakiemPSHUFLW
,PSHUFHW
- zmiana kolejności elementów 16-bitowych, odpowiednio, w dolnej i górnej połówce 128-bitowego wektoraPSHUFD
- zmiana kolejności elementów 32-bitowychPSLLDQ
,PSRLDQ
- przesunięcia bitowe w lewo i prawo elementów 64-bitowychPUNPCKHQDQ
,PUNPCKLQDQ
Kontrola pamięci podręcznej i spójności pamięci
edytujMFENCE
,LFENCE
- uszeregowanie operacji odczytu pamięci i zapisu pamięci/wyłącznie odczytu - patrz bariera pamięciCLFLUSH
- zapisuje i unieważnia wskazaną linijkę cache na wszystkich poziomach pamięci podręcznejPAUSE
- jest podpowiedzią (ang. hint) dla procesora, która przyspiesza wyjście z pętli aktywnego oczekiwania (ang. spin-wait loop)- zapisy do pamięci z podpowiedzią (hint) o nietymczasowym charakterze danych (tj. dane nie będą w najbliższym czasie potrzebne):
MASKMOVDQU
- uaktualnienie wybranych bajtów z rejestru XMMMOVNTPD
,MOVNTDQ
- zapis rejestru XMM (tj. dwóch słów 64-bitowych, przez pierwszy rozkaz traktowanych jako liczby zmiennoprzecinkowe, w drugim - jako całkowite)MOVNTI
- zapisanie rejestru ogólnego przeznaczenia (czyliEAX
,EBX
itd.)
Przesyłanie danych
edytujWektory liczb zmiennoprzecinkowe
edytujMOVAPD
MOVUPD
MOVHPD
,MOVLPD
MOVSD
MOVMSKPD
Wektory liczb całkowitych
edytujMOVDQA
MOVQ2DQ
,MOVDQ2Q
MXCSR - rejestr kontrolny/statusu
edytujW SSE2 dodano jedną flagę kontrolującą obliczenia zmiennoprzecinkowe:
- ang. denormals-are-zero - jej ustawienie powoduje zamienianie liczb nieznormalizowanych na zero (jest to działanie niestandardowe); nieznormalizowane liczby zmiennoprzecinkowe, to bardzo małe liczby, w których wykładnik nie mieści się w dostępnym zwykle zakresie, lecz dzięki wyzerowaniu najstarszego bitu mantysy (tj. rezygnacji ze znormalizowanej mantysy) liczba może zostać zapisana.
Podpowiedzi dla systemu przewidywania skoków
edytujPodsystem przewidywania skoków posiada wbudowane reguły statycznego przewidywania skoków warunkowych - np. jeśli adres docelowy skoku jest ujemny (skok wstecz, jak w pętlach) to przyjmuje się, że skok nastąpi. W SSE2 wprowadzono podpowiedzi (ang. branch hint), które dla wskazanych instrukcji skoku nadpisują domyślne reguły, pozwalając wskazać bardziej prawdopodobny przepływ sterowania w programie. Podpowiedzi te mają formę przedrostków dla kodów rozkazu skoku, nie są odrębnymi instrukcjami.
Mimo że w symulacjach rozwiązanie to wyglądało bardzo obiecująco, w rzeczywistych programach nie zanotowano wzrostu wydajności[1].
Procesory obsługujące SSE2
edytujZnane procesory nieobsługujące SSE2
edytujPrzypisy
edytuj- ↑ H. J. Lu - PATCH: Disable branch hints on P4 [online], gcc.gnu.org [dostęp 2017-11-26] .