OpenCL
Aktuální verze stránky ještě nebyla zkontrolována zkušenými přispěvateli a může se výrazně lišit od
verze recenzované 15. března 2022; kontroly vyžadují
2 úpravy .
OpenCL ( anglicky Open C omputing L jazyk - otevřený výpočetní jazyk) je rámec pro psaní počítačových programů souvisejících s paralelními výpočty na různých grafických a centrálních procesorech a také na FPGA . OpenCL obsahuje programovací jazyk , který je založen na standardu programovacího jazyka C99 , a rozhraní pro programování aplikací . OpenCL poskytuje paralelismus na úrovni instrukcí a na úrovni dat a je implementací techniky GPGPU . OpenCL je zcela otevřený standard a za jeho používání se neplatí žádné licenční poplatky.
Cílem OpenCL je doplnit otevřené průmyslové standardy pro 3D počítačovou grafiku a zvuk – OpenGL , respektive OpenAL – o možnosti GPU pro vysoce výkonné výpočty. OpenCL vyvíjí a spravuje Khronos Group , neziskové konsorcium , které zahrnuje mnoho významných společností včetně AMD , Apple , ARM , Intel , Nvidia , Sony Computer Entertainment a dalších.
Historie
OpenCL byl původně vyvinut společností Apple Inc. Apple předložil výboru Khronos návrhy na vývoj specifikace. AMD se brzy rozhodlo podpořit vývoj OpenCL (a DirectX 11 ), který by měl nahradit framework Close to Metal . [1] [2]
Dne 16. června 2008 byla vytvořena pracovní skupina Khronos Compute Working Group pro vývoj specifikací OpenCL. Patří sem společnosti Apple , nVidia , AMD , IBM , Intel , ARM , Motorola a další společnosti, včetně těch, které se specializují na tvorbu počítačových her. Práce probíhaly pět měsíců, poté 9. prosince 2008 skupina Khronos představila první verzi standardu.
OpenCL 1.0 byl poprvé představen veřejnosti 9. června 2008 a vydán s Mac OS X 10.6 28. srpna 2009. [3]
5. dubna 2009 společnost AMD oznámila dostupnost beta verze ATI Stream SDK v2.0 ke stažení, která obsahuje víceprocesorový programovací jazyk OpenCL.
20. dubna 2009 vydala nVidia beta ovladač a sadu pro vývoj softwaru ( SDK ) s podporou otevřeného standardu GPGPU OpenCL. Tento beta ovladač je určen pro vývojáře účastnící se programu OpenCL Early Access, kteří se mohou zúčastnit beta testu od 20. dubna. Pro členy GPU Computing Registered Developers bude beta verze ovladače OpenCL zpřístupněna později. [4] [5] [6]
26. listopadu 2009 vydala nVidia ovladač podporující OpenCL 1.0 (rev 48).
Pro vizuální znázornění toho, jak technologie OpenCL využívá schopnosti 24jádrového systému k vykreslování video efektů, se doporučuje zhlédnout následující ukázku: [1] Archivováno 9. března 2017 na Wayback Machine .
OpenCL 1.1 byl představen Khronos Group 14. června 2010 . Nová verze výrazně rozšiřuje funkcionalitu pro paralelní programování, flexibilitu a výkon a přidává nové funkce.
- Nové datové typy včetně 3složkových vektorů a dalších obrazových formátů.
- Zpracování příkazů z více hostitelských vláken a zpracování vyrovnávací paměti mezi více zařízeními.
- Operace oblasti vyrovnávací paměti včetně čtení, zápisu a kopírování 1D, 2D nebo 3D obdélníkových oblastí.
- Rozšířené použití události ke správě a kontrole provádění příkazů.
- Vylepšená interoperabilita s OpenGL díky efektivnímu sdílení obrázků.
OpenCL 1.2 bylo představeno 15. listopadu 2011 . Nová verze obsahuje mnoho malých vylepšení souvisejících se zvýšenou flexibilitou jazyka a optimalizací výkonu. OpenCL 1.2 přidalo řadu významných inovací.
- Dělení zařízení na oddíly je schopnost rozdělit zařízení na několik podzařízení na aplikační úrovni OpenCL, aby se úlohy přímo svázaly s konkrétními výpočetními jednotkami, rezervovaly zdroje pro úlohy s vyšší prioritou nebo efektivněji sdílely hardwarové prostředky, jako je mezipaměť.
- Samostatná kompilace a spojování objektů – bylo možné vytvářet dynamické knihovny, které umožňují použití dříve implementovaných rutin s výpočty OpenCL v programech třetích stran.
- Rozšířená podpora obrázků, včetně možnosti pracovat s 1D obrázky a poli 1D nebo 2D obrázků. Rozšíření pro sdílení navíc přidává možnost vytvořit obrázek OpenCL na základě jednotlivých textur OpenGL nebo polí textur.
- Vestavěná jádra OpenCL vám nyní umožňují využívat vlastní nebo neprogramovatelný hardware a související firmware. Například bylo možné využít schopnosti a užší integraci s rámcem OpenCL zařízení, jako jsou procesory DSP nebo video kodéry / dekodéry.
- Možnost bezproblémového sdílení povrchů (Media Surface Sharing) mezi OpenCL a API DirectX 9/11.
OpenCL 2.0 bylo představeno 22. července 2013 [7] a standardizováno 18. listopadu téhož roku [8] .
- Sdílená virtuální paměť – umožňuje hostitelským jádrům a jádrům zařízení sdílet datové struktury na základě komplexních adresových odkazů, což eliminuje explicitní přenosy mezi hostitelem a zařízeními a zároveň zvyšuje flexibilitu programování.
- Nested Parallelism – Aktualizace zlepšila programovací prostředí a zvýšila výkon aplikací.
- Univerzální adresní prostor – Umožňuje zapisovat funkce bez pojmenování adresního prostoru, což zvyšuje flexibilitu a šetří čas tím, že eliminuje potřebu psát více funkcí.
- Zařízení Side Atomic C11 Operations – Podmnožina C11 atomických a synchronizačních operací umožňuje paralelní provádění vláken pro bezpečnou práci na sdílených datových sadách.
- Kanály – paměťové objekty organizované způsobem FIFO, což zjednodušuje datové struktury sdílené fronty.
OpenCL 2.1 bylo představeno 3. března 2015 a standardizováno 16. listopadu téhož roku. Přepsal jádro z C na C++14 .
OpenCL 3.0 bylo představeno 27. dubna 2020 [9] a standardizováno 30. září téhož roku [10] . Mezi významné změny patří, že OpenCL 3.0 API nyní pokrývá všechny verze OpenCL (1.2, 2.x), aniž by pro každou verzi poskytovalo samostatné specifikace.
Události
- 3. března 2011 — Skupina Khronos oznamuje vytvoření pracovní skupiny WebCL pro vývoj rozhraní JavaScriptu podle standardu OpenCL. To vytváří potenciál pro použití GPU a vícejádrových procesorů pro paralelní zpracování výpočtů ve webovém prohlížeči. [jedenáct]
- 4. května 2011 – Nokia Research vydala open source rozšíření WebCL pro prohlížeč Firefox . [jedenáct]
- 1. července 2011 – Společnost Samsung Electronics vydala otevřený prototyp WebCL pro engine WebKit . [jedenáct]
- 8. srpna 2011 — AMD vydala ovladač AMD Accelerated Parallel Processing (APP) Software Development Kit (SDK) v2.5 OpenCL, který nahrazuje ATI Stream SDK.
- 15. listopadu 2011 – Výbor Khronos vydal aktualizovanou specifikaci OpenCL 1.2. Nová verze obsahuje mnoho malých vylepšení souvisejících se zvýšenou flexibilitou jazyka a optimalizací výkonu.
- 1. prosince 2012 - Výbor Khronos vydal další aktualizaci specifikace OpenCL 1.2. Nová verze má vylepšenou interakci s OpenGL, vylepšenou bezpečnost ve WebGL, přidala podporu pro načítání OpenCL programů z přechodné reprezentace SPIR.
Vlastnosti jazyka
Klíčové rozdíly mezi použitým jazykem a C (norma ISO 1999) jsou:
- nedostatek podpory pro ukazatele funkcí , rekurze , bitová pole , pole s proměnnou délkou (VLA), standardní hlavičkové soubory [12] ;
- jazyková rozšíření pro souběžnost: vektorové typy, synchronizace, funkce pro Work-items/Work-Groups [12] ;
- kvalifikátory typu paměti: __global, __local, __constant, __private;
- různé sady vestavěných funkcí.
Příklady
Příklad výpočtu FFT :
[13]
// vytvoření výpočetního kontextu pro kontext GPU (grafická karta)
= clCreateContextFromType ( NULL , CL_DEVICE_TYPE_GPU , NULL , NULL , NULL ) ;
// vytvoření
fronty příkazů = clCreateCommandQueue ( context , NULL , 0 , NULL );
// alokace paměti ve formě bufferů
memobjs [ 0 ] = clCreateBuffer ( kontext , CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR , sizeof ( float ) * 2 * num_entries , srcA , NULL );
memobjs [ 1 ] = clCreateBuffer ( kontext , CL_MEM_READ_WRITE , sizeof ( float ) * 2 * num_entries , NULL , NULL );
// vytvoření programu ze zdrojového
programu = clCreateProgramWithSource ( context , 1 , & fft1D_1024_kernel_src , NULL , NULL );
// zkompilujte program
clBuildProgram ( program , 0 , NULL , NULL , NULL , NULL );
// vytvoření objektu jádra z kompilovaného programu
kernel = clCreateKernel ( program , "fft1D_1024" , NULL );
// připravíme argumenty
clSetKernelArg ( kernel , 0 , sizeof ( cl_mem ), ( void * ) & memobjs [ 0 ]);
clSetKernelArg ( kernel , 1 , sizeof ( cl_mem ), ( void * ) & memobjs [ 1 ]);
clSetKernelArg ( kernel , 2 , sizeof ( float ) * ( local_work_size [ 0 ] + 1 ) * 16 , NULL );
clSetKernelArg ( kernel , 3 , sizeof ( float ) * ( local_work_size [ 0 ] + 1 ) * 16 , NULL );
// nastavení rozsahu ND s rozměry pracovní položky a její odeslání do
fronty provádění global_work_size [ 0 ] = num_entries ;
local_work_size [ 0 ] = 64 ;
clEnqueueNDRangeKernel ( fronta , jádro , 1 , NULL , global_work_size , local_work_size , 0 , NULL , NULL );
Přímé výpočty (založené na Fitting FFT na G80 Architecture report) [14] :
// Tento kód vypočítá FFT délky 1024 rozdělením na 16, 16 a 4
__kernel void fft1D_1024 ( __global float2 * in , __global float2 * out ,
__local float * sMemx , __local float * sMemy ) {
int tid = get_local_id ( 0 );
int blockIdx = get_group_id ( 0 ) * 1024 + tid ;
float2data [ 16 ] ;
// adresa začátku zpracovávaných dat v globální paměti
in = in + blockIdx ; out = out + blockIdx ;
globalLoads ( data , in , 64 ); // sloučené globální čtení fftRadix16Pass ( data ); // in-place radix-16 pass twiddleFactorMul ( data , tid , 1024 , 0 );
// místní náhodné přehrávání pomocí lokální paměti
localShuffle ( data , sMemx , sMemy , tid , ((( tid & 15 ) * 65 ) + ( tid >> 4 )));
fftRadix16Pass ( data ); // in-place radix-16 pass twiddleFactorMul ( data , tid , 64 , 4 ); // násobení faktoru twiddle
localShuffle ( data , sMemx , sMemy , tid , ((( tid >> 4 ) * 64 ) + ( tid & 15 )));
// 4 FFT volání řádu 4
fftRadix4Pass ( data ); // číslo funkce radix-4 1 fftRadix4Pass ( data + 4 ); // číslo funkce radix-4 2 fftRadix4Pass ( data + 8 ); // číslo funkce radix-4 3 fftRadix4Pass ( data + 12 ); // číslo funkce radix-4 4
// coalesced global zapisuje
globalStores ( data , out , 64 );
}
Plná implementace FFT v OpenCL je k dispozici na webu Apple [15] .
Aplikace
OpenCL se používá jako jedna z implementací obecného konceptu GPU v různém softwaru.
- WinZip v16.5 ( 2012 ) od společnosti Corel - kromě aktualizovaného enginu pro zlepšení optimalizace pro vícejádrové procesory byla přidána podpora OpenCL pro GPU AMD (nikoli však pro Intel a Nvidia) - přičemž zvýšení výkonu v tomto aplikace na APU Trinity a Llano byla až 45 %. [16]
Viz také
Poznámky
- ↑ AMD podporuje přijetí průmyslových standardů ve vývoji softwaru GPGPU . AMD. Archivováno z originálu 19. března 2012. (neurčitý)
- ↑ AMD podporuje OpenCL, Microsoft DirectX 11 . eTýden. Archivováno z originálu 19. března 2012. (neurčitý)
- ↑ Apple představil vývojářům Mac OS X Snow Leopard . Jablko. Archivováno z originálu 19. března 2012. (neurčitý)
- ↑ Andrew Humber. NVIDIA vydává ovladač OpenCL pro vývojáře . NVIDIA (20. dubna 2009). - Původní zprávy na oficiálních stránkách NVIDIA Corporation. Získáno 21. dubna 2009. Archivováno z originálu 19. března 2012.
- ↑ Pavel Šubský. NVIDIA otevřela GPGPU pro vývojáře pod OpenCL (unavailable link) . Igromania (časopis) (21. dubna 2009). Získáno 21. dubna 2009. Archivováno z originálu 25. dubna 2009. (neurčitý)
- ↑ Sergej a Marina Bondarenkovi. Ovladač OpenCL pro vývojáře od společnosti NVIDIA . 3DNews (21. dubna 2009). Získáno 21. dubna 2009. Archivováno z originálu 23. dubna 2009. (neurčitý)
- ↑ Khronos vydává OpenCL 2.0 . khronos.org (22. července 2013). Získáno 22. července 2013. Archivováno z originálu 17. srpna 2013.
- ↑ Khronos dokončuje specifikaci OpenCL 2.0 pro heterogenní výpočty , Khronos Group ( 18. listopadu 2013). Archivováno 11. listopadu 2020. Staženo 20. listopadu 2013.
- ↑ Khronos Group vydává prozatímní specifikace OpenCL 3.0 . Khronos Group (27. dubna 2020). Získáno 27. dubna 2020. Archivováno z originálu dne 18. ledna 2021.
- ↑ Dokončena specifikace OpenCL 3.0 a vydán počáteční Khronos Open Source OpenCL SDK . Khronos Group (30. září 2020). Získáno 30. září 2020. Archivováno z originálu dne 30. září 2020.
- ↑ 1 2 3 Implementace technologie WebCL představená pro WebKit . opennet.ru (4. července 2011). Získáno 31. října 2011. Archivováno z originálu 18. května 2012. (Ruština)
- ↑ 12 AMD . Úvod do programování OpenCL 201005, strana 89-90
- ↑ OpenCL . SIGGRAPH2008 (14. srpna 2008). Získáno 14. srpna 2008. Archivováno z originálu 19. března 2012. (neurčitý)
- ↑ Přizpůsobení FFT na architekturu G80 (PDF). Vasily Volkov a Brian Kazian, zpráva o projektu CS258 UC Berkeley (květen 2008). Získáno 14. listopadu 2008. Archivováno z originálu 19. března 2012.
(neurčitý)
- ↑ .
OpenCL na FFT (nedostupný odkaz) . Apple (16. listopadu 2009). Získáno 7. prosince 2009. Archivováno z originálu dne 30. listopadu 2009. (neurčitý)
- ↑ AMD Trinity Benchmarks – OpenCL Archivováno 29. srpna 2012 na Wayback Machine // THG
Literatura
- Aaftab Munshi; Benedict R. Gaster; Timothy G. Mattson; James Fung; Dan Ginsburg. Průvodce programováním OpenCL. - Addison-Wesley Professional, 2011. - 648 s. — ISBN 978-0-321-74964-2 .
Odkazy