Technologie Intel SSE I. Šimeček, J. Trdlička
[email protected] Katedra počítačových systémů FIT České vysoké učení technické v Praze Ivan Šimeček, 2011 MI-PAP, LS2010/11, Predn.2
Příprava studijního programu Informatika je podporována projektem financovaným z Evropského sociálního fondu a rozpočtu hlavního města Prahy. Praha & EU: Investujeme do vaší budoucnosti
Nevýhody FPU na x86 • Starý návrh • S registry se pracuje jako se zásobníkem => aktuální výsledek je na vrcholu. • Zdála se to hezká idea: pracuji jen s nejvíce aktuálními výsledky • Ale: – Do operací vstupuje jen jeden nový operand, druhý je automaticky vrchol zásobníku. – Ale vrchol zásobníku(výsledek operace) je operand pro další instrukci (nutnost čekání na dokončení)!!! – Jediná možnost překrytí latencí je FXCH (prohození registrů) = nepřehledné (i pro kompilátor)
Vektorizace na x86 • Zjednodušená verze z vektorových superpočítačů • SIMD – Single Instruction Mutliple Data
• Může zmenšit nárok na tok instrukcí
Technologie SSE • Streaming SIMD Extensions • Dostupná od Pentium III (1999) zpo48tku označována jako „Katmai New Instructions" (KNI) • 8ice 128bitových XMM registrů • nezávislé na FPU zásobníku – Možno použít současně FPU/MMX a SSE – Možné problémy při přepnutí kontextu = OS musí ukládat i stav SSE registrů
Použití SSE • • • • • • •
70 instrukcí pro pokročilou 2-D a 3-D grafiku motion video, image processing, rozpoznávání hlasu, audio syntézu, telefonní a videokonference.
SSE registry • 128 bitové označené xmm0-xmm7 • Význam – jedno 32-bitová float čísla (scalar = skalární hodnota), – čtyři 32-bitová float čísla (packed = komprimovaná hodnota = double quadword),
• Hlavně pro operace s plovoucí řádovou čárkou • 32-bitový MXCSR registr, který nabízí řídící a stavové bity pro operace prováděné nad XMM registry
Registr MXCSR • řídící/stavový registr • maskování/odmaskování obsluhy číselných výjimek, • Nastavení zaokrouhlovacích módů • kontrola stavových flagů.
Registr MXCSR The MXCSR register is a 32-bit register. Od SSE3, bity 0-15 definovány jako: • FZ bit 15 Flush To Zero • R+ bit 14 Round Positive • Rbit 13 Round Negative • RZ bits 13 and 14 Round To Zero • RN bits 13 and 14 are 0 Round To Nearest • PM bit 12 Precision Mask • UM bit 11 Underflow Mask • OM bit 10 Overflow Mask • ZM bit 9 Divide By Zero Mask • DM bit 8 Denormal Mask • IM bit 7 Invalid Operation Mask • DAZ bit 6 Denormals Are Zero • PE bit 5 Precision Flag • UE bit 4 Underflow Flag • OE bit 3 Overflow Flag • ZE bit 2 Divide By Zero Flag • DE bit 1 Denormal Flag • IE bit 0 Invalid Operation Flag
Operace SSE • Skalární – Operace se provádí pouze s položkami č.0 – Ostatní položky se pouze kopírují – Skalární SSE může nahradit FPU ! • Výhoda: SSE mapování registrů „pevné“ na rozdíl od FPU zásobníku
• Packed (komprimovaný) – Operace se provádí se všemi 4mi položkami paralelně
Operace SSE • 128bit operace s komprimovanými hodnotami v plovoucí řádové čárce (packed single precision floating-point) uloženými v XMM registrech, • spravování stavu (state management), • řízení cache (cache control) a operace pro organizaci paměti. • 64 bitové SIMD instrukce (i nové instrukce) pro celá čísla, s komprimovanými celočíselnými operandy (packed-integer) uloženými v MMX registrech.
Operace SSE • komparační instrukce • převodní instrukce Tyto instrukce podporují komprimovaný i skalární převod mezi 128 bitovými SIMD registry a jedním z 64 bitových MMX registrů nebo 32 bitových x86 registrů. • logické instrukce • přídavné SIMD instrukce pro celá čísla • shuffle instrukce • instrukce pro správu stavu • instrukce řízení cache
Příklad skalární instrukce • ADDSS xmm1, xmm2 • Přičítá nejnižší dvojslovo (single) ze zdrojového operandu k cílovému operandu a ukládá výsledek v plovoucí čárce jednoduché přesnosti do cílového operandu. • Zdrojovým operandem xmm2. • Cílovým operandem je xmm1 registr. Tři vyšší dvojslova cílového operandu se nezmění
ADDSS
Příklad komprimované (packed) instrukce • ADDPS xmm1, xmm2 • Instrukce provádí SIMD součet čtyř komprimovaných single hodnot zdrojového operandu a cílového operandu a ukládá komprimovaný výsledek do cílového operandu. • Zdrojovým operandem je xmm2. • Cílovým operandem je registr xmm1.
ADDPS
Další instrukce • Podobně jako ADD se chovají instrukce XXXYY, kde – XXX je ADD, SUB, MUL, DIV, RCP, SQRT, RSQRT, MAX, MIN – YY je buď PS nebo SS
Porovnání cmpxxps • porovnání čtveřice dvojic • Výsledek je buď 0 (ne) nebo FFFFFFFFh (ano) • xx – je možno takto: eq - Equal to. lt - Less than. le - Less than or equal to. ne - Not equal. nlt - Not less than. nle - Not less than or equal to. ord - Ordered. unord - Unordered. • comiss – porovnání nejnižší dvojici a výsledek uloží do EFLAGS. ucomiss - porovnání nejnižší dvojici a výsledek uloží do EFLAGS, ale negeneruje vyjímky
Cache a SSE • prefetchT0 - načte cache-line do všech úrovní • prefetchT1 - načte cache-line do všech úrovní kromě nejbližší k CPU • prefetchT2 - načte cache-line do všech úrovní kromě 2 nejbližších k CPU • prefetchNTA - načte cache-line do úrovně nejbliž k CPU • sfence – Garantuje, že všechny (pozdržené) paměťové zápisy budou po této instrukci provedeny, negeneruje vyjímky – Důležité pro HT a SMP • MOVNTQ uloží MMX register do paměti, je „weakly-ordered“ a nealokuje cache – NT = not temporal • MOVNTPS uloží SSE register do paměti, je „weakly-ordered“ a nealokuje cache, adresa musí být zarovnána na 16 bytů.
SSE2 • SSE2 bylo uvedeno s Pentium 4 (2001) - "Willamette instructions“. • Rozšíření původního SSE: – operací s datovými typy v plovoucí řádové čárce a dvojité přesnosti. – možnost operací s XMM jako s 128 bitovým integerem – datové typy • • • • • •
2 čísla v plovoucí řádové čárce s dvojnásobnou přesností, 4 čísla v plovoucí řádové čárce v jednoduché přesností, 16 zkomprimovaných slabik (char), 8 zkomprimovaných slov (word), 4 zkomprimovaná dvojslova (dword), 2 zkomprimovaná čtyřslova (quadword)
SSE2 • Instrukce pro podporu nových datových typů a rozšíření SIMD operací pro celá čísla • Komprimované a skalární instrukce pro plovoucí řádovou dvojité přesnosti • Přídavné 64 bitové a 128 bitové SIMD instrukce pro plovoucí čárku • 128 bitová verze SIMD instrukcí pro celá čísla z MMX a SSE • Přídavné instrukce pro řízení cache a organizaci instrukcí • Modifikace existujících IA-32 instrukcí pro podporu SSE2: – Rozšíření a modifikace CPUID instrukce – Modifikace instrukce RDPMC
Příklady instrukcí • ADDPD xmm1, xmm2 – Instrukce provádí SIMD součet dvou double hodnot zdrojového operandu a cílového operandu a ukládá výsledek do cílového operandu.
• PAND xmm1, xmm2 – Logický AND dvou XMM (128bit) registrů
Příklady instrukcí • PADDQ mm1,mm2/m64 • mm1 (64b) = mm1 (64b) + mm2 (64b) • Pokud je quadword výsledek příliš velký pro reprezentaci v 64 bitech (dojde k přetečení), ukládá se pouze dolních 64 bitů do cílového elementu. (tzn. přenos je ignorován).
Příklady instrukcí • PADDQ xmm1,xmm2/m64 • xmm1 (lo 64b) = mm1 (lo 64b) + mm2 (lo 64b) • xmm1 (hi 64b) = mm1 (hi 64b) + mm2 (hi 64b)
• Pokud je quadword výsledek příliš velký pro reprezentaci v 64 bitech (dojde k přetečení), ukládá se pouze dolních 64 bitů docílového elementu. (tzn. přenos je ignorován).
Příklady instrukcí • PMULUDQ mm1,mm2/m64 – mm1 (64b) = mm1 (lo 32b) * mm2 (lo 32b)
• PADDQ xmm1,xmm2/m64 – xmm1 (lo 64b) = mm1 (lo lo 64b) + mm2 (lo lo 64b) – xmm1 (hi 64b) = mm1 (hi lo 64b) + mm2 (hi lo 64b)
Příklady instrukcí • PUNPCKHQDQ xmm1, xmm2/m128 • Prokládá vyšší quadword zdrojového operandu a vyšší slovo cílového operandu • Výsledek zapisuje do cílového registru. • Nižší quadwordy jsou ignorovány.
SSE2 • SSE2 rozšíření zvyšuje podporu zavedenou SSE pro řízení cache paměti SIMD operací • SSE2 instrukce pro řízení cache poskytuje možnosti proudění dat z/do XMM registrů v lepší spolupráci s cache a možnosti přednačítání dat (prefetch) předtím než jsou použita.
SSE2 a podmíněné skoky • Byly implementovány prefixy pro modifikaci chování prediktoru podmíněných skoků (Branch Hints). – hwnt = Hint Weakly Not Taken. – hst = Hint Strongly Taken.
Cache a SSE2 • clflush – Vyprázdní Cache Line ze všech úrovní cache. • lfence - Garantuje, že všechny (pozdržené) paměťové čtení budou po této instrukci provedeny • mfence - Garantuje, že všechny (pozdržené) paměťové operace budou po této instrukci provedeny
SSE3 • SSE3 bylo uvedeno na začátku roku 2004 procesoru Pentium 4 s kódovým označením Prescott = „Prescott New Instructions (PNI)“. • SSE3 dále rozšiřuje SSE2 o dalších 13 instrukcí. • Nejpodstatnější změnou je nový horizontální přístup k registrům, zatímco všechny předešlé SSE instrukce měly více či méně striktní přístup vertikální. • Přibyly specializované instrukce pro horizontální součet a rozdíl. Tyhle instrukce zjednodušují implementaci mnoha 3D operací a digitálního zpracování signálu.
SSE3 • Toto rozšíření zahrnuje 13 instrukcí. • 10 z nich podporuje SIMD model provádění instrukcí užívaný již předešlými sadami SSE/SSE2. • 1 SSE3 instrukce zrychluje styl x87 programování pro převod čísel v plovoucí řádové čárce na celočíselnou hodnotu. • Zbylé 2 instrukce (MONITOR a MWAIT) urychlují synchronizaci vláken.
SSE3 (detailně) • jedna instrukce zvyšující výkon při konverzi x87 FPU plovoucí čárky na • jedna instrukce poskytující specializované nezarovnané načtení 128 bitových dat • Tři instrukce zvyšující výkon pro načítání, přesun a duplikaci • Dvě instrukce pro komprimované sčítání a odčítání • Čtyři instrukce pro horizontální sčítání a odčítání • Instrukce pro synchronizaci vláken • Dvě instrukce zlepšující synchronizaci mezi agenty multivláken
Horizontální a asymetrické zpracování • Většina SSE/SSE2 instrukcí urychluje SIMD zpracování dat použitím modelu označovaného jako vertikální počítání. Užitím tohoto modelu je tok dat mezi vstupními a výstupními datovými elementy vertikální • SSE3 přináší instrukce, které urychlují SIMD zpracování v plovoucí řádové čárce, kde výsledek každého výstupního datového elementu zahrnuje buďto asymetrické zpracování nebo horizontální přesun dat vstupních datových elementů.
Cache a SSE • prefetchT0 - načte cache-line do všech úrovní • prefetchT1 - načte cache-line do všech úrovní kromě nejbližší k CPU • prefetchT2 - načte cache-line do všech úrovní kromě 2 nejbližších k CPU • prefetchNTA - načte cache-line do všech úrovní kromě 2 nejbližších k CPU • sfence - Guarantees that all memory writes issued before the sfence instruction are completed before any writes after the sfence instruction.
ADDSUBPD • • • •
Nesymetrický výpočet Cíl xmm1 =
Zdroj xmm2 = Výsledek
HADDPD • • • •
Horizontální výpočet Cíl xmm1 = Zdroj xmm2 = Výsledek
AMD a SSE • SSE – Tahle instrukční sada byla později adoptována i firmou AMD a poprvé se objevila s procesorem Athlon XP.
• SSE2 – Rival AMD později přidal podporu SSE2 s uvedením procesoru Opteron a Athlon 64 (64 bitový procesor) roku 2003. AMD také rozšířil původní Intelovskou SSE2 zdvojnásobením počtu XMM registrů z 8 na 16, tj. XMM0 až XMM15. Přídavné registry jsou však viditelné pouze v 64 bitovém módu, známém jako AMD64. – Intel také později přejal přídavné XMM registry, uvedené AMD, když doznámil, že přijme AMD64 architekturu pro své vlastní procesory v roce 2004 (x86 64).
• SSE3 – AMD uvedlo SSE3 v revizi E procesorů Athlon 64 (duben 2005), ale vypustilo podporu instrukcí monitor and mwait
Po SSE3 • SSSE3 = Intel Core 2, 16 nových instrukcí, zpočátku označováno jako SSE4 nebo Tejas New Instructiosn (TNI), or Merom New Instructions (MNI). • SSE4 (začátek roku 2007) – SSE4.1 47 nových instrukcí – SSE4.2 7 nových instrukcí – SSE4a je od AMD, částečná podpora SSE4 a 6 nových instrukcí
AVX • Rozšíření navazují na SSE • Uvedeno poprvé v CPU „Sandy Bridge“ • Zatím jen první generace – Podpora 256bit operandů – 3 a 4-operandové instrukce
Detekce rozšíření Intel Předpokládáme dostupnost CPUID mov EAX, 1 ; požadavek na vzhled flagů CPUID ; ; nebo db 0Fh, 0A2h = instrukce CPUID test EDX, hodnota
Detekce rozšíření AMD mov EAX, 0x80000001 ; požadavek na vzhled flagů CPUID ; 0Fh, 0A2h instrukce CPUID test EDX, hodnota
Vložení CPUID #define cpuid(func,a,b,c,d)\ asm {\ mov eax, func\ cpuid\ mov a, eax\ mov b, ebx\ mov c, ecx\ mov d, edx\ }
Detekce rozšíření (2) V registru EDX • Bit 23 = MMX • Bit 25 = SSE • Bit 26 = SSE2 • Bit 28 = HyperThreading V registru ECX • Bit 0 = SSE3
Detekce rozšíření AMD(2) V registru EDX • Bit 22 = AMD MMX Extensions • Bit 30 = 3DNow!2 • Bit 31 = 3DNow!