0xDEADBEEF

[RSS]
««« »»»

ISPC, SPMD a SIMD

9. 6. 2018

Maxime Che­va­lier tweetla odkaz na za­jí­ma­vou sérii článků ma­pu­jící po­čátky a vývoj kom­pi­lá­toru ISPC (Intel SPMD pro­gram com­pi­ler) + do toho vy­světlí jak fun­guje SPMD pro­gra­mo­vací model, který je vy­u­ží­vaný pro pro­gra­mo­vání gra­fic­kých karet.

Všechno začalo s Larra­bee – pro­to­ty­pem pro­ce­soru ur­če­ném pro seg­ment, který oku­puje GPGPU. Sa­motné první Larra­bee skon­čilo jen u pro­to­typu a ne­pro­dá­valo se. Ná­sle­du­jící mik­ro­ar­chi­tek­tury Kni­ghts Corner (57-61 jader) a Kni­ghts Lan­ding (64-72 jader), hro­madně na­zý­vané pro­duk­to­vým jménem Xeon Phi si však úspěšně našly místo v su­per­po­čí­ta­čích.

Larra­bee a jeho ná­sle­dov­níci byli na­vr­ženi jako čip, ktrerý nese velké množ­ství jed­no­du­chých in-order jáder1 obo­ha­ce­ných o široké SIMD jed­notky + 4xSMT. SIMD od po­čátku mělo šířku 512 bitů (tedy tolik jako AVX-512, které se poz­ději do­stalo do oby­čej­ných Sky­lake čipů). Taková šířka zna­mená, že jedna SIMD in­strukce pra­cuje s 16 čtyř­baj­to­vými inty/floaty. To je hodně práce v jedné ope­raci.

Teď jak tento spící po­ten­ciál využít? Nejde jen o Larra­bee určené pro su­per­po­čí­tače, ale i běžné čipy. Když bylo uve­deno AVX, došlo ke zdvoj­ná­so­bení šířky SIMD jed­no­tek (z 128 butů na 256 bitů) a tedy k ±zdvoj­ná­so­bení vý­po­četní síly. Další zdvoj­ná­so­bení při­chází teď s po­slední ge­ne­rací pro­ce­sorů Intel, které pod­po­rují AVX-512. Jak po­do­týká autor od­ka­zo­va­ných článků, takové zrych­lení jsme viděli na­po­sledy v de­va­de­sá­tých letech.

Jednou mož­nost je au­to­ma­tická vek­to­ri­zace kódu – ta fun­guje, ale nejde o pro­gra­mo­vací model, je to jen op­ti­ma­li­zace na kterou se uži­va­tel nemůže na 100% spo­leh­nout. Další al­ter­na­ti­vou je psát přímo v as­sem­bleru nebo za pomocí in­trin­sic funkcí. To ale není příliš pro­duk­tivní způsob práce.. Další va­ri­anta je pak SPMD – single pro­gram mul­tiple data. Jde o to, že se pa­ra­lelní pro­gram rozřízne po­délně a místo abych se zdr­žo­val ex­pli­cit­ním pa­ra­le­lis­mem, píšu sé­ri­ový pro­gram, který pra­cuje s jedním ele­men­tem vstupu. Mnoho in­stancí tohoto pro­gramu pak může běžet v mnoha vlák­nech, ale také můžou být pře­lo­ženy pro SIMD. V ta­ko­vém pří­padě SIMD jed­notka s 16 laj­nami bude pro­vá­dět 16 in­stancí pro­gramu vedle sebe. Je to jako kdyby 16 vláken po­cho­do­valo zcela iden­tic­kým rytmem, jednu in­strukci za druhou. Pře­klad je celkem tri­vi­ální, ale po­ně­kud ne­zvyklý. V pří­tom­nosti pod­mí­nek, smyček, goto, breakcontinue, je nutné ně­které SIMD lajny vy­mas­ko­vat jako ne­ak­tivní a tak po­dobně. Ve své pod­statě jde o glo­ri­fi­ko­va­nou funkci map.


Re­le­vantní čtení:


  1. Tyto jádra vy­chá­zejí z ori­gi­nál­ních Pentií, stejně jako z nich vy­chá­zely rané Atomy.
píše k47 (@kaja47, k47)