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
Typ API
Autor Jablko
Vývojář Skupina Khronos
Zapsáno v C++ a C
Operační systém Multiplatformní software
První vydání 28. srpna 2009
Hardwarová platforma x86_64 , IA-32 a ARM
Nejnovější verze 3.0.11 (6. května 2022)
Licence EULA
webová stránka khronos.org/opencl/
 Mediální soubory na Wikimedia Commons

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.

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í.

OpenCL 2.0 bylo představeno 22. července 2013 [7] a standardizováno 18. listopadu téhož roku [8] .

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

Vlastnosti jazyka

Klíčové rozdíly mezi použitým jazykem a C (norma ISO 1999) jsou:

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

  1. AMD podporuje přijetí průmyslových standardů ve vývoji softwaru GPGPU . AMD. Archivováno z originálu 19. března 2012.
  2. AMD podporuje OpenCL, Microsoft DirectX 11 . eTýden. Archivováno z originálu 19. března 2012.
  3. Apple představil vývojářům Mac OS X Snow Leopard . Jablko. Archivováno z originálu 19. března 2012.
  4. 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.
  5. 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. 
  6. 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.
  7. 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.
  8. 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.
  9. ↑ 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.
  10. 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.
  11. 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.
  12. 12 AMD . Úvod do programování OpenCL 201005, strana 89-90
  13. OpenCL . SIGGRAPH2008 (14. srpna 2008). Získáno 14. srpna 2008. Archivováno z originálu 19. března 2012.
  14. 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.
  15. . OpenCL na FFT (nedostupný odkaz) . Apple (16. listopadu 2009). Získáno 7. prosince 2009. Archivováno z originálu dne 30. listopadu 2009. 
  16. 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