ISPC, SPMD a SIMD
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.
- The story of ispc: origins (part 1)
- The story of ispc: volta is born (part 2)
- The story of ispc: going all in on volta (part 3)
- The story of ispc: C's influence and implementing SPMD on SIMD (part 4)
- The story of ispc: first benchmark results (part 5)
- The story of ispc: first users and modern CPUs coming through (part 6)
- The story of ispc: Bringing up AVX and giving something back to LLVM (part 7)
- The story of ispc: more on optimizations and performance (part 8)
- The story of ispc: the open source release and the end of volta (part 9)
- The story of ispc: spreading the world and leaving Intel (part 10)
- The story of ispc: retrospective (part 11)
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 + 4×SMT. 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
,
break
a continue
, je nutné některé SIMD lajny vymaskovat jako neaktivní a tak podobně. Ve své podstatě jde o glorifikovanou funkci map
.
Relevantní čtení:
- Von Neumannovy lži
- Závislost je špatná (pro vaše programy i pro váš hardware)
- Úvod do podivností moderního hardwaru, které vás budou budit ze spaní
- Někdy je nejchytřejší nedělat nic chytrého (další kapitola nekonečného příběhu o optimalizaci)
- ispc: A SPMD Compiler for High-Performance CPU Programming
- Sierra: A SIMD Extension for C++
- Tyto jádra vycházejí z originálních Pentií, stejně jako z nich vycházely rané Atomy.