OpenCL

Versiunea actuală a paginii nu a fost încă examinată de colaboratori experimentați și poate diferi semnificativ de versiunea revizuită la 15 martie 2022; verificările necesită 2 modificări .
OpenCL
Tip de API
Autor Măr
Dezvoltator Grupul Khronos
Scris in C++ și C
Sistem de operare Software multiplatformă
Prima editie 28 august 2009
Platformă hardware x86_64 , IA-32 și ARM
ultima versiune 3.0.11 (6 mai 2022)
Licență EULA
Site-ul web khronos.org/opencl/
 Fișiere media la Wikimedia Commons

OpenCL ( Eng.  Open Computing Language - limbaj de calcul  deschis) este un cadru pentru scrierea de programe de calculator legate de calculul paralel pe diferite grafice și procesoare centrale , precum și FPGA . OpenCL include un limbaj de programare care se bazează pe standardul limbajului de programare C99 și o interfață de programare a aplicațiilor . OpenCL oferă paralelism la nivel de instrucțiune și la nivel de date și este o implementare a tehnicii GPGPU .. OpenCL este un standard complet deschis și nu există taxe de licență pentru utilizare.

Scopul OpenCL este de a completa standardele deschise ale industriei pentru grafica și sunetul 3D pe computer - OpenGL și , respectiv, OpenAL - cu capabilități GPU pentru calcul de înaltă performanță. OpenCL este dezvoltat și întreținut de Khronos Group , un consorțiu non-profit care include multe companii importante, inclusiv AMD , Apple , ARM , Intel , Nvidia , Sony Computer Entertainment și altele.

Istorie

OpenCL a fost dezvoltat inițial de Apple Inc. Apple a înaintat propuneri pentru dezvoltarea specificației comitetului Khronos. În curând, AMD a decis să sprijine dezvoltarea OpenCL (și DirectX 11 ), care ar trebui să înlocuiască cadrul Close to Metal . [1] [2]

Pe 16 iunie 2008, grupul de lucru Khronos Compute a fost format pentru a dezvolta specificațiile OpenCL. Include Apple , nVidia , AMD , IBM , Intel , ARM , Motorola și alte companii, inclusiv cele specializate în crearea de jocuri pe calculator. Lucrarea a fost efectuată timp de cinci luni, după care , la 9 decembrie 2008, Grupul Khronos a prezentat prima versiune a standardului.

OpenCL 1.0 a fost prezentat pentru prima dată publicului pe 9 iunie 2008 și lansat cu Mac OS X 10.6 pe 28 august 2009. [3]

Pe 5 aprilie 2009, AMD a anunțat disponibilitatea pentru descărcare a versiunii beta a ATI Stream SDK v2.0, care include limbajul de programare cu multiprocesor OpenCL.

Pe 20 aprilie 2009, nVidia a lansat un driver beta și un kit de dezvoltare software ( SDK ) cu suport pentru standardul deschis GPGPU OpenCL. Acest driver beta este destinat dezvoltatorilor care participă la programul OpenCL Early Access, care pot participa la testul beta începând cu 20 aprilie. Pentru membrii GPU Computing Registered Developers, o versiune beta a driverului OpenCL va fi disponibilă la o dată ulterioară. [4] [5] [6]

Pe 26 noiembrie 2009, nVidia a lansat un driver care acceptă OpenCL 1.0 (rev 48).

Pentru o reprezentare vizuală a modului în care tehnologia OpenCL folosește capacitățile unui sistem cu 24 de nuclee pentru a reda efecte video, se recomandă să vizionați următorul demo: [1] Arhivat 9 martie 2017 la Wayback Machine .

OpenCL 1.1 a fost introdus de grupul Khronos pe 14 iunie 2010 . Noua versiune extinde semnificativ funcționalitatea de programare paralelă, flexibilitate și performanță și adaugă noi funcții.

OpenCL 1.2 a fost introdus pe 15 noiembrie 2011 . Noua versiune conține multe îmbunătățiri mici legate de flexibilitatea sporită a limbii și optimizarea performanței. OpenCL 1.2 a adăugat o serie de inovații semnificative.

OpenCL 2.0 a fost introdus pe 22 iulie 2013 [7] și standardizat pe 18 noiembrie a aceluiași an [8] .

OpenCL 2.1 a fost introdus pe 3 martie 2015 și standardizat pe 16 noiembrie a aceluiași an. A rescris nucleul din C în C++14 .

OpenCL 3.0 a fost introdus pe 27 aprilie 2020 [9] și standardizat la 30 septembrie a aceluiași an [10] . Modificările notabile includ faptul că API-ul OpenCL 3.0 acoperă acum toate versiunile OpenCL (1.2, 2.x), fără a furniza specificații separate pentru fiecare versiune.

Evenimente

Caracteristicile limbii

Diferențele cheie între limbajul folosit și C (standardul ISO 1999) sunt:

Exemple

Exemplu de calcul FFT : [13]

// crearea unui context de calcul pentru GPU (placa video) context = clCreateContextFromType ( NULL , CL_DEVICE_TYPE_GPU , NULL , NULL , NULL ); // creează o coadă de comenzi coadă = clCreateCommandQueue ( context , NULL , 0 , NULL ); // alocare de memorie sub formă de buffer -uri memobjs [ 0 ] = clCreateBuffer ( context , CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR , sizeof ( float ) * 2 * num_entries , srcA , NULL ); memobjs [ 1 ] = clCreateBuffer ( context , CL_MEM_READ_WRITE , sizeof ( float ) * 2 * num_entries , NULL , NULL ); // creează un program din programul sursă = clCreateProgramWithSource ( context , 1 , & fft1D_1024_kernel_src , NULL , NULL ) ; // compilați programul clBuildProgram ( program , 0 , NULL , NULL , NULL , NULL ); // creează un obiect kernel dintr-un program compilat kernel = clCreateKernel ( program , "fft1D_1024" , NULL ); // pregătește argumentele 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 ); // setarea intervalului ND cu dimensiunile articolului de lucru și trimiterea acestuia în coada de execuție global_work_size [ 0 ] = num_entries ; local_work_size [ 0 ] = 64 ; clEnqueueNDRangeKernel ( coada , nucleu , 1 , NULL , dimensiune_luc_global , dimensiune_luc_local , 0 , NULL , NULL );

Calcule directe (bazate pe Fitting FFT on the G80 Architecture report) [14] :

// Acest cod calculează FFT de lungime 1024 împărțindu-l în 16, 16 și 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 începutului datelor procesate în memoria globală în = în + blockIdx ; out = out + blockIdx ; globalLoads ( date , în , 64 ); // citirile globale combinate fftRadix16Pass ( date ); // in-place radix-16 pass twiddleFactorMul ( data , tid , 1024 , 0 ); // amestecare locală folosind memoria locală localShuffle ( data , sMemx , sMemy , tid , ((( tid & 15 ) * 65 ) + ( tid >> 4 ))); fftRadix16Pass ( date ); // in-place radix-16 pass twiddleFactorMul ( data , tid , 64 , 4 ); // twiddle factor multiplicare localShuffle ( date , sMemx , sMemy , tid , ((( tid >> 4 ) * 64 ) + ( tid & 15 ))); // 4 apeluri FFT de comandă 4 fftRadix4Pass ( date ); // funcția radix-4 numărul 1 fftRadix4Pass ( data + 4 ); // funcția radix-4 numărul 2 fftRadix4Pass ( data + 8 ); // numărul funcției radix-4 3 fftRadix4Pass ( date + 12 ); // funcția radix-4 numărul 4 // global scrie globalStores ( date , out , 64 ); }

O implementare completă a FFT în OpenCL este disponibilă pe site-ul Apple [15] .

Aplicație

OpenCL este utilizat, ca una dintre implementările conceptului GPU de uz general , în diverse programe software.

  • WinZip v16.5 ( 2012 ) de la Corel  - pe lângă motorul actualizat pentru a-și îmbunătăți optimizarea pentru procesoarele cu mai multe nuclee, a fost adăugat suport OpenCL pentru GPU-urile AMD (cu toate acestea, nu pentru Intel și Nvidia) - în timp ce performanța crește în acest aplicația pe APU Trinity și Llano a fost de până la 45%. [16]

Vezi și

Note

  1. AMD conduce la adoptarea standardelor industriale în dezvoltarea software-ului GPGPU . AMD. Arhivat din original pe 19 martie 2012.
  2. AMD sprijină OpenCL, Microsoft DirectX 11 . eWeek. Arhivat din original pe 19 martie 2012.
  3. Apple prezintă Mac OS X Snow Leopard pentru dezvoltatori . Măr. Arhivat din original pe 19 martie 2012.
  4. Andrew Humber. NVIDIA lansează driverul OpenCL pentru  dezvoltatori . NVIDIA (20 aprilie 2009). - Știri originale pe site-ul oficial al NVIDIA Corporation. Consultat la 21 aprilie 2009. Arhivat din original pe 19 martie 2012.
  5. Pavel Shubsky. NVIDIA a deschis GPGPU pentru dezvoltatori sub OpenCL (link indisponibil) . Igromania (revista) (21 aprilie 2009). Consultat la 21 aprilie 2009. Arhivat din original pe 25 aprilie 2009. 
  6. Serghei și Marina Bondarenko. Driver OpenCL pentru dezvoltatori de la NVIDIA . 3DNews (21 aprilie 2009). Consultat la 21 aprilie 2009. Arhivat din original pe 23 aprilie 2009.
  7. Khronos lansează OpenCL  2.0 . khronos.org (22 iulie 2013). Preluat la 22 iulie 2013. Arhivat din original la 17 august 2013.
  8. Khronos Finalizes OpenCL 2.0 Specification for Heterogeneous Computing , Khronos Group  ( 18 noiembrie 2013). Arhivat 11 noiembrie 2020. Consultat la 20 noiembrie 2013.
  9. ↑ Khronos Group lansează specificațiile provizorii OpenCL 3.0  . Grupul Khronos (27 aprilie 2020). Preluat la 27 aprilie 2020. Arhivat din original la 18 ianuarie 2021.
  10. Finalizarea specificației OpenCL 3.0 și lansarea inițială a SDK-ului OpenCL pentru Khronos Open  Source . Grupul Khronos (30 septembrie 2020). Preluat la 30 septembrie 2020. Arhivat din original la 30 septembrie 2020.
  11. 1 2 3 Implementarea tehnologiei WebCL prezentată pentru WebKit . opennet.ru (4 iulie 2011). Consultat la 31 octombrie 2011. Arhivat din original la 18 mai 2012.
  12. 12 AMD . Introducere în programarea OpenCL 201005, pagina 89-90
  13. OpenCL . SIGGRAPH2008 (14 august 2008). Preluat la 14 august 2008. Arhivat din original la 19 martie 2012.
  14. Montarea FFT pe arhitectura G80 (PDF). Vasily Volkov și Brian Kazian, raport de proiect UC Berkeley CS258 (mai 2008). Consultat la 14 noiembrie 2008. Arhivat din original la 19 martie 2012.
  15. . OpenCL pe FFT (link indisponibil) . Apple (16 noiembrie 2009). Consultat la 7 decembrie 2009. Arhivat din original la 30 noiembrie 2009. 
  16. AMD Trinity Benchmarks - OpenCL Arhivat 29 august 2012 la Wayback Machine // THG

Literatură

  • Aaftab Munshi; Benedict R. Gaster; Timothy G. Mattson; James Fung; Dan Ginsburg. Ghid de programare OpenCL. - Addison-Wesley Professional, 2011. - 648 p. — ISBN 978-0-321-74964-2 .

Link -uri