Skoči na vsebino

Heterogeni sistemi1

Hetereogen računalniški sistem je sistem, ki poleg klasične centralne procesne enote (CPE) in pomnilnika vsebuje še enega ali več različnih pospeševalnikov. Pospeševalniki so računske enote, ki imajo svoje procesne elemente in svoj pomnilnik, s centralno procesno enoto in glavnim pomnilnikom pa so povezani preko hitrega vodila. Računalniku, ki poleg CPE in glavnega pomnilnika vsebuje pospeševelnike, pravimo gostitelj (ang. host). Spodnja slika prikazuje primer splošnega heterogenega sistema.

Heterogen sistem

Danes poznamo vrsto pospeševalnikov. Najbolj uporabljani so grafične procesne enote (GPE) in programirljiva polja FPGA (ang. field programmable gate array). Pospeševalniki imajo veliko število namenskih procesnih enot in svoj namenski pomnilnik. Njihove procesne enote so običajno prilagojene določenim problemom (na primer izvajanju velikega števila množenj matrik) in te probleme znajo dokaj hitro izvajajati (vsekakor veliko hitreje kot CPE). Pospeševalniku pravimo naprava (ang. device).

Naprave obdelujejo podatke v svojem pomnilniku (in svojem naslovnem prostoru) ter načeloma nimajo neposrednega dostopa do glavnega pomnilnika na gostitelju. Po drugi strani gostitelj lahko dostopa do pomnilnikov na pospeševalnikih, vendar jih ne more neposredno naslavljati. Do pomnilnikov dostopa le preko posebnih vmesnikov, ki podatke po vodilu prenašajo med pomnilnikom naprave in glavnim pomnilnikov gostitelja.

Spodnja slika prikazuje organizacijo manjšega heterogenega sistema, kakršnega najdemo v osebnem računalniku. Gostitelj je osebni namizni računalnik s procesorjem Intel i7.

Heterogen sistem

Glavni pomnilnik gostitelja je v modulih DDR4 DIMM in je s CPE povezan preko pomnilniškega krmilnika in dvokanalnega vodila. CPE ta pomnilnik lahko naslavlja (na primer z ukazi LOAD/STORE) in v njem hrani ukaze in podatke. Maksimalna teoretična prenosna hitrost po enem kanalu med modulom DIMM in CPE je 25,6 GB/s. Pospeševalnik v tem heterogenem sistemu je grafična procesna enota Nvidia K40. Ta ima veliko število procesnih enot (spoznali jih bomo v nadaljevanju) ter svoj pomnilnik (v tem primeru ima 12 GB pomnilnika GDDR5). Pomnilnik v GPE lahko naslavljajo procesne enote v GPE, ne morejo pa ga naslavljati CPE na gostitelju. Prav tako procesne enote na GPE ne morejo naslavljati glavnega pomnilnika na gostitelju. GPE (naprava) je s CPE (gostiteljem) povezana preko hitrega 16 kanalnega vodila PCIe 3.0, ki omogoča prenos podatkov z največ 32 GB/s. Podatke med glavnim pomnilnikom na gostitelju in pomnilnikom GPE lahko prenaša le CPE preko posebnih vmesnikov.

Programiranje heterogenih sistemov

Za programiranje heterogenih računalniških sistemov bomo uporabljali ogrodje OpenCL. Programi pisani v ogrodju OpenCL so sestavljeni iz dveh delov:

  • programa, ki se bo izvajal na gostitelju ter
  • programa, ki se izvaja na napravi (pospeševalniku).

Program na gostitelju

Program na gostitelju bomo v sklopu delavnice pisali v programskem jeziku C. Gre za navaden program, vsebovan v C funkciji main(). Naloga programa na gostitelju je, da:

  • ugotovi, kakšne naprave so v sistemu,
  • za izbrano napravo pripravi potrebne podatkovne strukture,
  • ustvari medpomnilnike za prenos podatkov na napravo in iz nje,
  • iz datoteke prebere in prevede program, ki se bo izvajal na napravi,
  • prevedeni program prenese skupaj s podatki na napravo in ga zažene,
  • po končanem izvajanju programa na napravi, prenese podatke nazaj na gostitelja.

Program na napravi

Programe za naprave bomo pisali v jeziku OpenCL C. Spoznali bomo, da je to pravzaprav jezik C z nekaj spremenjenimi funkcionalnostmi. Programi, pisani za napravo, se najprej prevedejo na gostitelju, nato jih gostitelj skupaj s podatki in argumenti prenese na napravo, kjer se izvedejo. Programu, ki se izvaja na napravi pravimo ščepec (ang. kernel). Ščepci se izvajajo vzporedno - veliko število procesnih enot na napravi izvaja isti ščepec. V nadaljevanju bomo spoznali izvajalni model, ki ga za naprave predvideva ogrodje OpenCL. Ogrodje OpenCL predvideva isti izvajalni model ter isto pomnilniško hierarhijo za vse tipe naprav, zato lahko z njim programiramo zelo različne naprave. Na delavnici se bomo omejili na programiranje grafičnih procesnih enot.




  1. © Patricio Bulić, Univerza v Ljubljani, Fakulteta za računalništvo in informatiko. Gradivo je objavljeno pod licenco Creative Commons Priznanje avtorstva-Nekomercialno-Deljenje pod enakimi pogoji 4.0 Mednarodna