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 ( 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.
- Noi tipuri de date, inclusiv vectori cu 3 componente și formate suplimentare de imagine.
- Procesarea comenzilor de la mai multe fire de execuție gazdă și procesarea tamponului între mai multe dispozitive.
- Operațiuni cu regiuni tampon, inclusiv citirea, scrierea și copierea regiunilor dreptunghiulare 1D, 2D sau 3D.
- Utilizarea extinsă a evenimentului pentru a gestiona și controla execuția comenzilor.
- Interoperabilitate îmbunătățită cu OpenGL prin partajarea eficientă a imaginilor.
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.
- Partiționarea dispozitivului este capacitatea de a partiționa un dispozitiv în mai multe subdispozitive la nivel de aplicație OpenCL pentru a lega direct joburi la anumite unități de calcul, pentru a rezerva resurse pentru sarcini cu prioritate mai mare sau pentru a partaja mai eficient resurse hardware, cum ar fi memoria cache.
- Compilarea și legarea separată a obiectelor - a devenit posibilă crearea de biblioteci dinamice care permit utilizarea rutinelor implementate anterior cu calcule OpenCL în programe terțe.
- Suport extins pentru imagini, inclusiv capacitatea de a lucra cu imagini 1D și matrice de imagini 1D sau 2D. În plus, extensia de partajare adaugă posibilitatea de a crea o imagine OpenCL bazată pe texturi sau matrice de texturi OpenGL individuale.
- Nucleele OpenCL încorporate vă permit acum să profitați de hardware-ul personalizat sau neprogramabil și de firmware-ul asociat. De exemplu, a devenit posibilă utilizarea capabilităților și integrarea mai strânsă cu cadrul OpenCL a dispozitivelor precum procesoarele DSP sau codificatoarele / decodoarele video.
- Abilitatea de a partaja fără probleme suprafețe (Media Surface Sharing) între OpenCL și API DirectX 9/11.
OpenCL 2.0 a fost introdus pe 22 iulie 2013 [7] și standardizat pe 18 noiembrie a aceluiași an [8] .
- Memorie virtuală partajată - Permite nucleelor gazdei și dispozitivelor să partajeze structuri de date bazate pe referințe complexe de adrese, eliminând transferurile explicite între gazdă și dispozitive, sporind în același timp flexibilitatea programării.
- Paralelism imbricat - Actualizarea a îmbunătățit experiența de programare și a crescut performanța aplicației.
- Spațiu de adresă universal - Vă permite să scrieți funcții fără a numi un spațiu de adrese, ceea ce crește flexibilitatea și economisește timp prin eliminarea necesității de a scrie mai multe funcții.
- Operațiuni atomice C11 pe partea dispozitivului - Un subset de operațiuni atomice și de sincronizare C11 permite execuția paralelă a firelor de execuție să funcționeze în siguranță pe seturi de date partajate.
- Canale - Obiecte de memorie organizate într-o manieră FIFO, care simplifică structurile de date ale unei cozi partajate.
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
- 3 martie 2011 — Grupul Khronos anunță crearea grupului de lucru WebCL pentru a dezvolta o interfață JavaScript conform standardului OpenCL. Acest lucru creează potențialul de a utiliza GPU-uri și procesoare multi-core pentru a procesa calculele în paralel într-un browser web. [unsprezece]
- 4 mai 2011 - Nokia Research a lansat o extensie WebCL open source pentru browserul Firefox . [unsprezece]
- 1 iulie 2011 - Samsung Electronics a lansat un prototip WebCL deschis pentru motorul WebKit . [unsprezece]
- 8 august 2011 — AMD a lansat driverul AMD Accelerated Parallel Processing (APP) Software Development Kit (SDK) v2.5 OpenCL, înlocuind ATI Stream SDK.
- 15 noiembrie 2011 - Comitetul Khronos a lansat o specificație actualizată OpenCL 1.2. Noua versiune conține multe îmbunătățiri mici legate de flexibilitatea sporită a limbii și optimizarea performanței.
- 1 decembrie 2012 - Comitetul Khronos a lansat o altă actualizare a specificației OpenCL 1.2. Noua versiune a îmbunătățit interacțiunea cu OpenGL, a îmbunătățit securitatea în WebGL, a adăugat suport pentru încărcarea programelor OpenCL din reprezentarea intermediară SPIR.
Caracteristicile limbii
Diferențele cheie între limbajul folosit și C (standardul ISO 1999) sunt:
- lipsa suportului pentru indicatori de funcție , recursivitate , câmpuri de biți , matrice de lungime variabilă (VLA), fișiere de antet standard [12] ;
- extensii de limbaj pentru concurență: tipuri de vectori, sincronizare, funcții pentru articole de lucru/grupuri de lucru [12] ;
- calificative de tip de memorie: __global, __local, __constant, __privat;
- set diferit de funcții încorporate.
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
- ↑ AMD conduce la adoptarea standardelor industriale în dezvoltarea software-ului GPGPU . AMD. Arhivat din original pe 19 martie 2012. (nedefinit)
- ↑ AMD sprijină OpenCL, Microsoft DirectX 11 . eWeek. Arhivat din original pe 19 martie 2012. (nedefinit)
- ↑ Apple prezintă Mac OS X Snow Leopard pentru dezvoltatori . Măr. Arhivat din original pe 19 martie 2012. (nedefinit)
- ↑ 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.
- ↑ 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. (nedefinit)
- ↑ 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. (nedefinit)
- ↑ Khronos lansează OpenCL 2.0 . khronos.org (22 iulie 2013). Preluat la 22 iulie 2013. Arhivat din original la 17 august 2013.
- ↑ Khronos Finalizes OpenCL 2.0 Specification for Heterogeneous Computing , Khronos Group ( 18 noiembrie 2013). Arhivat 11 noiembrie 2020. Consultat la 20 noiembrie 2013.
- ↑ 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.
- ↑ 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.
- ↑ 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. (Rusă)
- ↑ 12 AMD . Introducere în programarea OpenCL 201005, pagina 89-90
- ↑ OpenCL . SIGGRAPH2008 (14 august 2008). Preluat la 14 august 2008. Arhivat din original la 19 martie 2012. (nedefinit)
- ↑ 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.
(nedefinit)
- ↑ .
OpenCL pe FFT (link indisponibil) . Apple (16 noiembrie 2009). Consultat la 7 decembrie 2009. Arhivat din original la 30 noiembrie 2009. (nedefinit)
- ↑ 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