Streamování rozšíření SIMD - Streaming SIMD Extensions

V oblasti výpočetní techniky je Streaming SIMD Extensions ( SSE ) rozšíření instrukční sady s jednou instrukcí a více datovými ( SIMD ) architekturami x86 , navržené společností Intel a zavedené v roce 1999 v jejich sérii centrálních procesorových jednotek (CPU) Pentium III krátce po vzhledu of Advanced Micro Devices (AMD) 3DNow! . SSE obsahuje 70 nových pokynů, z nichž většina pracuje na datech s jednoduchou přesností s plovoucí desetinnou čárkou . Pokyny SIMD mohou výrazně zvýšit výkon, když mají být u více datových objektů prováděny přesně stejné operace. Typickými aplikacemi jsou zpracování digitálního signálu a grafické zpracování .

Prvním úkolem společnosti Intel IA-32 SIMD byla sada instrukcí MMX . MMX měl dva hlavní problémy: znovu použil stávající registry s plovoucí desetinnou čárkou x87, což způsobilo, že CPU nemohly pracovat na datech s plovoucí desetinnou čárkou i na datech SIMD současně, a fungovalo to pouze na celých číslech . Pokyny s plovoucí desetinnou čárkou SSE fungují na nové nezávislé sadě registrů, registrech XMM, a přidává několik celočíselných pokynů, které fungují na registrech MMX.

SSE byl následně společností Intel rozšířen na SSE2 , SSE3 a SSE4 . Protože podporuje matematiku s pohyblivou řádovou čárkou, měl širší aplikace než MMX a stal se populárnějším. Přidání celočíselné podpory v SSE2 způsobilo, že MMX je do značné míry nadbytečný, ačkoli dalšího zvýšení výkonu lze v některých situacích dosáhnout použitím MMX paralelně s operacemi SSE.

SSE se původně jmenovalo Katmai New Instructions ( KNI ), Katmai je krycí jméno pro první revizi jádra Pentium III. Během projektu Katmai se ho Intel snažil odlišit od své dřívější produktové řady, zejména od své vlajkové lodi Pentium II . Později byl přejmenován na Internet Streaming SIMD Extensions ( ISSE ), poté SSE. AMD nakonec přidalo podporu pro pokyny SSE, počínaje procesory Athlon XP a Duron ( jádro Morgan ).

Registry

SSE původně přidalo osm nových 128bitových registrů známých jako XMM0through XMM7. Na AMD64 rozšíření od AMD (původně volal x86-64 ) přidal dalších osm registrů XMM8prostřednictvím XMM15, a toto rozšíření je duplikovány v Intel 64 architekturu. K dispozici je také nová 32-bit kontrolní / status registr MXCSR. Registry XMM8prostřednictvím XMM15jsou přístupné pouze v 64bitovém režimu.

XMM registrys.svg

SSE používalo pro registry XMM pouze jeden datový typ:

SSE2 by později rozšířilo používání registrů XMM o:

  • dvě 64bitová čísla s plovoucí desetinnou čárkou s dvojitou přesností nebo
  • dvě 64bitová celá čísla nebo
  • čtyři 32bitová celá čísla nebo
  • osm 16bitových krátkých celých čísel nebo
  • šestnáct 8bitových bajtů nebo znaků.

Protože tyto 128bitové registry jsou další stavy počítače, které musí operační systém zachovat mezi přepínači úloh , jsou ve výchozím nastavení zakázány, dokud je operační systém výslovně nepovolí. To znamená, že OS musí vědět, jak používat instrukce FXSAVEa FXRSTOR, což je rozšířená dvojice instrukcí, která dokáže uložit všechny stavy registru x86 a SSE najednou. Tato podpora byla rychle přidána do všech hlavních operačních systémů IA-32.

První procesor podporující SSE, Pentium III , sdílel prostředky pro provádění mezi SSE a jednotkou s pohyblivou řádovou čárkou (FPU). Zatímco kompilovaná aplikace může prokládat instrukce FPU a SSE vedle sebe, Pentium III nevydá instrukce FPU a SSE ve stejném hodinovém cyklu . Toto omezení snižuje účinnost pipeliningu , ale oddělené registry XMM umožňují míchání SIMD a skalárních operací s plovoucí desetinnou čárkou bez zásahu výkonu z explicitního přepínání režimu MMX/plovoucí čárky.

Pokyny SSE

SSE zavedlo skalární i balené instrukce s plovoucí desetinnou čárkou.

Pokyny s plovoucí desetinnou čárkou

  • Přesun dat z paměti do registru/registru do paměti/registru do registru
    • Skalární - MOVSS
    • Zabaleno - MOVAPS, MOVUPS, MOVLPS, MOVHPS, MOVLHPS, MOVHLPS, MOVMSKPS
  • Aritmetický
    • Skalární - ADDSS, SUBSS, MULSS, DIVSS, RCPSS, SQRTSS, MAXSS, MINSS, RSQRTSS
    • Zabaleno - ADDPS, SUBPS, MULPS, DIVPS, RCPPS, SQRTPS, MAXPS, MINPS, RSQRTPS
  • Porovnat
    • Skalární - CMPSS, COMISS, UCOMISS
    • Zabaleno - CMPPS
  • Náhodné míchání a rozbalování dat
    • Zabaleno - SHUFPS, UNPCKHPS, UNPCKLPS
  • Konverze datového typu
    • Skalární - CVTSI2SS, CVTSS2SI, CVTTSS2SI
    • Zabaleno - CVTPI2PS, CVTPS2PI, CVTTPS2PI
  • Bitové logické operace
    • Zabaleno - ANDPS, ORPS, XORPS, ANDNPS

Celočíselné pokyny

  • Aritmetický
    • PMULHUW, PSADBW, PAVGB, PAVGW, PMAXUB, PMINUB, PMAXSW, PMINSW
  • Pohyb dat
    • PEXTRW, PINSRW
  • jiný
    • PMOVMSKB, PSHUFW

Další pokyny

  • MXCSR řízení
    • LDMXCSR, STMXCSR
  • Správa mezipaměti a paměti
    • MOVNTQ, MOVNTPS, MASKMOVQ, PREFETCH0, PREFETCH1, PREFETCH2, PREFETCHNTA, SFENCE

Příklad

Následující jednoduchý příklad ukazuje výhodu použití SSE. Zvažte operaci jako přidání vektoru, které se velmi často používá v aplikacích počítačové grafiky. Chcete-li přidat dvě jednoduché přesnosti, čtyřsložkové vektory dohromady pomocí x86 vyžadují čtyři pokyny pro přidání s plovoucí desetinnou čárkou.

 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;

To odpovídá čtyřem instrukcím x86 FADD v kódu objektu. Na druhou stranu, jak ukazuje následující pseudokód, čtyři instrukce skalárního sčítání může nahradit jedna 128bitová instrukce „pack-add“.

 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

Pozdější verze

  • SSE2 , Willamette New Instructions (WNI), představený s Pentiem 4 , je významným vylepšením SSE. SSE2 přidává dvě hlavní funkce: dvojitou přesnost (64bitová) s plovoucí desetinnou čárkou pro všechny operace SSE a celočíselné operace MMX na 128bitových registrech XMM. V původní sadě instrukcí SSE převod na celá čísla a z nich umístil celočíselná data do 64bitových registrů MMX. SSE2 umožňuje programátorovi provádět SIMD matematiku pro jakýkoli datový typ (od 8bitového celého čísla po 64bitový float) zcela se souborem vektorového registru XMM, aniž by bylo nutné používat starší registry MMX nebo FPU. Nabízí ortogonální sadu pokynů pro práci s běžnými datovými typy.
  • SSE3 , také nazývaný Prescott New Instructions (PNI), je přírůstkový upgrade na SSE2 a přidává několik matematických instrukcí orientovaných na DSP a některé pokyny pro správu procesů (vláken). Rovněž to umožnilo sčítání nebo násobení dvou čísel, která jsou uložena ve stejném registru, což v SSE2 a dřívější nebylo možné. Tato schopnost, v terminologii Intel známá jako horizontální, byla hlavním přírůstkem do instrukční sady SSE3. AMD 3DNow! rozšíření může udělat i to druhé.
  • SSSE3 , Merom New Instructions (MNI), je upgrade na SSE3, přidává 16 nových instrukcí, které zahrnují permutaci bajtů ve slově, znásobení 16bitových čísel s pevným bodem se správným zaokrouhlováním a pokyny pro akumulaci uvnitř slova. SSSE3 je často mylně považován za SSE4, protože tento termín byl použit při vývoji mikroarchitektury jádra .
  • SSE4 , Penryn New Instructions (PNI), je dalším zásadním vylepšením, přidáním tečkové produktové instrukce, dalších celočíselných instrukcí, popcntinstrukce ( Population count : count number of bits set to 1, expanded exlined vyp . In cryptography ), and more.
  • XOP , FMA4 a CVT16 jsou nové iterace oznámené AMD v srpnu 2007 a revidované v květnu 2009.
  • Advanced Vector Extensions (AVX), Gesher New Instructions (GNI), je pokročilá verze SSE oznámená společností Intel s rozšířenou datovou cestou od 128 bitů do 256 bitů a instrukcemi se 3 operandy (až od 2). Intel vydal procesory na začátku roku 2011 s podporou AVX.
  • AVX2 je rozšířením sady instrukcí AVX.
  • AVX-512 (3.1 a 3.2) jsou 512bitová rozšíření pro 256bitové instrukce SIMD Advanced Vector Extensions pro architekturu instrukční sady x86.

Problémy se softwarem a hardwarem

U všech rozšíření instrukční sady x86 je na systému BIOS , operačním systému a aplikačním programátoru, aby otestoval a zjistil jejich existenci a správnou funkci.

  • Intel a AMD nabízejí aplikace ke zjištění, jaká rozšíření CPU podporuje.
  • CPUID opcode je procesor doplňkový návod (jeho název je odvozen od CPU Identification) pro architekturu x86. Společnost Intel ji představila v roce 1993, kdy představila procesory Pentium a SL-Enhanced 486.

Využívání rozšíření x86 uživatelskými aplikacemi bylo pomalé, dokonce ani 10 let poté, co se tato rozšíření stala běžně dostupnou, aplikace vůbec neobsahovaly minimální základní podporu MMX a SSE (v některých případech). Distribuované výpočty zrychlily používání těchto rozšíření ve vědecké komunitě - a mnoho vědeckých aplikací odmítá spouštět, pokud CPU nepodporuje SSE2 nebo SSE3.

Nejjednodušším způsobem, jak vyřešit problém s optimalizací rozšíření x86, je použití více revizí aplikace pro zvládnutí mnoha různých sad dostupných rozšíření. Softwarové knihovny a některé aplikace začaly podporovat více typů rozšíření, což naznačuje, že plné využití dostupných instrukcí x86 může být konečně běžné asi 5 až 15 let poté, co byly instrukce původně zavedeny.

Identifikace

K určení, které verze SSE jsou v systému podporovány, lze použít následující programy

  • Nástroj pro identifikaci procesoru Intel
  • CPU-Z- nástroj pro identifikaci CPU, základní desky a paměti.
  • lscpu - poskytuje balíček util -linux ve většině distribucí Linuxu.

Reference

externí odkazy