SSE2 - SSE2

SSE2 ( Streaming SIMD Extensions 2 ) je jednou z doplňkových instrukčních sad procesoru Intel SIMD (Single Instruction, Multiple Data), které společnost Intel poprvé představila s původní verzí Pentium 4 v roce 2000. Rozšiřuje dřívější sadu instrukcí SSE a je určena plně nahradit MMX . Intel rozšířil SSE2 na vytvoření SSE3 v roce 2004. SSE2 přidal 144 nových instrukcí do SSE, která má 70 instrukcí. Soupeřící chip-maker AMD přidána podpora pro SSE2 se zavedením jejich Opteron a Athlon 64 rozsahy AMD64 64bitových procesorů v roce 2003.

Funkce

Většina instrukcí SSE2 implementuje celočíselné vektorové operace také v MMX. Namísto registrů MMX používají registry XMM, které jsou širší a umožňují významné zlepšení výkonu ve specializovaných aplikacích. Další výhodou nahrazení MMX za SSE2 je zabránění postihu přepínání režimů pro vydávání instrukcí x87 přítomných v MMX, protože sdílí registrový prostor s x87 FPU. SSE2 také doplňuje vektorové operace s plovoucí desetinnou čárkou sady instrukcí SSE přidáním podpory pro datový typ s dvojitou přesností.

Další rozšíření SSE2 zahrnují sadu pokynů pro řízení mezipaměti určených primárně k minimalizaci znečištění mezipaměti při zpracování nekonečných proudů informací a sofistikovaný doplněk pokynů pro převod v číselném formátu.

Implementace SSE2 od AMD na platformě AMD64 ( x86-64 ) zahrnuje dalších osm registrů, čímž se celkový počet zdvojnásobil na 16 (XMM0 až XMM15). Tyto další registry jsou viditelné pouze při spuštění v 64bitovém režimu. Společnost Intel přijala tyto další registry jako součást své podpory pro architekturu x86-64 (nebo řečeno Intel „64“) v roce 2004.

Rozdíly mezi x87 FPU a SSE2

Pokyny FPU (x87) poskytují vyšší přesnost výpočtem mezivýsledků s přesností 80 bitů, aby se minimalizovala chyba zaokrouhlování v numericky nestabilních algoritmech (viz zdůvodnění návrhu IEEE 754 a odkazy v něm). X87 FPU je však pouze skalární jednotkou, zatímco SSE2 může paralelně zpracovávat malý vektor operandů.

Pokud jsou kódy určené pro x87 přeneseny na plovoucí desetinnou čárku SSE2 s dvojitou přesností a nižší přesností, mohou určité kombinace matematických operací nebo vstupních datových sad vést k měřitelné numerické odchylce, což může být problém v reprodukovatelných vědeckých výpočtech, např. Pokud musí být výsledky výpočtu porovnány proti výsledkům generovaným z jiné architektury stroje. Související problém spočívá v tom, že jazykové standardy a překladače byly v minulosti nekonzistentní při zacházení s 80bitovými registry x87 implementujícími proměnné s dvojnásobnou rozšířenou přesností ve srovnání s formáty s dvojitou a jedinou přesností implementovanou v SSE2: zaokrouhlování přechodných hodnot s rozšířenou přesností na zdvojnásobení přesnosti proměnných nebyl plně definován a byl závislý na podrobnostech implementace, jako když byly registry vysypány do paměti.

Rozdíly mezi MMX a SSE2

SSE2 rozšiřuje instrukce MMX tak, aby fungovaly na registrech XMM. Proto je možné převést všechny existující kódy MMX na ekvivalent SSE2. Vzhledem k tomu, že registr SSE2 je dvakrát tak dlouhý jako registr MMX, může být nutné změnit počitadla smyček a přístup do paměti, aby to vyhovovalo. K dispozici je však 8 bajtů načtení a uložení do XMM, takže to není striktně vyžadováno.

Ačkoli jedna instrukce SSE2 může pracovat s dvakrát větším množstvím dat než instrukce MMX, výkon se nemusí výrazně zvýšit. Jsou dva hlavní důvody: přístup k datům SSE2 v paměti, která nejsou zarovnána na hranici 16 bajtů, může být značně penalizována a propustnost instrukcí SSE2 ve starších implementacích x86 byla poloviční než u instrukcí MMX. Společnost Intel vyřešila první problém přidáním instrukce v SSE3 ke snížení režie přístupu k nevyrovnaným datům a zlepšení celkového výkonu nesprávně zarovnaných zátěží a poslední problém rozšířením prováděcího modulu v jejich mikroarchitektuře Core v Core 2 Duo a novějších produktech.

Protože MMX a x87 registrují soubory navzájem alias, použití MMX zabrání tomu, aby instrukce x87 fungovaly podle potřeby. Jakmile je MMX použit, programátor musí použít instrukci emms (C: _mm_empty ()) k obnovení operace do souboru registru x87. V některých operačních systémech se x87 příliš nepoužívá, ale stále se může používat v některých kritických oblastech, jako je pow (), kde je vyžadována mimořádná přesnost. V takových případech může zkorumpovaný stav s plovoucí desetinnou čárkou způsobený selháním emise emulátorů zůstat nezjištěný pro miliony pokynů, než nakonec způsobí selhání rutiny s plovoucí desetinnou čárkou a vrátí NaN. Vzhledem k tomu, že problém není v kódu MMX místně patrný, může být nalezení a oprava chyby velmi časově náročné. Protože SSE2 tento problém nemá, obvykle poskytuje mnohem lepší propustnost a poskytuje více registrů v 64bitovém kódu, proto by měl být upřednostňován pro téměř všechny práce s vektorizací.

Použití kompilátoru

Když byl poprvé představen v roce 2000, SSE2 nebyl podporován nástroji pro vývoj softwaru. Například pro použití SSE2 v projektu Microsoft Visual Studio musel programátor buď ručně napsat vložené sestavení, nebo importovat objektový kód z externího zdroje. Později Visual C ++ Processor Pack přidal podporu SSE2 pro Visual C ++ a MASM .

Intel C ++ kompilátoru může automaticky generovat SSE4 , SSSE3 , SSE3 , SSE2 a SSE kód bez použití ruky-kódované montáž.

Od GCC 3 může GCC automaticky generovat skalární kód SSE / SSE2, když cíl tyto pokyny podporuje. Od GCC 4 byla přidána automatická vektorizace pro SSE / SSE2.

Sada Sun Studio Compiler Suite může také generovat pokyny SSE2, když se použije příznak kompilátoru -xvector = simd.

Od Microsoft Visual C ++ 2012 je ve výchozím nastavení zapnuta možnost kompilátoru pro generování pokynů SSE2.

Podpora CPU

SSE2 je rozšíření architektury IA-32 založené na instrukční sadě x86 . Proto mohou pouze procesory x86 zahrnovat SSE2. Architektura AMD64 podporuje IA-32 jako režim kompatibility a do své specifikace zahrnuje SSE2. Zdvojnásobuje také počet registrů XMM, což umožňuje lepší výkon. SSE2 je také požadavek na instalaci Windows 8 (a novějších) nebo Microsoft Office 2013 (a novějších) „pro zvýšení spolehlivosti aplikací a ovladačů třetích stran běžících ve Windows 8“.

Následující procesory IA-32 podporují SSE2:

Následující procesory IA-32 byly vydány po vývoji SSE2, ale neimplementovaly je:

Viz také

Reference