OpenCL
OpenCL () 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 
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
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.
.
Ove tehničke specifikacije su pregledane od strane članova Khronos-a i dopušteno je izdavanje u javnost 8. Decembra 2008.

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.

9. Decembra 2008. Nvidia je izjavila nameru da pruži punu podršku za OpenCL 1.0 specifikaciju za GPU koje proizvode.

30. Oktobra 2009. IBM je izdao prvu implementaciju OpenCL kao deo XL kompajlera.

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.

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

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.
Jezik je nadograđen za jednostavnu upotrebu paralelizma sa vektorskim tipovima i operacijama, i sinhronizacijom.

Poseduje memorijske kvalifikatore: __global, __local, __constant, i __private.

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

  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):
  // 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

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

Spoljašnje veze 

 
 

Паралелна обрада
GPGPU
Апликациони програмски интерфејс
Софтвер 2009.
Вишеплатформски софтвер
OpenCL ( ) 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 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 . Juna formirana je tzv. Khronos Compute Working grupa sa predstavnicima iz kompanija za proizvodnju CPU , GPU , ugrađenih sistema i softvera . Ova grupa je radila pet meseci da bi Novembra završila tehničke detalje za specifikaciju OpenCL0 . . Ove tehničke specifikacije su pregledane od strane članova Khronos-a i dopušteno je izdavanje u javnost Decembra OpenCL0 OpenCL0 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. 9. Decembra Nvidia je izjavila nameru da pruži punu podršku za OpenCL0 specifikaciju za GPU koje proizvode. 30. Oktobra IBM je izdao prvu implementaciju OpenCL kao deo XL kompajlera . OpenCL1 OpenCL1 je potvrđen Juna 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 , ili pravougaone regije ; Poboljšana upotreba događaja za vođenje i kontrolu izvršenja naredbi ; OpenCL2 Khronos je najavio OpenCL2 specifikacije Novembra OpenCL2 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 :2 dodaje podršku za i / 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 ; OpenCL0 U Julu puštene su privremene specifikacije za OpenCL0. Dodaci i novine koje donosi OpenCL0 č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 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 . 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 . Jezik je nadograđen za jednostavnu upotrebu paralelizma sa vektorskim tipovima i operacijama , i sinhronizacijom . Poseduje memorijske kvalifikatore : __global , __local , __constant , i __private . Primer : računanje FFT Ovaj primer učitava implementaciju za računanje brze Furijerove transformacije ( FFT ). context = clCreateContextFromType( NULL , CL_DEVICE_TYPE_GPU , NULL , NULL , NULL ) ; clGetDeviceIDs ( NULL , CL_DEVICE_TYPE_DEFAULT , &device_id , NULL ) ; queue = clCreateCommandQueue( context , device_id , 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 , &fft1D_1024_kernel_src , NULL , NULL ) ; clBuildProgram( program , NULL , NULL , NULL , NULL ) ; kernel = clCreateKernel( program , " fft1D_1024 " , NULL ) ; clSetKernelArg( kernel , sizeof( cl_mem ) , ( void * ) &memobjs[ 0 ] ) ; clSetKernelArg( kernel , sizeof( cl_mem ) , ( void * ) &memobjs[ 1 ] ) ; clSetKernelArg( kernel , sizeof( float ) *( local_work_size[ 0 ]+1 ) *16 , NULL ) ; clSetKernelArg( kernel , sizeof( float ) *( local_work_size[ 0 ]+1 ) *16 , NULL ) ; global_work_size[ 0 ] = num_entries ; local_work_size[ 0 ] = / / Nvidia:or clEnqueueNDRangeKernel( queue , kernel , NULL , global_work_size , local_work_size , NULL , NULL ) ; Računanje FFT-a : ( zasnovano na Fitting FFT onto the G80 Architecture ) : / / Ovaj kernel računa FFT dužine __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 ) *+ tid ; float2 data[ 16 ] ; in = in + blockIdx ; out = out + blockIdx ; globalLoads( data , in , fftRadix16Pass( data ) ; twiddleFactorMul( data , tid , localShuffle( data , sMemx , sMemy , tid , ( ( ( tid & *+ ( tid >> ) ; fftRadix16Pass( data ) ; twiddleFactorMul( data , tid , localShuffle( data , sMemx , sMemy , tid , ( ( ( tid >> *+ ( tid & ) ; fftRadix4Pass( data ) ; fftRadix4Pass( data + fftRadix4Pass( data + fftRadix4Pass( data + globalStores( data , out , } OpenCL-saglasni proizvodi Fizija uređaja Fizija uređaja - uvedena u OpenCL standard sa verzijom2 , 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 Spoljašnje veze Паралелна обрада GPGPU Апликациони програмски интерфејс Софтвер Вишеплатформски софтвер