[go: up one dir, main page]

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.

Typy danych

edytuj

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:

  1. packed (równoległe) — wykonując równocześnie dwa niezależne działania zmiennoprzecinkowe na odpowiadających sobie elementach wektorów;
  2. 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
Zobacz więcej w artykule Streaming SIMD Extensions, w sekcji 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.

Działania zmiennoprzecinkowe

edytuj

Dział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

edytuj

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
Zobacz więcej w artykule Streaming SIMD Extensions, w sekcji Porównania.

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.

Rozmieszczanie elementów w wektorach

edytuj
  • SHUFPD
  • 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ł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ą

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

edytuj
  • 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, PSRLDQ - przesunięcia bitowe w lewo i prawo elementów 64-bitowych
  • PUNPCKHQDQ, PUNPCKLQDQ

Kontrola pamięci podręcznej i spójności pamięci

edytuj
  • MFENCE, LFENCE - uszeregowanie operacji odczytu pamięci i zapisu pamięci/wyłącznie odczytu - patrz bariera pamięci
  • CLFLUSH - zapisuje i unieważnia wskazaną linijkę cache na wszystkich poziomach pamięci podręcznej
  • 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.)

Przesyłanie danych

edytuj

Wektory liczb zmiennoprzecinkowe

edytuj
  • MOVAPD
  • MOVUPD
  • MOVHPD, MOVLPD
  • MOVSD
  • MOVMSKPD

Wektory liczb całkowitych

edytuj
  • MOVDQA
  • MOVQ2DQ, MOVDQ2Q

MXCSR - rejestr kontrolny/statusu

edytuj
Zobacz więcej w artykule Streaming SIMD Extensions, w sekcji MXCSR - rejestr kontrolny/statusu.

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

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

Znane procesory nieobsługujące SSE2

edytuj

Przypisy

edytuj
  1. H. J. Lu - PATCH: Disable branch hints on P4 [online], gcc.gnu.org [dostęp 2017-11-26].

Zobacz też

edytuj