OpenCL

Z Multimediaexpo.cz


OpenCL (Open Computing Language) je průmyslový standard pro paralelní programování heterogenních počitačových systémů.

Obsah

Historie

Pro mnohé moderní hardwarové architektury se paralelismus stává jedinou cestou k vyšším výkonům. Tváři v tvář fyzikálním limitům, nejčastěji v podobě teplotních omezení, se různé platformy vydaly jednotnou cestou navyšování počtů exekučních jednotek umožňujících paralelní zpracování, čím dál většího množství dat. Zároveň s tím dochází k rychlému nárůstu výkonu a schopnosti i těch nejmenších mobilních zařízení. Množství nosných architektur pro náročné aplikace tak roste poměrně rychlým tempem. Potřeba snadného, efektivního a jednotného zacházení s takovým množstvím hardwarových platforem znamenala vysokou poptávku po nových softwarových pomocnících. Nabídka nástrojů, které jsou schopné jednoduše zprostředkovávat programátorům tento nový způsob myšlení a práce byla dlouho neuspokojivá. Dosavadní prostředí, která se tuto situaci pokoušejí řešit trpí závažnými nedostatky. Mnohá proprietární řešení jsou totiž vázaná na konkrétní hardware (CUDA) či software (DirectCompute). Další nástroje sice umožňují jistý stupeň přenositelnosti avšak za cenu znatelně pomalejšího běhu aplikaci na ně postavených.

Tento neutěšený stav má za cíl řešit průmyslový standard OpenCL, jehož prvotní návrh lze vystopovat až k firmě Apple, která dosud drží práva k názvu OpenCL jakožto obchodní značce. V polovině roku 2008 přešel vývoj tohoto návrhu do rukou průmyslového konsorcia Khronos, které za tímto účelem vytvořilo pracovní skupinu Khronos Compute Working Group.[1] Tato skupina zahrnovala členské zastoupení nejvýznamnějších firem v oboru jakými jsou AMD, IBM, Intel a nVidia. V rekordně krátkém čase 5. měsíců[2] byl návrh prodiskutován a propracován do konečné podoby verze 1.0. Po schválení standardu všemi členy konsorcia došlo dne 8. prosince, 2008 k jeho uveřejnění.[3]

Hardwarová a softwarová podpora

OpenCL definuje abstraktní hardwarové zařízení a k němu ovládací softwarové rozhraní, pomocí kterého aplikace přistupují ke konkrétním výpočetním možnostem různých hardwarových platforem. Jednoduchost modelu abstraktního zařízení usnadňuje jeho implementaci na široké škále existujících i plánovaných hardwarových platforem. Tyto platformy zahrnují klasické procesory (všechny CPU x86 s podporou instrukcí SSE3), grafické procesory (nVidia GeForce řady 8xxx a vyšší, ATI Radeon HD řady 4xxx a vyšší), signální procesory (DSP), některé novější mobilní čipy, procesory typu Cell a další.

Ani softwarové rozhraní standardu není závislé na softwarové platformě, což znamená, že nepotřebuje ke svému chodu žádný konkrétní operační systém. Hlavní výrobci grafických čipů již zahrnuli implementaci OpenCL do grafických ovladačů nabízených pro nejrozšířenější operační systémy jakými jsou různé verze Windows (XP, Vista, 7) či hlavní distribuce linuxu (Ubuntu, OpenSUSE, Fedora). Podpora samozřejmě nechybí ani v produktech Apple (MacOS X 10.6, prostředí iPhone) a je dokonce dostupná i v některých virtuálních strojích (např. od VMware).

Standard OpenCL

Standard OpenCL obsahuje několik hlavních části:

  • Abstraktní modely určující požadované vlastnosti a chování zařízení OpenCL.
  • OpenCL Framework jehož součásti je definice OpenCL API.
  • Specifikaci programovacího jazyka, který je využíván pro programování zařízení OpenCL (OpenCL C).

Modely OpenCL

Modely OpenCL jsou abstraktním vyjádřením vlastnosti a chováni platforem a zařízení, jenž odpovídají standardu OpenCL. Jsou to:

  • Model platformy.
  • Exekuční model.
  • Paměťový model.
  • Programovací model.

Model platformy

Model definuje heterogenní paralelní stroj jako počítačový systém schopný nabízet služby OpenCL. Tento heterogenní stroj obsahuje hostitelský systém (dále jen hostitel) a jedno či více zařízení OpenCL (dále jen zařízení), kterými hostitel disponuje. Model platformy navíc předpokládá, že se zařízení skládá z výpočetních jednotek, které jsou dále dělené do procesních elementů.

Exekuční model

Běh softwarového systému využívající OpenCL probíhá na dvou úrovních heterogenního paralelního stroje. Klasická aplikační část (dále jen aplikace) je vykonávaná v rámci hostitele. Tato aplikace odpovídá kromě jiného za komunikaci mezi hostitelem a zařízeními stejně jako za spuštění a koordinaci výpočtů na těchto zařízeních. Samotné zařízení zpracovává tu část aplikace jenž byla vyjádřena jazykem OpenCL C (dále jen program). Program má formu jednoho či více výpočtových vláken, které jsou zpracovávané v rámci procesních elementů daného zařízení. Tato vlákna jsou instancemi funkčního objektu, který se nazývá kernel. Při spuštění výpočtu specifikuje aplikace jedno až třírozměrný indexový prostor, celkový počet instancí kernelu a (nepovinně) velikost skupin do kterých se budou tyto instance sdružovat. Z těchto informací OpenCL následně určí počet skupin a každé instanci kernelu přiřadí globální index, lokální index a skupinový index. Lokální respektive globální index identifikuje instanci kernelu v rámci skupiny respektive v rámci všech instancí. Skupinový index je identifikátor skupiny do nichž instance kernelu patři.

Kontexty a příkazové fronty

V rámci exekučního modelu si aplikace vytváří kontexty. V kontextu jsou zahrnuté informace o zařízeních, množinu kernelů a programech OpenCL v němž jsou kernely uložené, paměťových objektech které kernely budou zpracovávat a další údaje. Pro ovládaní zařízení, jejích synchronizaci, přesun dat a spouštění kernelů slouží příkazové fronty. Tyto příkazové fronty jsou schopné zpracovávat příkazy „in order“ (jak jdou za sebou) nebo „out of order“ (nezávislé na pořadí). Každý příkaz při zařazeni do fronty generuje událost. Vzhledem k tomu, že většinu příkazu je možné vykonávat asynchronně lze tyto události využívat pro sledování stavu příkazů a jejích vzájemnou synchronizaci.

Paměťový model

Tento model slouží k definici paměťové hierarchie, která zahrnuje různé paměťové oblasti zařízeni. Specifikuje typy paměti, druhy přístupu a její alokaci, kdo je za tyto operace odpovědný a jak.

  • Globální paměť je oblast paměti viditelná všem instancím kernelu.
  • Konstantní paměť je oblast globální paměti do nichž instance kernelu nemá právo zápisu.
  • Lokální paměť je oblast paměti viditelná pouze instancím kernelu ve skupině.
  • Privátní paměť je oblast paměti viditelná pouze v rámci instance kernelu.

Způsoby alokace paměti v jednotlivých paměťových oblastech:

GlobálníKonstantníLokálníPrivátní
Aplikacedynamickádynamickádynamickážádná
Kernelžádnástatickástatickástatická

Druhy přístupu k paměťovým oblastem:

GlobálníKonstantníLokálníPrivátní
Aplikacečtení/zápisčtení/zápisžádnýžádný
Kernelčtení/zápisčteníčtení/zápisčtení/zápis

Přesuny dat mezi hostitelem a touto hierarchií paměti se provádí zasláním příslušných příkazů (čtení, zápis nebo kopírování) na příkazovou frontu.

Programovací model

Z exekučního modelu vyplývá, že OpenCL podporuje úlohově paralelní a datově paralelní programovací modely (čí kombinaci obou). Standard OpenCL se soustřeďuje hlavně na datově paralelní programovací model. Datově paralelní programovací model Tento model definuje výpočet jako souběh instancí kernelu zpracovávajících datové složky vstupní datové struktury. V rámci indexového prostoru exekučního modelu jsou tyto instance a způsob jejích mapování na tyto datové složky definovaný jednoznačně. V nejjednodušším případě připadá jedna instance kernelu na jednu datovou složku, neplatí to však vždy. Úlohově paralelní programovací model (multitasking) Tento model umožňuje souběžně spouštět několik instancí různých kernelů. V tomto modelu není však možné vyžadovat těsný souběh několika instancí stejného kernelu. To je hlavní rozdíl oproti datově paralelnímu programovacímu modelu, kdy se v jednu chvíli spouští mnoho instancí jednoho kernelu, které mohou spolu úzce komunikovat.

OpenCL Framework

OpenCL Framework poskytuje aplikacím možnost využívat hostitelský systém a jeho zařízení v souladu s modely OpenCL jako heterogenní paralelní stroj. Framework obsahuje následující komponenty:

  • Programovací aplikační rozhraní OpenCL API, jež umožňuje práci se systémem OpenCL.
  • Kompilátor jazyka OpenCL C, který překládá programy psané v jazyce OpenCL C do konkrétního strojového kódu dané hardwarové platformy.

Jazyk OpenCL C

Programovací jazyk OpenCL C je založen na normě „ISO/IEC 9899:1999 - Specifikace jazyka C“ (dále C99). Oproti C99 se OpenCL C liší množstvím rozšíření, která zahrnují:

  • Vektorové datové typy.
  • Datové typy a funkce podporující práci s obrázky a jejích filtrování.
  • Kvalifikátory adresního prostoru.
  • Kvalifikátory přístupových práv.
  • Kernelové funkce.
  • Přesně definované chování datových typů čísel s plovoucí desetinnou čárkou dle standardu IEEE 754. Toto platí také pro všechny funkce a operátory, které s těmito typy pracují.

Na druhou stranu OpenCL C zavádí několik omezení:

  • Ukazatele na funkce, pole proměnné délky a bitová pole jsou zakázaná.
  • Velká většina hlavičkových souborů standardní knihovny jazyka C je nedostupná.
  • Rekurzivní funkce nejsou povolené.
  • Kernelové funkce nesmějí deklarovat argumenty typu ukazatel na ukazatel ani nic vracet.
  • Zápisy na pole číselných typů menších než 32 bitů jsou zakázané.

Profil „embedded“

Kromě výchozího profilu standardu je k dispozici též profil pro mobilní či vestavěná zařízení, která jsou schopná podporovat modely architektury OpenCL, ale nedisponují dostatečným výkonem pro zajištění plného rozsahu funkčnosti. V tomto „lehkém“ profilu jsou některé části standardu nepovinné (podpora 3D obrazu) či odstraněné úplně (striktní konformita s IEEE-754, 64bitové číselné typy).

Rozšíření OpenCL

Ačkoli standard je v současné době „zmrazen“, mají Khronos a jednotliví implementátoři volnou ruku při navrhování rozšiřující funkcionality. Dosavadní rozšíření například specifikují spolupráci OpenCL API s grafickými API (OpenGL, DirectX) nebo odstraňují některá omezení jazyka OpenCL C.

Reference

  1. Khronos Group: Khronos Launches Heterogeneous Computing Initiative, tisková zpráva, [cit. 2008-06-18], Dostupné on-line.
  2. OpenCL gets touted in Texas [online]. MacWorld, 2008-11-20, [cit. 2009-06-12]. Dostupné online.  
  3. Khronos Group: The Khronos Group Releases OpenCL 1.0 Specification, tisková zpráva, [cit. 2009-06-12], Dostupné on-line.

Externí odkazy