SSE - Streaming SIMD Extension
SSE
SSE = Streaming SIMD Extension
 
SIMD = Single Instruction Multiple Data

SSE to dodatkowe rozkazy, które pozwalają znacznie szybciej wykonywać obliczenia matematyczne, szczególnie te wykorzystywane w dziedzinie multimediów, co przekłada się na zwiększenie efektywności działania m.in. gier komputerowych, programów graficznych, muzycznych, kodowania filmów i muzyki.

Materiały pochodzą z polskiej Wikipedii i serwisu Ważniak

Rozszerzenia SSE

Typy danych
  • Typy zmiennoprzecinkowe:
  • Operacje

    Rozkazy SSE mogą wykonywać działania arytmetyczne na wektorach liczb zmiennoprzecinkowych 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.

    Przykład – mnożenie dwóch wektorów (rozkazem MULPS xmm0, xmm1):

    +-------+-------+-------+-------+
    |   x3  |   x2  |   x1  |   x0  | xmm0
    +-------+-------+-------+-------+
        *       *       *       *
    +-------+-------+-------+-------+
    |   y3  |   y2  |   y1  |   y0  | xmm1
    +-------+-------+-------+-------+
        =       =       =       =
    +-------+-------+-------+-------+
    | x3*y3 | x2*y2 | x1*y1 | x0*y0 | xmm0
    +-------+-------+-------+-------+

    Przykład – mnożenie pierwszych elementów wektorów (rozkazem MULSS xmm0, xmm1 ):

    +-------+-------+-------+-------+
    |   x3  |   x2  |   x1  |   x0  | xmm0
    +-------+-------+-------+-------+
                                *
    +-------+-------+-------+-------+
    |   y3  |   y2  |   y1  |   y0  | xmm1
    +-------+-------+-------+-------+
        =       =       =       =
    +-------+-------+-------+-------+
    |   x3  |   x2  |   x1  | x0*y0 | xmm0
    +-------+-------+-------+-------+

    Przykład – mnożenie dwóch wektorów (rozkazem MULPD xmm0, xmm1):

    +-------+-------+-------+-------+
    |      x1        |      x0      | xmm0
    +-------+-------+-------+-------+
        *       *       *       *
    +-------+-------+-------+-------+
    |       y1      |       y0      | xmm1
    +-------+-------+-------+-------+
        =       =       =       =
    +-------+-------+-------+-------+
    |     x1*y1     |     x0*y0     | xmm0
    +-------+-------+-------+-------+
    Przesyłanie danych do/z rejestrów XMM
    Działania

    Dla nazw instrukcji sufiks nazwy określa typ:

    Działania arytmetyczne
    Porównania modyfikujące rejest flag procesora
    Porównania modyfikujące rejest SSE

    Dla tych elementów, dla których wynik porównania jest prawdziwy wszystkie bity w rejestrze docelowym są ustawiane, gdy nieprawdziwy – zerowane. Ten sposób porównania może być zastosowany zarówno dla wektorów (rozkaz CMPPS) jak i skalarów (rozkaz CMPSS)

    Przykład testowania, czy liczby są różne (rozkaz CMPNEQPS xmm0, xmm1[1]):

     +---------+---------+---------+---------+
     |   1.0   |  -5.3   |   16.5  |   17.2  | xmm0
     +---------+---------+---------+---------+
          ≠         ≠         ≠         ≠
     +---------+---------+---------+---------+
     |   7.0   |  -5.3   |   16.5  |   17.3  | xmm1
     +---------+---------+---------+---------+
          =         =         =         =
     +---------+---------+---------+---------+
     |111..1111|000..0000|000..0000|111..1111| xmm0
     +---------+---------+---------+---------+
    
    Rejestr MXCSR
    1. Ustawienia operacji zmiennoprzecinkowych:
      • sposób zaokrąglanie wyniku:
        • do najbliższej liczby całkowitej
        • zaokrąglanie w stronę plus nieskończoności
        • zaokrąglanie w stronę minus nieskończoności
        • ucinanie (zaokrąglanie w stronę zera)
      • flaga flush-to-zero – jeśli ustawiona w przypadku niedomiaru zamiast zgłaszania wyjątku, zapisywana jest liczba zero; działanie nie jest zgodne ze standardem, ale powoduje przyspieszenie programów
    2. Maski włączające zgłaszanie wyjątków przy błędach; wykrywane błędy:
      • niewłaściwe argumenty (np. pierwiastkowanie ujemnej liczby),
      • dzielenie przez zero,
      • nadmiar (wynik jest zbyt duży),
      • niedomiar (wynikiem jest liczba nie znormalizowana),
      • niedokładny wynik (wynik nie może być dokładnie reprezentowany).
    3. Flagi wskazujące rodzaj błędu – ustawiane automatycznie przez procesor, niezależnie od tego, czy dany błąd jest zgłaszany, czy nie; muszą zostać wyzerowane programowo (zwykle w procedurze obsługi wyjątków SSE).
    Iloczyn dwóch tablic

    Dane nie wyrównane

    Kod asemblerowy
    Kod C

    Dane wyrównane

    Kod asemblerowy
    Kod C

    Porównanie szybkości

    Funkcje liczące iloczyn

    SSE_u - SSE dane nie wyrównane
    SSE_a - SSE dane wyrównane
    FPU - kooprocesor numeryczny
    C++ - implementacja w C++ używa SSE ale nie wektorowo.
    C++(-O2) - implementacja w C++ z optymalizacją używa SSE wektorowo.

    Test 1: duże tablice
    Test 3: małe tablice

    Wyniki Pentium Core 2 Duo

    SSE_uSSE_aFPUC++C++(-O2)
    Test 128.528.029.355.327.7
    Test 20.630.311.035.050.31

    Wyniki Pentium Core i7

    SSE_uSSE_aFPUC++C++(-O2)
    Test 18.048.028.0430.448.04
    Test 21.343
    (1.557)
    1.2435.22129.9234.790

    Arytmetyka stałopozycyjna z nasyceniem

    zrodlo Ważniak

    Operacje warunkowe

    Rozwiązanie:

    zrodlo Ważniak

    Operacje warunkowe - przykład
    section .data 
    const40  'MMMMMMMMMMMMMMMM' 
    star     '****************' 
     
    section .text
     
    ; if(x <= 'M') x = '*';
     
    sse_if:
        movdqu  xmm0, [rdi]       ; MOVe Double Quadword [Aligned]
        movdqu  xmm1, [const40]  ; wektor stałych 40
        movdqa  xmm2, xmm0       ; 
     
        pcmpgtb xmm2, xmm1       ; xmm2  zawiera maske
     
        movdqa  xmm1, [star]
     
        pand    xmm0, xmm2       ; zerujemy znaki mniejsze niż M      
        pandn   xmm2, xmm1       ; ustawiamy tam gwiazdki
        por     xmm0, xmm2       ; sumujemy 
     
        movdqu  [rdi], xmm0
     
        ret

    Przykład

    Kod asemblerowy
    Kod C

    Dodawanie poziome

    zrodlo Ważniak

    zrodlo Ważniak

    Mieszane dodawanie i odejmowanie

    zrodlo Ważniak

    zrodlo Ważniak


    Tomasz Kapela, Kraków 2011-2020