Rozszerzenia do przesyłania strumieniowego SIMD — Streaming SIMD Extensions
W obliczeniowej , Streaming SIMD Extensions ( SSE ) to pojedyncza instrukcja, wiele danych ( SIMD ) zestaw instrukcji rozszerzeniem x86 architekturze, zaprojektowany przez firmę Intel i wprowadzonej w 1999 roku w swoim Pentium III serii jednostki centralnej komputera (CPU) wkrótce po pojawieniu od Advanced Micro Devices (AMD), 3DNow! . SSE zawiera 70 nowych instrukcji, z których większość działa na danych zmiennoprzecinkowych o pojedynczej precyzji . Instrukcje SIMD mogą znacznie zwiększyć wydajność, gdy dokładnie te same operacje mają być wykonywane na wielu obiektach danych. Typowe zastosowania to cyfrowe przetwarzanie sygnałów i przetwarzanie grafiki .
Pierwszym przedsięwzięciem Intela IA-32 SIMD był zestaw instrukcji MMX . MMX miał dwa główne problemy: ponownie wykorzystywał istniejące rejestry zmiennoprzecinkowe x87, przez co procesory nie mogły pracować jednocześnie na danych zmiennoprzecinkowych i SIMD, i działał tylko na liczbach całkowitych . Instrukcje zmiennoprzecinkowe SSE działają na nowym niezależnym zestawie rejestrów, rejestrach XMM, i dodają kilka instrukcji całkowitych, które działają na rejestrach MMX.
SSE zostało następnie rozszerzone przez firmę Intel do SSE2 , SSE3 i SSE4 . Ponieważ obsługuje matematykę zmiennoprzecinkową, miał szersze zastosowania niż MMX i stał się bardziej popularny. Dodanie obsługi liczb całkowitych w SSE2 sprawiło, że MMX jest w dużej mierze nadmiarowy, chociaż w niektórych sytuacjach można osiągnąć dalszy wzrost wydajności, używając MMX równolegle z operacjami SSE.
SSE pierwotnie nosiło nazwę Katmai New Instructions ( KNI ), a Katmai jest nazwą kodową pierwszej wersji rdzenia Pentium III. Podczas projektu Katmai Intel starał się odróżnić go od swojej wcześniejszej linii produktów, w szczególności od swojego flagowego Pentium II . Został później przemianowany na Internet Streaming SIMD Extensions ( ISSE ), a następnie SSE. AMD ostatecznie dodało obsługę instrukcji SSE, zaczynając od procesorów Athlon XP i Duron ( rdzeń Morgan ).
Rejestry
SSE początkowo dodano osiem nowych rejestrów 128-bitowe zwane XMM0
przez XMM7
. W AMD64 rozszerzenia AMD (pierwotnie nazywany x86-64 ) dodaje kolejne osiem rejestrów XMM8
poprzez XMM15
, i to rozszerzenie jest powielany w Intel 64 architektury. Dostępny jest również nowy 32-bitowy rejestr kontroli/statusu MXCSR
. Rejestry XMM8
poprzez XMM15
dostępne są tylko w 64-bitowym trybie pracy.
SSE używało tylko jednego typu danych dla rejestrów XMM:
- cztery 32-bitowe liczby zmiennoprzecinkowe o pojedynczej precyzji
SSE2 rozszerzy później wykorzystanie rejestrów XMM o:
- dwie 64-bitowe liczby zmiennoprzecinkowe podwójnej precyzji lub
- dwie 64-bitowe liczby całkowite lub
- cztery 32-bitowe liczby całkowite lub
- osiem 16-bitowych krótkich liczb całkowitych lub
- szesnaście 8-bitowych bajtów lub znaków.
Ponieważ te 128-bitowe rejestry są dodatkowymi stanami maszyny, które system operacyjny musi zachować między przełącznikami zadań , są one domyślnie wyłączone, dopóki system operacyjny nie włączy ich jawnie. Oznacza to, że system operacyjny musi wiedzieć, jak używać instrukcji FXSAVE
i FXRSTOR
, która jest rozszerzoną parą instrukcji, która może jednocześnie zapisywać wszystkie stany rejestrów x86 i SSE. Ta obsługa została szybko dodana do wszystkich głównych systemów operacyjnych IA-32.
Pierwszy procesor obsługujący SSE, Pentium III , współdzielił zasoby wykonawcze między SSE a jednostką zmiennoprzecinkową (FPU). Podczas gdy skompilowana aplikacja może przeplatać instrukcje FPU i SSE obok siebie, Pentium III nie wyda instrukcji FPU i SSE w tym samym cyklu zegara . To ograniczenie zmniejsza skuteczność potokowania , ale oddzielne rejestry XMM pozwalają na mieszanie operacji SIMD i skalarnych operacji zmiennoprzecinkowych bez utraty wydajności z jawnego przełączania trybu MMX/zmiennoprzecinkowego.
Instrukcje SSE
SSE wprowadziło zarówno skalarne, jak i upakowane instrukcje zmiennoprzecinkowe.
Instrukcje zmiennoprzecinkowe
- Przenoszenie danych z pamięci do rejestru/rejestru do pamięci/rejestru do rejestru
- Skalarny –
MOVSS
- Zapakowane -
MOVAPS, MOVUPS, MOVLPS, MOVHPS, MOVLHPS, MOVHLPS, MOVMSKPS
- Skalarny –
- Arytmetyka
- Skalarny –
ADDSS, SUBSS, MULSS, DIVSS, RCPSS, SQRTSS, MAXSS, MINSS, RSQRTSS
- Zapakowane -
ADDPS, SUBPS, MULPS, DIVPS, RCPPS, SQRTPS, MAXPS, MINPS, RSQRTPS
- Skalarny –
-
Porównywać
- Skalarny –
CMPSS, COMISS, UCOMISS
- Zapakowane -
CMPPS
- Skalarny –
- Tasowanie i rozpakowywanie danych
- Zapakowane -
SHUFPS, UNPCKHPS, UNPCKLPS
- Zapakowane -
-
Konwersja typu danych
- Skalarny –
CVTSI2SS, CVTSS2SI, CVTTSS2SI
- Zapakowane -
CVTPI2PS, CVTPS2PI, CVTTPS2PI
- Skalarny –
-
Bitowe operacje logiczne
- Zapakowane -
ANDPS, ORPS, XORPS, ANDNPS
- Zapakowane -
Instrukcje dotyczące liczb całkowitych
- Arytmetyka
PMULHUW, PSADBW, PAVGB, PAVGW, PMAXUB, PMINUB, PMAXSW, PMINSW
- Przenoszenie danych
PEXTRW, PINSRW
- Inne
PMOVMSKB, PSHUFW
Inne instrukcje
-
MXCSR
kierownictwoLDMXCSR, STMXCSR
- Zarządzanie pamięcią podręczną i pamięcią
MOVNTQ, MOVNTPS, MASKMOVQ, PREFETCH0, PREFETCH1, PREFETCH2, PREFETCHNTA, SFENCE
Przykład
Poniższy prosty przykład ilustruje zalety korzystania z SSE. Rozważ operację taką jak dodawanie wektorów, która jest bardzo często używana w aplikacjach grafiki komputerowej. Aby dodać dwie pojedynczej precyzji, czteroskładnikowe wektory razem przy użyciu x86 wymagają czterech instrukcji dodawania zmiennoprzecinkowych.
vec_res.x = v1.x + v2.x;
vec_res.y = v1.y + v2.y;
vec_res.z = v1.z + v2.z;
vec_res.w = v1.w + v2.w;
Odpowiada to czterem instrukcjom FADD x86 w kodzie obiektowym. Z drugiej strony, jak pokazuje poniższy pseudokod, pojedyncza 128-bitowa instrukcja „packed-add” może zastąpić cztery instrukcje dodawania skalarnego.
movaps xmm0, [v1] ;xmm0 = v1.w | v1.z | v1.y | v1.x
addps xmm0, [v2] ;xmm0 = v1.w+v2.w | v1.z+v2.z | v1.y+v2.y | v1.x+v2.x
movaps [vec_res], xmm0 ;xmm0
Późniejsze wersje
- SSE2 , Willamette New Instructions (WNI), wprowadzone wraz z Pentium 4 , jest głównym ulepszeniem SSE. SSE2 dodaje dwie główne funkcje: zmiennoprzecinkowe podwójnej precyzji (64-bitowe) dla wszystkich operacji SSE oraz operacje na liczbach całkowitych MMX na 128-bitowych rejestrach XMM. W oryginalnym zestawie instrukcji SSE, konwersja na i z liczb całkowitych umieściła dane całkowite w 64-bitowych rejestrach MMX. SSE2 umożliwia programiście wykonywanie matematyki SIMD na dowolnym typie danych (od 8-bitowej liczby całkowitej do 64-bitowej liczby zmiennoprzecinkowej) w całości z pliku rejestru wektorowego XMM, bez konieczności używania starszych rejestrów MMX lub FPU. Oferuje ortogonalny zestaw instrukcji dotyczących radzenia sobie z popularnymi typami danych.
- SSE3 , zwany także Prescott New Instructions (PNI), to stopniowe uaktualnienie do SSE2, dodając garść instrukcji matematycznych zorientowanych na DSP i kilka instrukcji zarządzania procesami (wątkami). Pozwalał również na dodawanie lub mnożenie dwóch liczb, które są przechowywane w tym samym rejestrze, co nie było możliwe w SSE2 i wcześniejszych. Ta funkcja, znana jako pozioma w terminologii Intela, była głównym dodatkiem do zestawu instrukcji SSE3. 3DNow firmy AMD ! rozszerzenie może zrobić to drugie.
- SSSE3 , Merom New Instructions (MNI), to uaktualnienie do SSE3, dodając 16 nowych instrukcji, które obejmują permutację bajtów w słowie, mnożenie 16-bitowych liczb stałoprzecinkowych z prawidłowym zaokrągleniem oraz instrukcje akumulacji w obrębie słowa. SSSE3 jest często mylony z SSE4, ponieważ termin ten był używany podczas opracowywania mikroarchitektury rdzenia .
-
SSE4 , Penryn New Instructions (PNI), to kolejne ważne udoskonalenie, które dodaje instrukcję iloczynu kropkowego, dodatkowe instrukcje liczb całkowitych,
popcnt
instrukcję ( Population count : liczba bitów ustawiona na 1, używana powszechnie np. w kryptografii ) i wiele innych. - XOP , FMA4 i CVT16 to nowe iteracje ogłoszone przez AMD w sierpniu 2007 i poprawione w maju 2009.
- Advanced Vector Extensions (AVX), Gesher New Instructions (GNI) to zaawansowana wersja SSE ogłoszona przez firmę Intel, oferująca poszerzoną ścieżkę danych ze 128 bitów do 256 bitów oraz instrukcje z 3 argumentami (do 2). Intel wypuścił procesory na początku 2011 roku z obsługą AVX.
- AVX2 jest rozszerzeniem zestawu instrukcji AVX.
- AVX-512 (3.1 i 3.2) to 512-bitowe rozszerzenia do 256-bitowych instrukcji Advanced Vector Extensions SIMD dla architektury zestawu instrukcji x86.
Problemy z oprogramowaniem i sprzętem
W przypadku wszystkich rozszerzeń zestawu instrukcji x86 do BIOS - u , systemu operacyjnego i programisty aplikacji należy przetestowanie i wykrycie ich istnienia i prawidłowego działania.
- Intel i AMD oferują aplikacje do wykrywania rozszerzeń obsługiwanych przez procesor.
- CPUID kod operacji znajduje się dodatkowy procesor instrukcje (ich nazwa pochodzi od procesora Identification) dla architektury x86. Został wprowadzony przez firmę Intel w 1993 roku, kiedy wprowadził procesory Pentium i SL-Enhanced 486.
Przyswajanie rozszerzeń x86 przez aplikacje użytkowników było powolne, a nawet minimalne podstawowe wsparcie MMX i SSE (w niektórych przypadkach) nie było dostępne w aplikacjach około 10 lat po tym, jak te rozszerzenia stały się powszechnie dostępne. Przetwarzanie rozproszone przyspieszyło wykorzystanie tych rozszerzeń w społeczności naukowej — a wiele aplikacji naukowych odmawia uruchomienia, jeśli procesor nie obsługuje SSE2 lub SSE3.
Użycie wielu wersji aplikacji do radzenia sobie z wieloma różnymi dostępnymi zestawami rozszerzeń jest najprostszym sposobem na obejście problemu optymalizacji rozszerzeń x86. Biblioteki oprogramowania i niektóre aplikacje zaczęły obsługiwać wiele typów rozszerzeń, co sugeruje, że pełne wykorzystanie dostępnych instrukcji x86 może w końcu stać się powszechne około 5 do 15 lat po początkowym wprowadzeniu instrukcji.
Identyfikacja
Poniższe programy mogą służyć do określenia, które wersje SSE są obsługiwane w systemie, jeśli w ogóle
- Narzędzie do identyfikacji procesorów Intel
- CPU-Z — narzędzie do identyfikacji procesora, płyty głównej i pamięci.
- lscpu - dostarczane przez pakiet util-linux w większości dystrybucji Linuksa.
Bibliografia
Zewnętrzne linki