OpenCL

Из Википедије, слободне енциклопедије

OpenCL (engl. Open Computing Language) je framework za pisanje programa koji se izvršavaju na heterogenim platformama sačinjenim od CPU, GPU, procesora za obradu digitalnih signala, FPGA i drugih procesora. OpenCL sadrži jezik za pisanje kernela (funkcije koja se izvršava na OpenCL uređajima), plus API koji se koristi za definisanje i kontrolu platforme. OpenCL pruža paralelnu obradu preko paralelizma zadataka i paralelizma podataka. OpenCL je standard koji održava Khronos Group. Kasnije je usvojen od strane kompanija poput Apple, Intel, Qualcomm, AMD, Nvidia, Samsung.


Istorija[уреди]

OpenCL je razvijen od strane Apple-a u saradnji sa tehničkim timovima iz AMD, IBM, Qualcomm, Intel, i NVIDIA kompanija. Apple je predložio inicijalnu specifikaciju Khronos grupi. 16. Juna 2008. formirana je tzv. Khronos Compute Working grupa[1] sa predstavnicima iz kompanija za proizvodnju CPU, GPU, ugrađenih sistema i softvera. Ova grupa je radila pet meseci da bi 18. Novembra 2008. završila tehničke detalje za specifikaciju OpenCL 1.0. .[2] Ove tehničke specifikacije su pregledane od strane članova Khronos-a i dopušteno je izdavanje u javnost 8. Decembra 2008. [3]

OpenCL 1.0[уреди]

OpenCL 1.0 je pušten u javnost sa izlazkom Mac OS X Snow Leopard operativnog sistema. AMD je odlučio da podrži OpenCL umesto Close to Metal frameworka. [4][5]

9. Decembra 2008. Nvidia je izjavila nameru da pruži punu podršku za OpenCL 1.0 specifikaciju za GPU koje proizvode. [6] 30. Oktobra 2009. IBM je izdao prvu implementaciju OpenCL kao deo XL kompajlera. [7]

OpenCL 1.1[уреди]

OpenCL 1.1 je potvrđen 14. Juna 2010. i dodaje značajno poboljšanje u fleksibilnosti paralelne obrade, funkcionalnosti i performansama poput:

  • Novi tipovi podataka uključujući tro-komponentne vektore i dodatne formate za slike;
  • Upravljanje naredbama od višestrukih host niti i procesiranje bafera preko više uređaja;
  • Operacije nad regijom bafera, čitanje, pisanje i kopiranje 1D, 2D ili 3D pravougaone regije;
  • Poboljšana upotreba događaja za vođenje i kontrolu izvršenja naredbi;

OpenCL 1.2[уреди]

Khronos je najavio OpenCL 1.2 specifikacije 15. Novembra 2011. OpenCL 1.2 dodaje značajnu funkcionalnost u odnosu na prethodne verzije, kao i poboljšanje performansi i novine za fleksibilnije paralelno programiranje. Najznačajnije novine su:

  • Particija uređaja: mogućnost da se izvrši particija uređaja na manje celine tako da se posao može dodeliti individualnim jedinicama za obradu. Ovo je korisno za rezervisanje područija uređaja da bi se smanjilo kašnjenje za poslove kod kojih vreme igra ključnu ulogu;
  • Podeljeno kompajliranje i linkovanje objekata: mogućnost da kompajliramo OpenCL u vanjske biblioteke kako bi ih koristili u drugim programima;
  • Poboljšana podrška za slike: 1.2 dodaje podršku za 1D i 1D/2D nizove za rad sa slikama;
  • Ugrađeni kernel: kernel može biti pozvan da koristi specijalne aspekte hardvera. Na primer, video kodiranje/dekodiranje i obrada digitalnih signala;
  • DirectX funkcionalnost;

OpenCL 2.0[уреди]

U Julu 2013. puštene su privremene specifikacije za OpenCL 2.0. [8] Dodaci i novine koje donosi OpenCL 2.0 čine:

  • Deljena virtuelna memorija;
  • Dinamički paralelizam;
  • Generički adresni prostor;
  • Slike;
  • Cevi;
  • Ekstenzija za Android;

Implementacija[уреди]

OpenCL se sastoji od skupa zaglavlja i deljenih objekata koji se učitavaju za vreme izvršavanja. Klijent za učitavanje drajvera (ICD loader) se mora instalirati na platformi za svaku klasu proizvođača da bi se omogućila podrška za izvršavanje OpenCL. Na primer, da bi se omogućila podrška za NVIDIA uređaje na Linux platformi, NVIDIA ICD se mora instalirati kako bih OpenCL tokom izvršavanja mogao da pronađe ICD proizvođača i preusmeri pozive korektno. Svaki proizvođač mora implementirati svaki OpenCL poziv u drajveru.[9]

OpenCL jezik[уреди]

Programski jezik za pisanje izvršnog kernela se bazira na C99 standardu sa nekim ograničenjima, kao i dodacima. Izostavljeni su pokazivači na funkcije, rekurzija, polja bitova, nizovi promenljive veličine i standardna C99 zaglavlja.[10] Jezik je nadograđen za jednostavnu upotrebu paralelizma sa vektorskim tipovima i operacijama, i sinhronizacijom. [11] Poseduje memorijske kvalifikatore: __global, __local, __constant, i __private.

Primer: računanje FFT[уреди]

Ovaj primer učitava implementaciju za računanje brze Furijerove transformacije (FFT).

[12]

  context = clCreateContextFromType(NULL, CL_DEVICE_TYPE_GPU, NULL, NULL, NULL);
 
  clGetDeviceIDs( NULL, CL_DEVICE_TYPE_DEFAULT, 1, &device_id, NULL );
  queue = clCreateCommandQueue(context, device_id, 0, NULL);
 
  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);
 
  program = clCreateProgramWithSource(context, 1, &fft1D_1024_kernel_src, NULL, NULL);
 
  clBuildProgram(program, 0, NULL, NULL, NULL, NULL);
 
  kernel = clCreateKernel(program, "fft1D_1024", NULL);
 
  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);
 
  global_work_size[0] = num_entries;
  local_work_size[0] = 64; //Nvidia: 192 or 256
  clEnqueueNDRangeKernel(queue, kernel, 1, NULL, global_work_size, local_work_size, 0, NULL, NULL);

Računanje FFT-a: (zasnovano na Fitting FFT onto the G80 Architecture):[13]

  // Ovaj kernel računa FFT dužine 1024. 
 
  __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;
    float2 data[16];
 
    in = in + blockIdx;  out = out + blockIdx;
 
    globalLoads(data, in, 64); 
    fftRadix16Pass(data);      
    twiddleFactorMul(data, tid, 1024, 0);
 
    localShuffle(data, sMemx, sMemy, tid, (((tid & 15) * 65) + (tid >> 4)));
    fftRadix16Pass(data);               
    twiddleFactorMul(data, tid, 64, 4); 
 
    localShuffle(data, sMemx, sMemy, tid, (((tid >> 4) * 64) + (tid & 15)));
 
    fftRadix4Pass(data);      
    fftRadix4Pass(data + 4);  
    fftRadix4Pass(data + 8);  
    fftRadix4Pass(data + 12); 
 
    globalStores(data, out, 64);
  }

OpenCL-saglasni proizvodi[уреди]

OpenCL-saglasni products[14]
AMD APP SDK (podržava OpenCL CPU i APU(eng. Accelerated Processing Unit) uređaje) X86 + SSE2 kompaktibilni CPU 64-bit i 32-bit;[15] Linux 2.6 PC, Windows Vista/7 PC AMD Fusion E-350, E-240, C-50, C-30 with HD 6310/HD 6250 AMD Radeon/Mobility HD 6800, HD 5x00 serija, iGPU HD 6310/HD 6250 ATI FirePro Vx800 serija
Intel SDK za OpenCL aplikacije 2013[16] (podržava Intel Core procesore i Intel HD Grafiku 4000/2500) Intel procesori sa SSE (eng. Streaming SIMD Extensions) 4.1, SSE 4.2 ili AVX (eng. Advanced Vector Extensions) podrškom.[17][18] Microsoft Windows, Linux Intel Core i7, i5, i3; Druga generacija Intel Core i7/5/3, Treća generacija Intel Core procesora sa Intel HD Grafikom 4000/2500 Intel Core 2 Solo, Duo Quad, Extreme Intel Xeon 7x00,5x00,3x00
IBM serveri sa OpenCL SDK za Linux na Power VSX[19][20] IBM Power 755 (PERCS), 750 IBM BladeCenter PS70x Express IBM BladeCenter JS2x, JS43 IBM BladeCenter QS22
IBM OpenCL Common Runtime (OCR)

[21]

X86 + SSE2 kompaktibilni CPU 64-bit i 32-bit;[22] Linux 2.6 PC AMD Fusion, Nvidia Ion i Intel Core i7, i5, i3; Druga generacija Intel Core i7/5/3 AMD Radeon, Nvidia GeForce i Intel Core 2 Solo, Duo, Quad, Extreme ATI FirePro, Nvidia Quadro i Intel Xeon 7x00,5x00,3x00
Nvidia OpenCL drajveri i alati[23] Nvidia Tesla C/D/S Nvidia GeForce GTS/GT/GTX Nvidia Ion Nvidia Quadro FX/NVX/Plex

Fizija uređaja[уреди]

Fizija uređaja - uvedena u OpenCL standard sa verzijom 1.2, dopušta individualnim naredbama da se koriste za specifične oblasti uređaja. Na primer, pomoću Intel SDK možemo kreirati upit za naredbu koja se mapira direktno na individualno jezgro procesora. AMD također omogućava funkcionalnost za fiziju uređaja preko ekstenzije. Fizija uređaja se koristi u obliastima gde je potreban visoki nivo pouzdanosti.

Poređenje sa CUDA platformom[уреди]

Prirodno je da poredimo OpenCL sa CUDA platformom. Iako se obe platforme mogu izvršavati na NVIDIA GPU, ciljevi CUDA i OpenCL su različiti. Dizajnerski, CUDA je ograničena na GPU koje proizvodi NVIDIA i direktno je vezana za platformu na kojoj se izvršava. Ključna karakteristika OpenCL-a je prenosivost preko apstraktne memorije i izvršnog modela, i programer ne može da koristi direktno tehnologije vezane za GPU poput PTX (eng. Parallel Thread Execution) sve dok želi prenosivost aplikacije.

Reference[уреди]

  1. ^ „Khronos Launches Heterogeneous Computing Initiative“ (Press release). Khronos Group. 16. 6. 2008. Приступљено 18. 6. 2008.. 
  2. ^ „OpenCL gets touted in Texas“. MacWorld. November 20, 2008 Приступљено 12. 6. 2009.. 
  3. ^ „The Khronos Group Releases OpenCL 1.0 Specification“ (Press release). Khronos Group. 8. 12. 2008. Приступљено 12. 6. 2009.. 
  4. ^ „AMD Drives Adoption of Industry Standards in GPGPU Software Development“ (Press release). AMD. 6. 8. 2008. Приступљено 14. 8. 2008.. 
  5. ^ „AMD Backs OpenCL, Microsoft DirectX 11“. eWeek. 6. 8. 2008. Приступљено 14. 8. 2008.. 
  6. ^ „Nvidia Adds OpenCL To Its Industry Leading GPU Computing Toolkit“ (Press release). Nvidia. 9. 12. 2008. Приступљено 10. 12. 2008.. 
  7. ^ „OpenCL Development Kit for Linux on Power“. alphaWorks. 30. 10. 2009. Приступљено 30. 10. 2009.. 
  8. ^ „Khronos Releases OpenCL 2.0“. Khronos Group. 22. 7. 2013. Приступљено 9. 9. 2013.. 
  9. ^ OpenCL ICD specifikacija
  10. ^ AMD. Introduction to OpenCL Programming 201005, page 89-90
  11. ^ AMD. Introduction to OpenCL Programming 201005, page 89-90
  12. ^ „OpenCL“. SIGGRAPH2008. 14. 8. 2008. Приступљено 14. 8. 2008.. 
  13. ^ „Fitting FFT onto G80 Architecture“ (PDF). Vasily Volkov and Brian Kazian, UC Berkeley CS258 project report. May 2008 Приступљено November 14, 2008. 
  14. ^ „Conformant Products“ Приступљено 11. 8. 2011.. 
  15. ^ „OpenCL and the AMD APP SDK“. AMD Developer Central. developer.amd.com Приступљено 11. 8. 2011.. 
  16. ^ „About Intel OpenCL SDK 1.1“. software.intel.com. intel.com Приступљено 11. 8. 2011.. 
  17. ^ „Product Support“ Приступљено 11. 8. 2011.. 
  18. ^ „Intel OpenCL SDK - Release Notes“ Приступљено 11. 8. 2011.. 
  19. ^ „Announcing OpenCL Development Kit for Linux on Power v0.3“ Приступљено 11. 8. 2011.. 
  20. ^ „IBM releases OpenCL Development Kit for Linux on Power v0.3 - OpenCL 1.1 conformant release available“. OpenCL Lounge. ibm.com Приступљено 11. 8. 2011.. 
  21. ^ „IBM releases OpenCL Common Runtime for Linux on x86 Architecture“ Приступљено 10. 9. 2011.. 
  22. ^ „OpenCL and the AMD APP SDK“. AMD Developer Central. developer.amd.com Приступљено 10. 9. 2011.. 
  23. ^ „Nvidia Releases OpenCL Driver“ Приступљено 11. 8. 2011.. 

Spoljašnje veze[уреди]

Референце[уреди]