SSE2

SSE2 ( Streaming SIMD Extensions 2 ) jest jednym z dodatkowych zestawów instrukcji procesora Intel SIMD (Single Instruction, Multiple Data), wprowadzonych po raz pierwszy przez firmę Intel wraz z początkową wersją Pentium 4 w 2000 r. Rozszerza wcześniejszy zestaw instrukcji SSE i jest przeznaczony aby całkowicie zastąpić MMX . Intel rozszerzył SSE2, aby stworzyć SSE3 w 2004 roku. SSE2 dodał 144 nowych instrukcji do SSE, która ma 70 instrukcji. Konkurencyjny producent chipów AMD dodał obsługę SSE2 wraz z wprowadzeniem w 2003 roku serii 64-bitowych procesorów AMD64 Opteron i Athlon 64 .

Cechy

Większość instrukcji SSE2 implementuje operacje na wektorach całkowitych, które można również znaleźć w MMX. Zamiast rejestrów MMX zastosowano w nich rejestry XMM, które są szersze i pozwalają na znaczną poprawę wydajności w specjalistycznych aplikacjach. Kolejną zaletą zastąpienia MMX przez SSE2 jest uniknięcie kary za przełączanie trybu za wydawanie x87 obecnych w MMX, ponieważ dzieli on przestrzeń rejestrów z FPU x87. SSE2 uzupełnia również operacje wektorów zmiennoprzecinkowych zestawu instrukcji SSE, dodając obsługę typu danych podwójnej precyzji.

Inne rozszerzenia SSE2 obejmują zestaw instrukcji kontroli pamięci podręcznej, których głównym celem jest zminimalizowanie zanieczyszczenia pamięci podręcznej podczas przetwarzania nieskończonych strumieni informacji, oraz wyrafinowane uzupełnienie instrukcji konwersji formatu liczbowego.

Implementacja SSE2 firmy AMD na platformie AMD64 ( x86-64 ) zawiera dodatkowe osiem rejestrów, podwajając całkowitą liczbę do 16 (od XMM0 do XMM15). Te dodatkowe rejestry są widoczne tylko podczas pracy w trybie 64-bitowym. Intel przyjął te dodatkowe rejestry w ramach obsługi architektury x86-64 (lub w żargonie Intela „Intel 64”) w 2004 roku.

Różnice między FPU x87 a SSE2

Instrukcje FPU (x87) zapewniają wyższą precyzję, obliczając wyniki pośrednie z domyślnie 80-bitową precyzją, aby zminimalizować błąd zaokrąglenia w algorytmach niestabilnych numerycznie (patrz uzasadnienie projektu IEEE 754 i zawarte w nim odniesienia). Jednak jednostka FPU x87 jest tylko jednostką skalarną, podczas gdy SSE2 może przetwarzać równolegle mały wektor operandów.

Jeśli kod zaprojektowany dla x87 zostanie przeniesiony na zmiennoprzecinkowy SSE2 o podwójnej precyzji o niższej precyzji, pewne kombinacje operacji matematycznych lub wejściowych zestawów danych mogą spowodować mierzalne odchylenie liczbowe, co może stanowić problem w powtarzalnych obliczeniach naukowych, np. jeśli wyniki obliczeń muszą być porównywane z wynikami wygenerowanymi z innej architektury maszyny. Powiązanym problemem jest to, że historycznie standardy językowe i kompilatory były niespójne w obsłudze 80-bitowych rejestrów x87 implementujących zmienne o podwójnej precyzji, w porównaniu z formatami podwójnej i pojedynczej precyzji zaimplementowanymi w SSE2: zaokrąglanie wartości pośrednich o rozszerzonej precyzji do zmiennych podwójnej precyzji nie było w pełni zdefiniowane i zależało od szczegółów implementacji, takich jak rozlewanie rejestrów do pamięci.

Różnice między MMX a SSE2

SSE2 rozszerza instrukcje MMX do działania na rejestrach XMM. Dzięki temu możliwa jest konwersja całego istniejącego kodu MMX na odpowiednik SSE2. Ponieważ rejestr SSE2 jest dwa razy dłuższy niż rejestr MMX, może zajść potrzeba zmiany liczników pętli i dostępu do pamięci, aby to uwzględnić. Jednak dostępne są 8-bajtowe ładowanie i zapisywanie do XMM, więc nie jest to bezwzględnie wymagane.

Chociaż jedna instrukcja SSE2 może operować na dwukrotnie większej ilości danych niż instrukcja MMX, wydajność może nie wzrosnąć znacząco. Dwa główne powody to: dostęp do danych SSE2 w pamięci niewyrównanej do 16-bajtowej granicy może wiązać się ze znacznymi kosztami, a przepustowość instrukcji SSE2 w starszych implementacjach x86 była o połowę mniejsza niż w przypadku instrukcji MMX. Intel rozwiązał pierwszy problem, dodając instrukcję w SSE3 w celu zmniejszenia narzutu związanego z dostępem do niewyrównanych danych i poprawą ogólnej wydajności niewyrównanych obciążeń oraz ostatnim problemem poprzez rozszerzenie silnika wykonawczego w ich mikroarchitekturze Core w produktach Core 2 Duo i nowszych.

Ponieważ pliki rejestrów MMX i x87 są aliasami, użycie MMX uniemożliwi działanie instrukcji x87 zgodnie z oczekiwaniami. Po użyciu MMX programista musi użyć instrukcji emms (C: _mm_empty()), aby przywrócić operację do pliku rejestru x87. W niektórych systemach operacyjnych x87 nie jest często używany, ale nadal może być używany w niektórych krytycznych obszarach, takich jak pow(), gdzie wymagana jest dodatkowa precyzja. W takich przypadkach uszkodzony stan zmiennoprzecinkowy spowodowany niepowodzeniem wyemitowania emmów może pozostać niewykryty przez miliony instrukcji, zanim ostatecznie spowoduje awarię procedury zmiennoprzecinkowej i zwrócenie NaN. Ponieważ problem nie jest lokalnie widoczny w kodzie MMX, znalezienie i poprawienie błędu może być bardzo czasochłonne. Ponieważ SSE2 nie ma tego problemu i zwykle zapewnia znacznie lepszą przepustowość i zapewnia więcej rejestrów w kodzie 64-bitowym, powinien być preferowany do prawie wszystkich prac związanych z wektoryzacją.

Użycie kompilatora

Kiedy po raz pierwszy wprowadzono go w 2000 r., SSE2 nie był obsługiwany przez narzędzia do tworzenia oprogramowania. Na przykład, aby użyć SSE2 w Microsoft Visual Studio , programista musiał albo ręcznie napisać inline-assembly, albo zaimportować kod obiektowy z zewnętrznego źródła. Później Visual C++ Processor Pack dodał obsługę SSE2 do Visual C++ i MASM .

Kompilator Intel C++ może automatycznie generować kod SSE4 , SSSE3 , SSE3 , SSE2 i SSE bez użycia ręcznie kodowanego zestawu.

Od GCC 3, GCC może automatycznie generować kod skalarny SSE/SSE2, gdy cel obsługuje te instrukcje. Od GCC 4 dodano automatyczną wektoryzację dla SSE/SSE2.

Sun Studio Compiler Suite może również generować instrukcje SSE2, gdy używana jest flaga kompilatora -xvector=simd.

Od Microsoft Visual C++ 2012 opcja kompilatora do generowania instrukcji SSE2 jest domyślnie włączona.

obsługa procesora

SSE2 jest rozszerzeniem architektury IA-32 , opartym na zestawie instrukcji x86 . Dlatego tylko procesory x86 mogą zawierać SSE2. Architektura AMD64 obsługuje IA-32 jako tryb zgodności i zawiera SSE2 w swojej specyfikacji. Podwaja również liczbę rejestrów XMM, co pozwala na lepszą wydajność. SSE2 jest również wymagane do zainstalowania systemu Windows 8 (i nowszego) lub pakietu Microsoft Office 2013 (i nowszego) „w celu zwiększenia niezawodności aplikacji i sterowników innych firm działających w systemie Windows 8”.

Następujące procesory IA-32 obsługują SSE2:

Następujące procesory IA-32 zostały wydane po opracowaniu SSE2, ale ich nie zaimplementowały:

Zobacz też