OpenCL
OpenCL (Open Computing Language) je průmyslový standard pro paralelní programování heterogenních počítačových systémů, jako jsou například osobní počítače vybavené CPU, APU, GPU (grafickým procesorem), případně DSP (audio procesorem).
Vývojář | Khronos Group |
---|---|
Aktuální verze | 3.0[1] |
Operační systém | multiplatformní |
Platforma | x86_64 IA-32 architektura ARM |
Vyvíjeno v | C++ a C |
Typ softwaru | API, framework |
Licence | licence s otevřeným kódem |
Web | http://www.khronos.org/opencl/ http://www.khronos.org/webcl/ |
Některá data mohou pocházet z datové položky. |
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 aplikací na nich 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.[2] 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ů[3] 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í.[4]
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 procesory x86 s podporou instrukcí SSE3), grafické procesory (nVidia GeForce řady 8xxx a vyšší, ATI Radeon HD řady 4xxx a vyšší), signálové 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 vlastností a chování platforem a zařízení, jež 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, jež 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žinách 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í, jejich 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í | |
---|---|---|---|---|
Aplikace | dynamická | 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).
Standard OpenCL 2.0
Standard OpenCL 2.0 rozšiřuje[5][6] možnosti OpenCL tak že:
- přináší sdílení paměti CPU a GPU (snižuje režii systému),
- přináší možnost větší autonomie GPU (možnost efektivního využití nových algoritmů).
Dne 24.9.2014 AMD uvolnila OpenCL 2.0 ovladač pro 64bitový Linux a 64bitový Windows 8.1.[7] Aktuální seznam podporovaných procesorů a grafik.[8] V současné době jsou podporovány grafické čipy firmy AMD s architekturou GCN, konkrétně AMD Radeon HD 7000 a výše (s výjimkou OEM verzí).
Rozšíření OpenCL
Dosavadní rozšíření například specifikují spolupráci OpenCL API s grafickými API (OpenGL, DirectX) a také odstraňují některá omezení jazyka OpenCL C[9].
Odkazy
Reference
- www.abclinuxu.cz
- Khronos Group: Khronos Launches Heterogeneous Computing Initiative, tisková zpráva, [cit. 2008-06-18], Dostupné on-line.
- OpenCL gets touted in Texas [online]. MacWorld, 2008-11-20 [cit. 2009-06-12]. Dostupné online.
- Khronos Group: The Khronos Group Releases OpenCL 1.0 Specification, tisková zpráva, [cit. 2009-06-12], Dostupné on-line.
- http://diit.cz/clanek/khronos-vydal-finalni-specifikaci-opencl-20 Khronos vydal finální specifikaci OpenCL 2.0
- http://extrahardware.cnews.cz/opencl-20-cuda-6-jsou-hotove-prinaseji-treba-unifikaci-pameti-cpu-gpu Archivováno 3. 2. 2014 na Wayback Machine OpenCL 2.0 a Cuda 6 jsou hotové. Přinášejí třeba unifikaci paměti CPU a GPU
- LARABEL, Michael. AMD Releases OpenCL 2.0 Catalyst Linux Driver. Www.phoronix.com. Phoronix [online]. 2014-09-25 [cit. 2014-09-25]. Dostupné online. (anglický)
- AMD OpenCL 2.0 Driver [online]. AMD, 2014-09-24 [cit. 2014-09-25]. Dostupné online. (anglický)
- http://www.khronos.org/registry/cl/specs/opencl-2.0-extensions.pdf
Související články
Externí odkazy
- Obrázky, zvuky či videa k tématu OpenCL na Wikimedia Commons
- (anglicky) Specifikace OpenCL 1.0
- (anglicky) Manuálové stránky OpenCL
- (anglicky) OpenCL na stránkách NVidia