OpenCL

From Wikipedia, the free encyclopedia

OpenCL
Remove ads

OpenCL (engl. ) 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.

Thumb
OpenCL


Remove ads

Istorija

OpenCL je razvijen od strane -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 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

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;
Remove ads

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 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]

Remove ads

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);
  }
Remove ads

OpenCL-saglasni proizvodi

Више информација AMD APP SDK (podržava OpenCL CPU i APU(eng. Accelerated Processing Unit) uređaje), Intel SDK za OpenCL aplikacije 2013 (podržava Intel Core procesore i Intel HD Grafiku 4000/2500) ...

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.

Remove ads

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.

Remove ads

Reference

Spoljašnje veze

Loading related searches...

Wikiwand - on

Seamless Wikipedia browsing. On steroids.

Remove ads