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
[edytuj | edytuj kod]SSE2 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
[edytuj | edytuj kod]Tak 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
[edytuj | edytuj kod]Działania arytmetyczne
[edytuj | edytuj kod]- 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
[edytuj | edytuj kod]Wykonywane 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
[edytuj | edytuj kod]Rozkazy 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
[edytuj | edytuj kod]SHUFPD
UNPCKLPD
,UNPCKHPD
Konwersje między liczbami zmiennoprzecinkowymi i całkowitymi
[edytuj | edytuj kod]- 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 | edytuj kod]- 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
[edytuj | edytuj kod]PMULUDQ
- 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
[edytuj | edytuj kod]MFENCE
,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
[edytuj | edytuj kod]Wektory liczb zmiennoprzecinkowe
[edytuj | edytuj kod]MOVAPD
MOVUPD
MOVHPD
,MOVLPD
MOVSD
MOVMSKPD
Wektory liczb całkowitych
[edytuj | edytuj kod]MOVDQA
MOVQ2DQ
,MOVDQ2Q
MXCSR - rejestr kontrolny/statusu
[edytuj | edytuj kod]W 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
[edytuj | edytuj kod]Podsystem 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
[edytuj | edytuj kod]- AMD Opteron
- AMD Athlon 64
- AMD Sempron 64 (Wersje 64-bit / Socket 754)
- AMD Turion 64
- Intel Pentium 4
- Intel Pentium D
- Intel Pentium EE
- Intel Pentium M
- Intel Celeron
- Intel Celeron D
- Transmeta Efficeon
Znane procesory nieobsługujące SSE2
[edytuj | edytuj kod]- AMD Athlon
- AMD Athlon XP
- AMD Sempron
- Intel Pentium III
- Intel Itanium
- Intel Itanium 2
- Transmeta Crusoe
Przypisy
[edytuj | edytuj kod]- ↑ H. J. Lu - PATCH: Disable branch hints on P4 [online], gcc.gnu.org [dostęp 2017-11-26] .