|
|
SSE2
Streaming SIMD Extensions 2 (SSE2) - zestaw instrukcji SIMD, rozszerzający istniejący SSE. Nowe cechy:
Technologia ta została wprowadzona w procesorach rodziny Pentium 4 oraz Athlon 64.
[edytuj] Typy danych
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 |
[edytuj] Mnemoniki rozkazów
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.
[edytuj] Działania zmiennoprzecinkowe
[edytuj] Działania arytmetyczne
- 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)
[edytuj] Działania logiczne
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),
[edytuj] Porównanie
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 i CMPSD odpowiadają rozkazy SSE CMPPS i CMPSS;
- rozkazom SSE2 COMISD i UCOMISD odpowiadają rozkazy SSE COMISS i UCOMISS.
[edytuj] Rozmieszczanie elementów w wektorach
- SHUFPD
- UNPCKLPD, UNPCKHPD
[edytuj] Konwersje między liczbami zmiennoprzecinkowymi i całkowitymi
- liczby zmiennoprzecinkowe podwójnej precyzji:
- konwersje wektorowe:
- CVTPD2PI, CVTTPD2PI - liczby zmiennoprzecinkowe na 32-bitowe liczby całkowite
- CVTPD2PQ, CVTTPD2PQ - liczby zmiennoprzecinkowe na 64-bitowe liczby całkowite
- CVTPI2PD - 32-bitowe liczby całkowite na liczby zmiennoprzecinkowe
- CVTDQ2PD - 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ą
- 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ą
[edytuj] Konwersje między liczbami zmiennoprzecinkowymi pojedynczej i podwójnej precyzji
- 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ę
[edytuj] Rozkazy całkowitoliczbowe
- PMULUDQ - mnożenie 32-bitowych liczb bez znaku, wyniki są 64-bitowe
- PADDQ - dodawanie 64-bitowych liczb ze znakiem
- PSUBQ - odejmowanie 64-bitowych liczb ze znakiem
- PSHUFLW, PSHUFHW - zmiana kolejności elementów 16-bitowych, odpowiednio, w dolnej i górnej połówce 128-bitowego wektora
- PSHUFD - zmiana kolejności elementów 32-bitowych
- PSLLDQ, PSLRDQ - przesunięcia bitowe w lewo i prawo elementów 64-bitowych
- PUNPCKHQDQ, PUNPCKLQDQ
[edytuj] Kontrola pamięci podręcznej i spójności pamięci
- CLFLUSH - zapisuje i unieważnia wskazaną linijkę cache na wszystkich poziomach pamięci podręcznej
- LFENCE - uszeregowanie operacji odczytu pamięci
- MFENCE - uszeregowanie operacji odczytu i zapisu pamięci
- PAUSE - 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 XMM
- MOVNTPD, 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 (czyli EAX, EBX itd.)
[edytuj] Przesyłanie danych
[edytuj] Wektory liczb zmiennoprzecinkowe
- MOVAPD
- MOVUPD
- MOVHPD, MOVLPD
- MOVSD
- MOVMSKPD
[edytuj] Wektory liczb całkowitych
[edytuj] MXCSR - rejestr kontrolny/statusu
W SSE2 dodaną jedna 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.
[edytuj] Podpowiedzi dla systemu przewidywania skoków
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]
[edytuj] Procesory obsługujące SSE2
[edytuj] Znane procesory nie obsługujące SSE2
Przypisy
[edytuj] Zobacz też
|