Az OpenCL programozási nyelv

Bevezetés

OpenCL-ről röviden

Az OpenCL (Open Computing Language) – egy nyílt ipari szabvány, melynek segítségével processzorok széles skálája – CPU-k, GPU-k, DSP-k, CELL – válik heterogén módon programozhatóvá egy egységes platformon keresztül. Ez az általánossága különbözteti meg legjobban az OpenCL-t a többi csak GPU programozására specializált technológiától. A szabvány egy nyelvet és egy függvénykönyvtárat definiál, melynek segítségével implementált programjaink hordozhatóak lesznek az OpenCL képes hardverek és az operációs rendszerek között, kezdve a mobiltelefonoktól egészen a szuperszámítógépekig. A nyelv a C99 szabványra épül, azt bizonyos részeken leszűkítve, máshol pedig kiegészítve. A szabvány létrehozását az Apple kezdeményezte, és végül az ipar olyan nagyjai dolgozták ki mint az AMD, az Intel, az IBM és az nVidia.

Áttekintés

Ahhoz, hogy megértsük az OpenCL működését, a következő modellek ismeretére van szükségünk:

Platform Modell

Az OpenCL Platform Modellje egy gazda eszközből és a hozzá kapcsolódó egy vagy több OpenCL eszközből áll. Az OpenCL eszközök számoló egységekből állnak, melyek tovább bomlanak végrehajtó egységekre. OpenCL nyelven megírt programjaink ezeken a végrehajtó egységeken futnak. OpenCL eszköz például egy GPU, vagy egy CPU, végrehajtó egységei pedig azok magja, illetve stream processzorai.
Egy OpenCL program gazda eszközön futó része egy parancs listán keresztül vezérli a főleg párhuzamos számításokat végző OpenCL eszközök működését.
OpenCL platform modellje

Végrehajtási Modell

Az OpenCL programok végrehajtása két részre bontható: a gazda program a gazdaeszközön, míg a kernelek az OpenCL eszközökön futnak. A kernelek környezetének beállítását és azok végrehajtásának ütemezését a gazdaprogram végzi.
A kerneleket úgynevezett munkatereken (NDRange) hajtjuk végre. A szabvány egy-, két- illetve háromdimenziós munkatereket definiál. A végrehajtás során a munkaterület összes elemén lefut egy kernel. A kernel egy aktuális példányát munkaegységnek hívjuk. Minden munkaegység egyedi GlobalID-val rendelkezik a munkatéren belül. A munkaegységek munkacsoportokba szerveződnek, ami egy durvább felosztása a muntatérnek. A munkacsoportok is rendelkeznek egy egyedi Work-group ID-val.

OpenCL végrehajtási modellje

Memória Modell

A munkaegységek négy különböző memóriaterületet érnek el:

OpenCL memória modellje

Programozási Modell

Az OpenCL végrehajtási modellje támogatja mind az adatközpontú, mind a feladatközpontú párhuzamosságot. Elsődlegesen mégis inkább az adatközpontú párhuzamosság preferált a szabvány részéről.

Fordítási Modell

Mivel az OpenCL célja a lehető legnagyobb teljesítmény elérése processzorok széles skáláján, ezért működése alapvetően futásidejű fordítást (just-in-time compilation, JIT) használ. A különböző OpenCL képes hardverekkel rendelkező gyártók feladata a fordítóprogram beépítése a termék eszközmeghajtójába. A compiler a lefordított kódot betölti az eszközbe, melyet azt egyszerűen futatthatunk. A fordító szolgáltatásait az OpenCL által definiált API-n keresztül vehetjük igénybe.