Skaper | eple |
---|---|
Utviklet av | Khronos Group |
Første versjon | 28. august 2009 |
Siste versjon | 3,0 (30. september 2020) |
Skrevet i | C og C ++ |
Operativsystem | Microsoft Windows , macOS , Linux , FreeBSD og Android |
Miljø | X86_64 , IA-32 ( in ) og ARM-arkitektur |
Type |
Framework Programmeringsspråk |
Tillatelse | Åpen kildekode lisens ( d ) |
Nettsted | www.khronos.org/opencl |
OpenCL ( Open C omputing L anguage ) er kombinasjonen av et API og et programmeringsspråk avledet fra C , foreslått som en åpen standard av Khronos Group . OpenCL er designet for å programmere heterogene parallelle systemer som for eksempel består av både en flerkjerners CPU og en GPU . OpenCL tilbyr derfor en programmeringsmodell som ligger i det nye skjæringspunktet mellom CPUer og GPUer , førstnevnte mer og mer parallelle, sistnevnte mer og mer programmerbare.
OpenCL skiller vertsprosessoren (sentral prosessor som fungerer som leder) fra eksterne enheter (CPU, GPU eller annet) hvis oppgave er å kjøre beregningskrevende kjerner. OpenCL skiller derfor på den ene siden applikasjonen som kjører på vertsprosessoren (og som vil kalle OpenCL API), og på den andre siden kjernene som er programmert i OpenCL-C (og hvis kall er å kjøre på enheter).
OpenCL gjør det mulig å uttrykke oppgavens parallellitet, men også dataparallellisme i to former; SPMD ( Single Program Multiple Data ) og SIMD ( Single Instruction Multiple Data ), alt på en hierarkisk måte. En oppgavediagram kan opprettes dynamisk via OpenCL API. Hver oppgave kan representeres enten som en enkelt forekomst (kalt oppgave) eller som en samling forekomster (kalt NDRange) av samme kjerne. NDRanges kan være 1, 2 eller 3 dimensjoner. Hver kjerne eksempel tilhører en NDRange kalles en work-element . NDrange kan selv struktureres i arbeidsgrupper , som gjør at arbeidselementer i arbeidsgrupper kan dele data og synkronisere seg via barrierer.
Hvis OpenCL blant noen av de tekniske målene ser ut til å være nærmere C for CUDA , den proprietære programmeringsmodellen til selskapet Nvidia, har OpenCL bredere mål fordi den ikke bare er dedikert til GPUer. I verden med høy ytelse databehandling eller spill, vil OpenCL gjøre det mulig å dra nytte av kraften til grafikkprosessorer, flerkjerners CPUer eller andre intensive databehandlingssystemer som IBMs CELL , som spesielt utstyrer PlayStation 3 med Sony. I verden av innebygde systemer på en chip ( SoC ), slik som de finnes i smarttelefoner , vil OpenCL gi tilgang, via en unik programmeringsinfrastruktur, til sentralprosessoren, samt til de forskjellige innebygde multimedia-undersystemene (GPU, DSP , databehandling eller andre).
Det er for tiden få måter å feilsøke OpenCL-kjerner på. For det første støtter NVIDIA Parallel Nsight- feilsøkingsprogrammet , som er i stand til å feilsøke CUDA tråd for tråd, for øyeblikket ikke OpenCL, men lar bare API-samtaler spores . Deretter foreslår AMD en utvidelse som gjør det mulig å sette spor direkte i OpenCL-koden (cl_amd_printf). Til slutt, et program kalt gDebugger (av Gremedy deretter av AMD ) lar deg følge fremdriften til algoritmen tråd for tråd. gDebugger har utviklet seg, heter nå CodeXL og er vert for GPUOPEN- initiativet .
OpenCL ble opprinnelig designet av Apple (som registrerte varemerket), og raffinert i samarbeid med AMD , Intel og Nvidia . Apple sender først sitt første forslag til Khronos Group . De16. juni 2008ble Khronos Compute Working Group dannet, som består av representanter for produsenter av maskinvare og programvare. Han jobbet i fem måneder for å fullføre de tekniske detaljene i OpenCL 1.0- spesifikasjonen . Spesifikasjonen blir gjennomgått av Khronos-medlemmer og godkjent for prøveversjon den8. desember. En ny versjon, OpenCL 1.1 , er utgitt ijuni 2010av Khronos Group . OpenCL 1.1 klargjør noen aspekter av den forrige spesifikasjonen og gir ny funksjonalitet som subbuffere , 3-elementvektorer, brukerhendelser, nye innebygde funksjoner , standardstøtte for valgfrie 1.0- utvidelser (for eksempel funksjoner 32-biters atom).
OpenCL er integrert i Mac OS X 10.6 ( Snow Leopard ). AMD bestemmer seg for å støtte OpenCL og DirectX 11 i stedet for nær Metal i Stream SDK-rammeverket . RapidMind (in) kunngjør adopsjonen av OpenCL i sin plattformutvikling for å støtte grafikkprosessorer fra forskjellige produsenter med et enkelt grensesnitt. Nvidia bekrefter også9. desember 2008full støtte for 1.0-spesifikasjonen i GPU Computing Toolkit .
De 15. november 2011, Khronos Group ga ut spesifikasjonene for OpenCL 1.2 . Den inkluderer funksjoner relatert til mobilitet og bærbarhet, for eksempel med muligheten for å dissosiere kompilering og redigering av kjernelinker .
Khronos Group har også utviklet en integrering av OpenCL, et parallelt databibliotek, i alle HTML5- programmeringsgrensesnitt . For øyeblikket bruker nettlesere utvidelser til å administrere OpenCL.
Nokia og Mozilla har utviklet utvidelser for Firefox. Samsung til WebKit og Motorola for node.js .
OpenCL-implementeringer finnes for de fleste plattformer i dag. IBM for sine superdatamaskiner under GNU / Linux ved hjelp av Power-prosessorer, X86-prosessorer fra Intel og AMD og GPUene som tradisjonelt følger med dem (ATI, nVidia, VIA), ARM Cortex-A9- prosessorer (SSE og fpu 128bits Neon-deler), samt DSPer , GPUer og andre databaser som følger med dem i de mange implementeringene av System on Chip (SoC) (nVidia Tegra2 , Qualcomm Snapdragon , Apple A4 , Marvell Armada , etc. ). Mesa (OpenGL / OpenVG-implementering under GNU / Linux) inneholder en OpenCL state-tracker for Gallium3D under utvikling, kalt Clover
De 10. desember 2008, AMD og Nvidia gjør den første offentlige demonstrasjonen av OpenCL, en 75-minutters presentasjon på SIGGRAPH Asia 2008 . AMD demonstrerer CPU-akselerert OpenCL og forklarer OpenCL-skalerbarhet på en eller flere kjerner mens NVIDIA demonstrerer GPU-akselerert demo.
De 26. mars 2009, på GDC 2009 , demonstrerte AMD og Havok den første OpenCL-akselererte implementeringen, Havok Cloth på en AMD Radeon HD 4000- serie GPU .
De 20. april 2009, Kunngjør Nvidia lanseringen av OpenCL-driveren og SDK til utviklere som deltar i OpenCL Early Access-programmet .
De 5. august 2009, AMD avslører de første utviklingsverktøyene for OpenCL-plattformen som en del av ATI Stream SDK v2.0 Beta-programmet .
De 28. august 2009, Apple lanserer Mac OS X Snow Leopard , som inneholder en full implementering av OpenCL.
I Snow Leopard støttes opprinnelig OpenCL på ATI Radeon HD 4850 , ATI Radeon HD 4870 chips samt Nvidia Geforce 8600M GT, GeForce 8800 GS, GeForce 8800 GT, GeForce 8800 GTS, Geforce 9400M, GeForce 9600M GT, GeForce GT chips 120 , GeForce GT 130 , GeForce GTX 285 , Quadro FX 4800 og Quadro FX 5600 .
De 28. september 2009, Lanserer Nvidia sine egne OpenCL-drivere og SDK-implementering.
De 13. oktober 2009AMD lanserer den fjerde betaen av ATI Stream SDK 2.0 , som gir en full OpenCL-implementering på alle GPUer i R700 / R800- familiene , og bruker også SSE3- enheter på CPUene. SDK er tilgjengelig for både GNU / Linux og Windows.
De 30. oktober 2009, IBM lanserer versjon 0.1 av sin OpenCL SDK for GNU / Linux på strøm arkitekturen som brukes i et flertall av de kraftigste superdatamaskiner i verden.
De 26. november 2009, Lanserer Nvidia drivere for implementering av OpenCL 1.0 (rev 48).
Apples OpenCL-implementeringer, Nvidia, RapidMind (in) og Mesa Gallium3D er alle basert på kompileringsteknologien LLVM og bruker kompilatoren Clang som frontend .
De 10. desember 2009, VIA lanserer sitt første produkt som støtter OpenCL 1.0 - ChromotionHD 2.0- videoprosessoren som er inkludert i VN1000-brikkene .
De 21. desember 2009AMD lanserer produksjonsversjonen av ATI Stream SDK 2.0 , som gir OpenCL 1.0-støtte for R800 GPUer og beta-støtte for R700 .
De 29. juni 2011, Intel lanserer den endelige versjonen av utviklingssettet som støtter OpenCL versjon 1.1 .
De 3. august 2011AMD kunngjør sitt ATI Stream SDK 2.5- utviklingssett , som blant annet forbedrer CPU / GPU-båndbredde for å få mer ut av de nylige APU-ene .
Hos Intel ble grafikkprosessorene inkludert i serien Ivy Bridge- prosessorer , utgitt den29. april 2012, Intel HD 2500 samt HD 4000 og nyere, er den første arkitekturen som støtter OpenCL, i versjon 1.1 .
Donut- biblioteket er et gratis OpenCL-bibliotek for Intel Ivy Bridge GT2- prosessorer , som en del av freedesktop.org- prosjektet , og utviklet hovedsakelig av Intel. Den bruker hovedsakelig LLVM , men er også kompatibel med GCC .
På slutten av 2013 kunngjorde ARM i sin tur “ Mali OpenCL SDK ” for sine Mali T600 og høyere grafikkprosessorer , hvis første modeller ble utgitt i 2012. Kildene er tilgjengelige, men lisensen er proprietær og bindende omfordeling.
Dette eksemplet beregner en Fast Fourier Transform
/* creation d'un contexte de calcul sur GPU */ context = clCreateContextFromType(NULL, CL_DEVICE_TYPE_GPU, NULL, NULL, NULL); /* récupération de la liste des cartes disponibles */ clGetContextInfo(context, CL_CONTEXT_DEVICES, 0, NULL, &nb_devices); clGetContextInfo(context, CL_CONTEXT_DEVICES, nb_devices, devices, NULL); /* creation d'une queue de commande sur le premier GPU */ queue = clCreateCommandQueue(context, devices[0], 0, NULL); /* allocation des tampons mémoire */ 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); /* création du programme de calcul (le programme qui s'execute sur le GPU) */ program = clCreateProgramWithSource(context, 1, &fft1D_1024_kernel_src, NULL, NULL); /* compilation du programme */ clBuildProgram(program, 0, NULL, NULL, NULL, NULL); /* création du noyau de calcul */ kernel = clCreateKernel(program, "fft1D_1024", NULL); /* mise en place des paramètres */ 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); /* création des objets de travail et lancement du calcul */ global_work_size[0] = num_entries; local_work_size[0] = 64; clEnqueueNDRangeKernel(queue, kernel, 1, NULL, global_work_size, local_work_size, 0, NULL, NULL);Beregningen: (basert på montering av FFT på G80-arkitekturen )
// This kernel computes FFT of length 1024. The 1024 length FFT is decomposed into // calls to a radix 16 function, another radix 16 function and then a radix 4 function __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]; // starting index of data to/from global memory in = in + blockIdx; out = out + blockIdx; globalLoads(data, in, 64); // coalesced global reads fftRadix16Pass(data); // in-place radix-16 pass twiddleFactorMul(data, tid, 1024, 0); // local shuffle using local memory localShuffle(data, sMemx, sMemy, tid, (((tid & 15) * 65) + (tid >> 4))); fftRadix16Pass(data); // in-place radix-16 pass twiddleFactorMul(data, tid, 64, 4); // twiddle factor multiplication localShuffle(data, sMemx, sMemy, tid, (((tid >> 4) * 64) + (tid & 15))); // four radix-4 function calls fftRadix4Pass(data); fftRadix4Pass(data + 4); fftRadix4Pass(data + 8); fftRadix4Pass(data + 12); // coalesced global writes globalStores(data, out, 64); }