SIMD - SIMD

Jedna instrukce, více dat

Jedna instrukce, více dat ( SIMD ) je typ paralelního zpracování ve Flynnově taxonomii . SIMD může být interní (součást návrhu hardwaru) a může být přímo přístupný prostřednictvím architektury sady instrukcí (ISA): nemělo by být zaměňováno s ISA. SIMD popisuje počítače s více prvky zpracování, které provádějí stejnou operaci na více datových bodech současně.

Takové stroje využívají paralelismus na úrovni dat , ale ne souběžnost : existují simultánní (paralelní) výpočty, ale každá jednotka provádí v daném okamžiku přesně stejnou instrukci (jen s jinými daty). SIMD je zvláště použitelné pro běžné úkoly, jako je nastavení kontrastu v digitálním obrazu nebo nastavení hlasitosti digitálního zvuku . Většina moderních návrhů CPU obsahuje pokyny SIMD ke zlepšení výkonu používání multimédií . SIMD má ve Flynnově 1972 Taxonomii tři různé podkategorie , z nichž jedna je SIMT . SIMT by nemělo být zaměňováno se softwarovými vlákny nebo hardwarovými vlákny , přičemž obě jsou sdílením času (krájení času). SIMT je skutečné simultánní paralelní spouštění na úrovni hardwaru.

Dějiny

První použití instrukcí SIMD bylo v ILLIAC IV , který byl dokončen v roce 1966.

SIMD byl základem pro vektorové superpočítače z počátku 70. let, jako jsou CDC Star-100 a Texas Instruments ASC , které mohly pracovat na „vektoru“ dat s jedinou instrukcí. Zpracování vektorů bylo zvláště popularizováno Crayem v 70. a 80. letech minulého století. Architektury vektorového zpracování jsou nyní považovány za oddělené od počítačů SIMD: Duncanova taxonomie je zahrnuje tam, kde Flynnova taxonomie ne, kvůli Flynnově práci (1966, 1972) před datováním Cray-1 (1977).

První éra moderních počítačů SIMD byla charakterizována masivně paralelními superpočítači ve stylu zpracování , jako jsou Thinking Machines CM-1 a CM-2 . Tyto počítače měly mnoho procesorů s omezenou funkcí, které by fungovaly souběžně. Například každý z 65 536 jednobitových procesorů v Thinking Machines CM-2 by provedl stejnou instrukci současně, což by například umožnilo logicky kombinovat 65 536 párů bitů najednou pomocí sítě připojené k hyperkrychli nebo RAM vyhrazená pro procesor, aby našla své operandy. Superpočítač se odklonil od přístupu SIMD, když se levnější skalární přístupy MIMD založené na komoditních procesorech, jako je Intel i860 XP, staly silnějšími a zájem o SIMD slábl.

Současná éra procesorů SIMD vyrostla spíše z trhu stolních počítačů než z trhu superpočítačů. Jak se stolní procesory staly dostatečně výkonnými na to, aby v 90. letech podporovaly hraní her v reálném čase a zpracování zvuku/videa, rostla poptávka po tomto konkrétním typu výpočetního výkonu a prodejci mikroprocesorů se obrátili na SIMD, aby tuto poptávku uspokojili. Společnost Hewlett-Packard zavedla v roce 1994 pokyny MAX do stolních počítačů PA-RISC 1.1, aby zrychlila dekódování MPEG. Společnost Sun Microsystems představila celočíselné instrukce SIMD ve svém rozšíření instrukční sady „ VIS “ v roce 1995 ve svém mikroprocesoru UltraSPARC I. MIPS následoval s podobným systémem MDMX .

První široce nasazená stolní SIMD byla s rozšířením MMX společnosti Intel o architekturu x86 v roce 1996. To vyvolalo zavedení mnohem výkonnějšího systému AltiVec do systémů Motorola PowerPC a IBM POWER . Společnost Intel reagovala v roce 1999 zavedením zcela nového systému SSE . Od té doby došlo k několika rozšířením instrukčních sad SIMD pro obě architektury. Pokročilá vektorová rozšíření AVX, AVX2 a AVX-512 jsou vyvíjena společností Intel. AMD ve svých aktuálních produktech podporuje AVX a AVX2 .

Všechny tyto vývojové trendy byly zaměřeny na podporu grafiky v reálném čase, a proto jsou zaměřeny na zpracování ve dvou, třech nebo čtyřech rozměrech, obvykle s délkami vektorů mezi dvěma a šestnácti slovy, v závislosti na datovém typu a architektuře. Když je třeba odlišit nové SIMD architektury od starších, pak jsou novější architektury považovány za architektury „krátkých vektorů“, protože dřívější SIMD a vektorové superpočítače měly délky vektorů od 64 do 64 000. Moderní superpočítač je téměř vždy shluk počítačů MIMD, z nichž každý implementuje (krátké vektorové) instrukce SIMD.

Výhody

Aplikace, která může využívat výhody SIMD, je taková, kde se stejná hodnota přidává (nebo odečítá) z velkého počtu datových bodů, což je běžná operace v mnoha multimediálních aplikacích. Jedním příkladem může být změna jasu obrázku. Každý pixel obrázku se skládá ze tří hodnot jasu červené (R), zelené (G) a modré (B) části barvy. Pro změnu jasu se hodnoty R, G a B načtou z paměti, přidá se k nim (nebo odečte) hodnota a výsledné hodnoty se zapíší zpět do paměti. Zvukové DSP by také pro ovládání hlasitosti znásobily levý i pravý kanál současně.

S procesorem SIMD existují dvě vylepšení tohoto procesu. Pro jednoho jsou data chápána jako bloky a lze načíst několik hodnot najednou. Namísto řady instrukcí „načíst tento pixel, nyní načíst další pixel“ bude mít procesor SIMD jedinou instrukci, která efektivně říká „načíst n pixelů“ (kde n je číslo, které se liší od návrhu k návrhu). Z různých důvodů to může trvat mnohem méně času než načítání každého pixelu jednotlivě, jako u tradičního návrhu CPU.

Další výhodou je, že instrukce pracuje se všemi načtenými daty v rámci jedné operace. Jinými slovy, pokud systém SIMD funguje tak, že načte osm datových bodů najednou, addoperace aplikovaná na data proběhne u všech osmi hodnot současně. Tento paralelismus je oddělený od paralelismu poskytovaného superskalárním procesorem ; osm hodnot je zpracováváno souběžně i na ne-superskalárním procesoru a superskalární procesor může být schopen provádět více operací SIMD souběžně.

Nevýhody

Mimo specializované oblasti a použití, pro něž má SIMD velké úspory, nelze SIMD nevýhody při použití pro obecné účely výpočetně zdůraznit.

  • Ne všechny algoritmy lze snadno vektorizovat. Například úloha náročná na řízení toku, jako je analýza kódu, nemusí mít z SIMD snadný prospěch; teoreticky je však možné vektorizovat srovnání a „dávkový tok“ za účelem dosažení maximální optimalizace mezipaměti, ačkoli tato technika bude vyžadovat více přechodného stavu. Poznámka: Dávkové pipeline systémy (příklad: GPU nebo softwarové rasterizační kanály) jsou nejvýhodnější pro řízení mezipaměti, pokud jsou implementovány s vnitřními funkcemi SIMD, ale nejsou exkluzivní pro funkce SIMD. Další složitost může být zřejmá, aby se zabránilo závislosti v řadách, jako jsou řetězce kódu; zatímco pro vektorizaci je nutná nezávislost.
  • Velké soubory registrů, které zvyšují spotřebu energie a požadovanou oblast čipu.
  • V současné době implementace algoritmu s instrukcemi SIMD obvykle vyžaduje lidskou práci; většina kompilátorů například negeneruje instrukce SIMD z typického programu C. Automatická vektorizace v překladačích je aktivní oblastí výzkumu počítačové vědy. (Porovnání vektorového zpracování .)
  • Programování s konkrétními instrukčními sadami SIMD může zahrnovat řadu výzev nízké úrovně.
    1. SIMD může mít omezení zarovnání dat ; programátoři obeznámení s jednou konkrétní architekturou to nemusí očekávat. Horší: zarovnání se může změnit z jedné revize nebo „kompatibilního“ procesoru na jiný.
    2. Shromažďování dat do registrů SIMD a jejich rozptyl do správných cílových umístění je složité (někdy vyžaduje operace s permutací ) a může být neúčinné.
    3. Specifické pokyny, jako jsou rotace nebo přidání tří operandů, nejsou v některých sadách instrukcí SIMD k dispozici.
    4. Sady instrukcí jsou specifické pro architekturu: některým procesorům zcela chybí instrukce SIMD, takže programátoři pro ně musí poskytnout nevektorizované implementace (nebo různé vektorizované implementace).
    5. Různé architektury poskytují různé velikosti registrů (např. 64, 128, 256 a 512 bitů) a sady instrukcí, což znamená, že programátoři musí poskytnout více implementací vektorizovaného kódu, aby optimálně fungovaly na jakémkoli daném CPU. S každou novou velikostí registru navíc roste možná sada instrukcí SIMD. Starší verze bohužel nelze z důvodu podpory starších verzí vyřadit.
    6. Počáteční sada instrukcí MMX sdílela soubor registru se zásobníkem s plovoucí desetinnou čárkou, což způsobilo neefektivnost při míchání kódu s plovoucí desetinnou čárkou a kódu MMX. SSE2 to však opravuje.

K nápravě problémů 1 a 5 používá vektorové rozšíření RISC-V alternativní přístup: namísto vystavení podrobností úrovně podregistru programátoru je sada instrukcí abstrahuje jako několik „vektorových registrů“, které používají stejné rozhraní napříč všemi CPU s touto instrukční sadou. Hardware zvládá všechny problémy se zarovnáním a „strip-mining“ smyček. Stroje s různými velikostmi vektorů by mohly spouštět stejný kód. LLVM nazývá tento vektorový typ „vscale“.

Nevýhody SIMD ve srovnání s vektorovým zpracováním a dokonce skalárním zpracováním pro obecné použití nelze přeceňovat. Ve srovnání s ekvivalentním skalárním nebo ekvivalentním vektorovým kódem není řádové zvýšení velikosti kódu neobvyklé a řádu vektoru nebo vyšší účinnosti (práce odvedené podle instrukcí) lze dosáhnout pomocí vektorových ISA

ARM Scalable Vector Extension má jiný přístup, známý ve Flynnově taxonomii jako „asociativní zpracování“, dnes známější jako „predikované“ (maskované) SIMD. Tento přístup není tak kompaktní jako vektorové zpracování, ale stále je mnohem lepší než nedetekční SIMD. Podrobné srovnávací příklady jsou uvedeny na stránce Zpracování vektorů .

Chronologie

Příklady superpočítačů SIMD (bez vektorových procesorů ):

Hardware

Drobná (64 nebo 128 bitů) SIMD se stala populární na univerzálních CPU na počátku 90. let a pokračovala až do roku 1997 a později s Motion Video Instructions (MVI) pro Alpha . SIMD instrukce lze nalézt na té či oné míře, u většiny procesorů, včetně IBM 's AltiVec a SPE pro PowerPC , HP ' s PA-RISC Multimediální zrychlení Extensions (MAX), Intel je MMX a iwMMXt , SSE , SSE2 , SSE3 SSSE3 a SSE4.x , AMD to 3DNow! , ARC 's ARC Video subsystém, SPARC je VIS a VIS2, Sun ‚s MAJC , ARM je Neon technologie, MIPS " MDMX (MadMax) a MIPS-3D . IBM, Sony, Toshiba se podílela na vývoji Cell procesor 's SPU je instrukční sada je silně SIMD založen. Společnost Philips , nyní NXP , vyvinula několik procesorů SIMD s názvem Xetal . Xetal má 320 16bitových procesorových prvků speciálně navržených pro úkoly vidění.

Moderní grafické procesorové jednotky (GPU) jsou často široké implementace SIMD, schopné větvení, načítání a ukládání na 128 nebo 256 bitů najednou.

Nejnovější pokyny Intel AVX-512 SIMD nyní zpracovávají 512 bitů dat najednou.

Software

Běžné ztrojnásobení čtyř 8bitových čísel. CPU načte jedno 8bitové číslo do R1, znásobí ho R2 a poté uloží odpověď z R3 zpět do RAM. Tento postup se opakuje pro každé číslo.
SIMD ztrojnásobení čtyř 8bitových čísel. CPU načte 4 čísla najednou, všechna znásobí v jedné SIMD-multiplikaci a uloží je najednou zpět do RAM. Rychlost lze teoreticky vynásobit 4.

Pokyny SIMD jsou široce používány ke zpracování 3D grafiky, ačkoli moderní grafické karty s integrovanou SIMD tento úkol z velké části převzaly od CPU. Některé systémy také obsahují permutační funkce, které přebalují prvky do vektorů, což je činí zvláště užitečnými pro zpracování a kompresi dat. Používají se také v kryptografii. Trend obecných výpočtů na GPU ( GPGPU ) může v budoucnu vést k širšímu využívání SIMD.

Přijetí systémů SIMD v softwaru osobního počítače bylo zpočátku pomalé kvůli řadě problémů. Jedním z nich bylo, že mnoho raných instrukčních sad SIMD mělo tendenci zpomalovat celkový výkon systému kvůli opětovnému použití stávajících registrů s plovoucí desetinnou čárkou. Jiné systémy, jako MMX a 3DNow! , nabízel podporu pro datové typy, které nebyly zajímavé pro široké publikum a měly drahé pokyny pro přepínání kontextu pro přepínání mezi používáním registrů FPU a MMX . Kompilátorům také často chyběla podpora, což vyžadovalo, aby se programátoři uchýlili ke kódování jazyka sestavení .

SIMD na x86 měl pomalý start. Představení 3DNow! podle AMD a SSE od Intelu věci poněkud zmátly, ale dnes se zdá, že se systém usadil (poté, co AMD přijalo SSE) a novější kompilátory by měly mít za následek více softwaru s podporou SIMD. Intel i AMD nyní poskytují optimalizované matematické knihovny využívající instrukce SIMD a začaly se objevovat open source alternativy jako libSIMD , SIMDx86 a SLEEF (viz také libm ).

Apple Computer měl o něco větší úspěch, přestože na trh SIMD vstoupili později než ostatní. AltiVec nabízel bohatý systém a lze jej programovat pomocí stále sofistikovanějších překladačů společností Motorola , IBM a GNU , proto je programování v montážním jazyce jen zřídka potřeba. Mnoho systémů, které by využívaly SIMD, navíc dodalo samotné Apple, například iTunes a QuickTime . V roce 2006 však počítače Apple přešly na procesory Intel x86. API a vývojové nástroje Apple ( XCode ) byly upraveny tak, aby podporovaly SSE2 a SSE3 i AltiVec. Apple byl dominantním kupcem čipů PowerPC od IBM a Freescale Semiconductor a přestože platformu opustili, další vývoj AltiVec pokračuje v několika designech PowerPC a Power ISA od Freescale a IBM.

SIMD v registru nebo SWAR je řada technik a triků používaných k provádění SIMD v obecných registrech na hardwaru, který neposkytuje žádnou přímou podporu pro instrukce SIMD. Toho lze využít k využití paralelismu v určitých algoritmech i na hardwaru, který nepodporuje SIMD přímo.

Rozhraní programátoru

Je běžné, že vydavatelé instrukčních sad SIMD vytvářejí vlastní rozšíření jazyka C/C ++ s vnitřními funkcemi nebo speciálními datovými typy (s přetížením operátorem ) zaručujícím generování vektorového kódu. Intel, AltiVec a ARM NEON poskytují rozšíření široce přijímaná kompilátory zaměřenými na jejich CPU. (Složitější operace jsou úkolem vektorových matematických knihoven.)

GNU C Compiler má rozšíření o krok dále tím, že odstraní je do univerzálního rozhraní, které lze použít na jakékoliv platformě, tím, že poskytuje způsob, jak definovat SIMD datové typy. LLVM Clang překladač implementuje funkci, s analogickým rozhraní zadaných v IR. Přepravka Rust'spacked_simd toto rozhraní používá, stejně jako Swift 2.0+.

C ++ má experimentální rozhraní, std::experimental::simdkteré funguje podobně jako rozšíření GCC. Zdá se, že libcxx LLVM to implementuje. Pro GCC a libstdc ++ je k dispozici obalová knihovna, která navazuje na rozšíření GCC.

Microsoft přidal SIMD do .NET v RyuJIT. System.Numerics.VectorBalík dostupný nuget, implementovat SIMD datové typy. Java má také nové navrhované API pro instrukce SIMD dostupné v OpenJDK 17 v modulu inkubátoru. Má také bezpečný záložní mechanismus u nepodporovaných procesorů na jednoduché smyčky.

Místo poskytování datového typu SIMD lze kompilátorům také navrhnout, aby automaticky vektorovaly některé smyčky, což potenciálně vezme určitá tvrzení o nedostatku datové závislosti. To není tak flexibilní jako přímá manipulace s proměnnými SIMD, ale jeho použití je snazší. OpenMP 4.0+ má #pragma omp simdnápovědu. Cilk má podobnou funkci #pragma simd. GCC a Clang mají také svá soukromá pragmata pro vytváření vektorovatelných smyček, ale všechny tři byly OpenMP zastaralé.

Více verzí SIMD

Očekává se, že spotřebitelský software bude pracovat na řadě procesorů pokrývajících více generací, což by mohlo omezit schopnost programátora používat nové instrukce SIMD ke zlepšení výpočetního výkonu programu. Řešením je zahrnout více verzí stejného kódu, který používá starší nebo novější technologie SIMD, a vybrat takovou, která nejlépe vyhovuje CPU uživatele za běhu ( dynamické odesílání ). Existují dva hlavní tábory řešení:

  • Funkce více verzí: podprogram v programu nebo knihovně je duplikován a kompilován pro mnoho rozšíření sady instrukcí a program se rozhodne, který z nich použije za běhu.
  • Knihovna s více verzemi: celá programovací knihovna je duplikována pro mnoho rozšíření sady instrukcí a operační systém nebo program rozhodne, který z nich načte za běhu.

Předchozí řešení je podporováno kompilátorem Intel C ++ , GNU Compiler Collection od GCC 6 a Clang od clang 7. Jelikož však GCC a clang vyžadují target_clonesk „klonování“ funkcí explicitní popisky, je snazší kompilovat více verzí knihovny a nechat systému glibc vybrat jednu, přístup přijatý Intel-podporovaný projekt Clear Linux.

Programovací jazyk Rust také podporuje multi-verzí. Klonování lze provést zavoláním původní funkce, takže inlining převezme kontrolu.

SIMD na webu

V roce 2013 John McCutchan oznámil, že vytvořil vysoce výkonné rozhraní pro instrukční sady SIMD pro programovací jazyk Dart , které poprvé přináší výhody SIMD pro webové programy. Rozhraní se skládá ze dvou typů:

  • Float32x4, 4 hodnoty s jednoduchou plovoucí desetinnou čárkou.
  • Int32x4, 4 32bitové celočíselné hodnoty.

Instance těchto typů jsou neměnné a v optimalizovaném kódu jsou mapovány přímo do registrů SIMD. Operace vyjádřené v Dart jsou typicky kompilovány do jediné instrukce bez režijních nákladů. To je podobné vnitřním vlastnostem C a C ++. Benchmarky pro násobení matice 4 × 4 , 3D transformaci vrcholů a vizualizaci sady Mandelbrot ukazují téměř 400% zrychlení ve srovnání se skalárním kódem napsaným v Dartu.

McCutchanova práce na Dartu, nyní nazývaném SIMD.js, byla přijata ECMAScriptem a Intel na IDF 2013 oznámil, že implementuje McCutchanovu specifikaci pro V8 i SpiderMonkey . Do roku 2017 však byla SIMD.js vyřazena ze standardní fronty ECMAScript ve prospěch zavedení podobného rozhraní ve WebAssembly . V srpnu 2020 zůstalo rozhraní WebAssembly nedokončené, ale jeho přenosná 128bitová funkce SIMD již byla v mnoha motorech použita.

Emscripten, kompilátor Mozilla C/C ++-to-JavaScript, s rozšířeními, umožňuje kompilaci programů C ++, které využívají vnitřní SIMD nebo vektorový kód ve stylu GCC do SIMD API JavaScriptu, což má za následek ekvivalentní zrychlení ve srovnání se skalárním kódem. Podporuje také návrh 128bitové SIMD WebAssembly.

Komerční aplikace

Ačkoli se obecně ukázalo obtížné najít udržitelné komerční aplikace pro procesory pouze se SIMD, jedna z nich má určitou míru úspěchu je GAPP , který byl vyvinut společností Lockheed Martin a přenesen do komerčního sektoru jejich spin-off Teranex . Nedávné inkarnace GAPP se staly výkonným nástrojem v aplikacích pro zpracování videa v reálném čase, jako je převod mezi různými video standardy a snímkovými frekvencemi ( NTSC do/z PAL , NTSC do/z HDTV formátů atd.), Odstraňování prokládání , redukce šumu obrazu , adaptivní komprese videa a vylepšení obrazu.

Všudypřítomnější aplikace pro SIMD se nachází ve videohrách : téměř každá moderní herní konzole od roku 1998 začlenila někde ve své architektuře procesor SIMD. PlayStation 2 byl neobvyklý tím, že jedna z jejích vector-float jednotek by mohlo fungovat jako samostatná DSP vykonávající vlastní instrukční proud, nebo jako koprocesor poháněné běžných instrukcí procesoru. Aplikace 3D grafiky se obvykle dobře hodí pro zpracování SIMD, protože se velmi spoléhají na operace se 4-dimenzionálními vektory. Microsoft ‚s Direct3D 9.0 nyní vybírá při implementacích procesor specifické běhu vlastních matematických operací, včetně použití SIMD instrukcí schopných.

Jedním z nejnovějších procesorů využívajících vektorové zpracování je Cell Processor vyvinutý společností IBM ve spolupráci se společnostmi Toshiba a Sony . Využívá řadu procesorů SIMD ( architektura NUMA , každý s nezávislým místním úložištěm a řízený obecným procesorem) a je zaměřen na obrovské soubory dat vyžadované aplikacemi pro zpracování 3D a videa. Liší se od tradičních ISA tím, že je SIMD od základů bez samostatných skalárních registrů.

Ziilabs vyrobil procesor typu SIMD pro použití na mobilních zařízeních, jako jsou přehrávače médií a mobilní telefony.

Komerční SIMD procesory ve větším měřítku jsou k dispozici od společností ClearSpeed ​​Technology, Ltd. a Stream Processors, Inc. CSX600 (2004) společnosti ClearSpeed má 96 jader se dvěma jednotkami s plovoucí desetinnou čárkou s dvojitou přesností, zatímco CSX700 (2008) má 192. Stream Processors je v čele s počítačovým architektem Billem Dallym . Jejich procesor Storm-1 (2007) obsahuje 80 jader SIMD řízených procesorem MIPS.

Viz také

Reference

externí odkazy