0xDEADBEEF

[RSS]
««« »»»

ISPC, SPMD a SIMD

9. 6. 2018

Maxime Chevalier tweetla odkaz na zajímavou sérii článků mapující počátky a vývoj kompilátoru ISPC (Intel SPMD program compiler) + do toho vysvětlí jak funguje SPMD programovací model, který je využívaný pro programování grafických karet.

Všechno začalo s Larrabee – prototypem procesoru určeném pro segment, který okupuje GPGPU. Samotné první Larrabee skončilo jen u prototypu a neprodávalo se. Následující mikroarchitektury Knights Corner (57-61 jader) a Knights Landing (64-72 jader), hromadně nazývané produktovým jménem Xeon Phi si však úspěšně našly místo v superpočítačích.

Larrabee a jeho následovníci byli navrženi jako čip, ktrerý nese velké množství jednoduchých in-order jáder1 obohacených o široké SIMD jednotky + 4xSMT. SIMD od počátku mělo šířku 512 bitů (tedy tolik jako AVX-512, které se později dostalo do obyčejných Skylake čipů). Taková šířka znamená, že jedna SIMD instrukce pracuje s 16 čtyřbajtovými inty/floaty. To je hodně práce v jedné operaci.

Teď jak tento spící potenciál využít? Nejde jen o Larrabee určené pro superpočítače, ale i běžné čipy. Když bylo uvedeno AVX, došlo ke zdvojnásobení šířky SIMD jednotek (z 128 butů na 256 bitů) a tedy k ±zdvojnásobení výpočetní síly. Další zdvojnásobení přichází teď s poslední generací procesorů Intel, které podporují AVX-512. Jak podotýká autor odkazovaných článků, takové zrychlení jsme viděli naposledy v devadesátých letech.

Jednou možnost je automatická vektorizace kódu – ta funguje, ale nejde o programovací model, je to jen optimalizace na kterou se uživatel nemůže na 100% spolehnout. Další alternativou je psát přímo v assembleru nebo za pomocí intrinsic funkcí. To ale není příliš produktivní způsob práce.. Další varianta je pak SPMD – single program multiple data. Jde o to, že se paralelní program rozřízne podélně a místo abych se zdržoval explicitním paralelismem, píšu sériový program, který pracuje s jedním elementem vstupu. Mnoho instancí tohoto programu pak může běžet v mnoha vláknech, ale také můžou být přeloženy pro SIMD. V takovém případě SIMD jednotka s 16 lajnami bude provádět 16 instancí programu vedle sebe. Je to jako kdyby 16 vláken pochodovalo zcela identickým rytmem, jednu instrukci za druhou. Překlad je celkem triviální, ale poněkud nezvyklý. V přítomnosti podmínek, smyček, goto, breakcontinue, je nutné některé SIMD lajny vymaskovat jako neaktivní a tak podobně. Ve své podstatě jde o glorifikovanou funkci map.


Relevantní čtení:


  1. Tyto jádra vycházejí z originálních Pentií, stejně jako z nich vycházely rané Atomy.
píše k47 (@kaja47, k47)