Technologie Intel SSE I. Šimeček, J. Trdlička xsimecek@fit.cvut.cz 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 R- bit 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 = <A,B> Zdroj xmm2 = <C,D> Výsledek <A+C, B-D>
HADDPD Horizontální výpočet Cíl xmm1 = <A,B> Zdroj xmm2 = <C,D> Výsledek <C+D, A+B>
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!