OpenCL

OpenCL Beskrivelse av OpenCL.jpg-bildet.

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

Presentasjon

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 .

Historisk

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 .

WebCL

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 .

Historikk over implementeringer

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 Denne lenken refererer til en tvetydighetsside

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.

Open source-implementeringer

Kløver [5] og libCLC [6] for funksjonene til OpenCL-standardbiblioteket POCL (Portable OpenCL) [7]

Eksempel

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

Referanser

  1. "  https://www.khronos.org/registry/OpenCL/specs/3.0-unified/html/OpenCL_API.html  " ,27. april 2020
  2. (i) [PDF] .
  3. (no) [1] .
  4. (in) "  CodeXL HAR FLYTTET TIL GPUOPEN!  ” (Besøkt 29. august 2016 ) .
  5. (i) "  Apple forhåndsviser Mac OS X Snow Leopard til utviklere  " , Apple,9. juni 2008.
  6. Nvidia pressemelding .
  7. (no) [2] .
  8. (en) OpenCL
  9. http://webcl.nokiaresearch.com/
  10. (in) "  repo git Clover  " ,4. januar 2010(åpnet 30. januar 2010 ) .
  11. (in) "  OpenCL Over Mesa, Gallium3D Discussion  " ,9. desember 2009(åpnet 30. januar 2010 ) .
  12. (in) "  OpenCL Demo AMD CPUs  " ,10. desember 2008(åpnet 28. mars 2009 ) .
  13. (in) "  OpenCL Demo NVIDIA GPU  " ,10. desember 2008(åpnet 28. mars 2009 ) .
  14. (in) "  AMD og Havok demo OpenCL akselerert fysikk  " , PC Perspective26. mars 2009(åpnet 28. mars 2009 ) .
  15. (in) "  NVIDIA lanserer OpenCL Driver til utviklere  " , NVIDIA,20. april 2009(åpnet 27. april 2009 ) .
  16. (in) "  AMD reverserer GPGPU, OpenCL SDK for x86 annonce  " , Ars Technica,5. august 2009(åpnet 6. august 2009 ) .
  17. (in) Dan Moren, Jason Snell, "  Live Update: WWDC 2009 Keynote  " , macworld.com , MacWorld,8. juni 2009(åpnet 12. juni 2009 ) .
  18. (in) "  Mac OS X Snow Leopard - Tekniske spesifikasjoner og systemkrav  " , Apple Inc.,8. juni 2009(åpnet 25. august 2009 ) .
  19. (in) "  ATI Stream Software Development Kit (SDK) v2.0 Beta Program  " (åpnet 14. oktober 2009 ) .
  20. (in) "  OpenCL Development Kit for Linux on Power  " (åpnet 30. oktober 2009 ) .
  21. (in) "  Apple LLVM Users entry on page  " (åpnet 29. august 2009 ) .
  22. (in) "  Nvidia-oppføring på siden LLVM-brukere  " (åpnet 6. august 2009 ) .
  23. (i) "  RapidMind oppføring på LLVM Brukere side  " (vist på en st oktober 2009 ) .
  24. (i) "  Zack Rusin blogginnlegg om Mesa Gallium3D OpenCL gjennomføring  " (vist på en st oktober 2009 ) .
  25. (no) [3] .
  26. (in) "  ATI Stream SDK v2.0 med OpenCL 1.0-støtte  " (åpnet 23. oktober 2009 ) .
  27. (no) [4] .
  28. (in) "  AMD APP SDK 2.5 gir forbedret ytelse og nye muligheter Major  " (åpnet 3. august 2011 ) .
  29. "  Nye drivere hos Intel: OpenGL 4.0 og Ultra HD for Ivy Bridge  " ,24. oktober 2012(åpnet 10. desember 2013 ) .
  30. "  Donut  " (åpnet 10. desember 2013 ) .
  31. (i) "  Mali OpenCL SDK  " [ arkiv9. desember 2013] (åpnet 10. desember 2013 ) .
  32. (in) Fitting FFT onto G80 Architecture  " , Vasily Volkov and Brian Kazian, UC Berkeley CS258 project report, Mai 2008(åpnet 14. november 2008 )

Se også