OpenCL

S Vikipedije, slobodne enciklopedije
OpenCL

OpenCL (engl. Open Computing Language) je programski okvir 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[uredi | uredi izvor]

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[uredi | uredi izvor]

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 programskog okvira. [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[uredi | uredi izvor]

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[uredi | uredi izvor]

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[uredi | uredi izvor]

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[uredi | uredi izvor]

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 bi 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[uredi | uredi izvor]

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[uredi | uredi izvor]

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[uredi | uredi izvor]

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] 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 Архивирано на сајту Wayback Machine (9. август 2011) 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) Архивирано на сајту Wayback Machine (14. јун 2011)

[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[uredi | uredi izvor]

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[uredi | uredi izvor]

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[uredi | uredi izvor]

  1. ^ „Khronos Launches Heterogeneous Computing Initiative” (Саопштење). Khronos Group. 16. 6. 2008. Архивирано из оригинала 20. 6. 2008. г. Приступљено 18. 6. 2008. 
  2. ^ „OpenCL gets touted in Texas”. MacWorld. 20. 11. 2008. Приступљено 12. 6. 2009. 
  3. ^ „The Khronos Group Releases OpenCL 1.0 Specification” (Саопштење). Khronos Group. 8. 12. 2008. Архивирано из оригинала 13. 7. 2010. г. Приступљено 12. 6. 2009. 
  4. ^ „AMD Drives Adoption of Industry Standards in GPGPU Software Development” (Саопштење). AMD. 6. 8. 2008. Приступљено 14. 8. 2008. 
  5. ^ „AMD Backs OpenCL, Microsoft DirectX 11”. eWeek. 6. 8. 2008. Архивирано из оригинала 19. 03. 2012. г. Приступљено 14. 8. 2008. 
  6. ^ „Nvidia Adds OpenCL To Its Industry Leading GPU Computing Toolkit” (Саопштење). Nvidia. 9. 12. 2008. Приступљено 10. 12. 2008. 
  7. ^ „OpenCL Development Kit for Linux on Power”. alphaWorks. 30. 10. 2009. Архивирано из оригинала 09. 08. 2011. г. Приступљено 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 Архивирано на сајту Wayback Machine (16. мај 2011), page 89-90
  11. ^ AMD. Introduction to OpenCL Programming 201005, page 89-90
  12. ^ „OpenCL” (PDF). SIGGRAPH2008. 14. 8. 2008. Архивирано из оригинала (PDF) 19. 03. 2012. г. Приступљено 14. 8. 2008. 
  13. ^ „Fitting FFT onto G80 Architecture” (PDF). Vasily Volkov and Brian Kazian, UC Berkeley CS258 project report. maj 2008. Приступљено 14. 11. 2008. 
  14. ^ „Conformant Products”. Приступљено 11. 8. 2011. 
  15. ^ „OpenCL and the AMD APP SDK”. AMD Developer Central. developer.amd.com. Архивирано из оригинала 6. 9. 2011. г. Приступљено 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. Архивирано из оригинала 6. 9. 2011. г. Приступљено 10. 9. 2011. 
  23. ^ „Nvidia Releases OpenCL Driver”. Приступљено 11. 8. 2011. 

Spoljašnje veze[uredi | uredi izvor]