OpenCL
From Wikipedia, the free encyclopedia
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.

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).
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
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
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads