OpenCL | |
---|---|
Type | API |
Forfatter | Æble |
Udvikler | Khronos Group |
Skrevet i | C++ og C |
Operativ system | Cross-platform software |
Første udgave | 28. august 2009 |
Hardware platform | x86_64 , IA-32 og ARM |
nyeste version | 3.0.11 (6. maj 2022) |
Licens | EULA |
Internet side | khronos.org/opencl/ |
Mediefiler på Wikimedia Commons |
OpenCL ( Eng. Open C omputing L anguage -open computing language) er en ramme til at skrive computerprogrammer relateret til parallel computing på forskellige grafik- og centrale processorer samt FPGA . OpenCL inkluderer et programmeringssprog, der er baseret på C99 -programmeringssprogstandarden og en applikationsprogrammeringsgrænseflade . OpenCL giver parallelitet på instruktionsniveau og dataniveau og er en implementering af GPGPU -teknikken . OpenCL er en fuldstændig åben standard, og der er ingen licensgebyrer for at bruge den.
Målet med OpenCL er at komplementere de åbne industristandarder for 3D-computergrafik og -lyd – henholdsvis OpenGL og OpenAL – med GPU -funktioner til højtydende databehandling. OpenCL er udviklet og vedligeholdt af Khronos Group , et non-profit konsortium , der omfatter mange store virksomheder, herunder AMD , Apple , ARM , Intel , Nvidia , Sony Computer Entertainment og andre.
OpenCL blev oprindeligt udviklet af Apple Inc. Apple har indsendt forslag til udvikling af specifikationen til Khronos-udvalget. Snart besluttede AMD at støtte udviklingen af OpenCL (og DirectX 11 ), som skulle erstatte Close to Metal- rammeværket . [1] [2]
Den 16. juni 2008 blev Khronos Compute Working Group dannet for at udvikle OpenCL-specifikationer. Det omfatter Apple , nVidia , AMD , IBM , Intel , ARM , Motorola og andre virksomheder, inklusive dem, der specialiserer sig i at skabe computerspil. Arbejdet blev udført i fem måneder, hvorefter Khronos Group den 9. december 2008 præsenterede den første version af standarden.
OpenCL 1.0 blev først vist for offentligheden den 9. juni 2008 og udgivet med Mac OS X 10.6 den 28. august 2009. [3]
Den 5. april 2009 annoncerede AMD tilgængeligheden for download af betaversionen af ATI Stream SDK v2.0, som inkluderer OpenCL multiprocessor-programmeringssproget.
Den 20. april 2009 udgav nVidia en beta-driver og softwareudviklingskit ( SDK ) med understøttelse af den åbne GPGPU-standard OpenCL. Denne beta-driver er beregnet til udviklere, der deltager i OpenCL Early Access-programmet, som kan deltage i beta-testen, der starter den 20. april. For medlemmer af GPU Computing Registered Developers vil en betaversion af OpenCL-driveren blive gjort tilgængelig på et senere tidspunkt. [4] [5] [6]
Den 26. november 2009 udgav nVidia en driver, der understøtter OpenCL 1.0 (rev. 48).
For en visuel repræsentation af, hvordan OpenCL-teknologien bruger mulighederne i et 24-kernesystem til at gengive videoeffekter, anbefales det at se følgende demo: [1] Arkiveret 9. marts 2017 på Wayback Machine .
OpenCL 1.1 blev introduceret af Khronos Group den 14. juni 2010 . Den nye version udvider funktionaliteten til parallel programmering, fleksibilitet og ydeevne markant og tilføjer nye funktioner.
OpenCL 1.2 blev introduceret den 15. november 2011 . Den nye version indeholder mange små forbedringer relateret til øget sprogfleksibilitet og ydeevneoptimeringer. OpenCL 1.2 tilføjede en række væsentlige innovationer.
OpenCL 2.0 blev introduceret den 22. juli 2013 [7] og standardiseret den 18. november samme år [8] .
OpenCL 2.1 blev introduceret den 3. marts 2015 og standardiseret den 16. november samme år. Det omskrev kernen fra C til C++14 .
OpenCL 3.0 blev introduceret den 27. april 2020 [9] og standardiseret den 30. september samme år [10] . Bemærkelsesværdige ændringer omfatter, at OpenCL 3.0 API nu dækker alle versioner af OpenCL (1.2, 2.x), uden at give separate specifikationer for hver version.
De vigtigste forskelle mellem det anvendte sprog og C (1999 ISO-standard) er:
Eksempel på FFT- beregning : [13]
// oprettelse af en computerkontekst for GPU (videokort) kontekst = clCreateContextFromType ( NULL , CL_DEVICE_TYPE_GPU , NULL , NULL , NULL ); // opret en kommandokø = clCreateCommandQueue ( kontekst , NULL , 0 , NULL ) ; // hukommelsesallokering i form af buffere memobjs [ 0 ] = clCreateBuffer ( kontekst , CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR , sizeof ( float ) * 2 * num_entries , srcA , NULL ; memobjs [ 1 ] = clCreateBuffer ( kontekst , CL_MEM_READ_WRITE , sizeof ( float ) * 2 * num_entries , NULL , NULL ; // opret et program fra kildeprogram = clCreateProgramWithSource ( kontekst , 1 , & fft1D_1024_kernel_src , NULL , NULL ) ; // kompiler programmet clBuildProgram ( program , 0 , NULL , NULL , NULL , NULL ); // opret et kerneobjekt fra en kompileret programkerne = clCreateKernel ( program , " fft1D_1024 " , NULL ); // klargør argumenter clSetKernelArg ( kerne , 0 , sizeof ( cl_mem ), ( void * ) & memobjs [ 0 ]); clSetKernelArg ( kerne , 1 , sizeof ( cl_mem ), ( void * ) & memobjs [ 1 ]); clSetKernelArg ( kerne , 2 , sizeof ( float ) * ( local_work_size [ 0 ] + 1 ) * 16 , NULL ); clSetKernelArg ( kerne , 3 , sizeof ( float ) * ( local_work_size [ 0 ] + 1 ) * 16 , NULL ); // indstilling af ND-området med arbejdsemnedimensioner og send det til udførelseskøen global_work_size [ 0 ] = antal_indgange ; local_work_size [ 0 ] = 64 ; clEnqueueNDRangeKernel ( kø , kerne , 1 , NULL , global_work_size , local_work_size , 0 , NULL , NULL );Direkte beregninger (baseret på tilpasning af FFT til G80-arkitekturrapporten) [14] :
// Denne kode beregner FFT af længde 1024 ved at opdele den i 16, 16 og 4 __kernel void fft1D_1024 ( __global float2 * in , __global float2 * out , __local float * sMemx , __local float * sMemy ) { int tid = get_local_id ( 0 ); int blokIdx = get_group_id ( 0 ) * 1024 + tid ; float2data [ 16 ] ; // adresse på begyndelsen af de behandlede data i global hukommelse i = in + blockIdx ; ud = ud + blokIdx ; globalLoads ( data , i , 64 ); // sammensmeltede globale læser fftRadix16Pass ( data ); // in-place radix-16 pass twiddleFactorMul ( data , tid , 1024 , 0 ); // lokal shuffle ved hjælp af lokal hukommelse localShuffle ( data , sMemx , sMemy , tid , ((( tid & 15 ) * 65 ) + ( tid >> 4 ))); fftRadix16Pass ( data ); // in-place radix-16 pass twiddleFactorMul ( data , tid , 64 , 4 ); // twiddle faktor multiplikation localShuffle ( data , sMemx , sMemy , tid , ((( tid >> 4 ) * 64 ) + ( tid & 15 ))); // 4 FFT-kald af orden 4 fftRadix4Pass ( data ); // radix-4 funktion nummer 1 fftRadix4Pass ( data + 4 ); // radix-4 funktion nummer 2 fftRadix4Pass ( data + 8 ); // radix-4 funktion nummer 3 fftRadix4Pass ( data + 12 ); // radix-4 funktion nummer 4 // coalesced global skriver globalStores ( data , ud , 64 ); }En fuldstændig implementering af FFT i OpenCL er tilgængelig på Apples websted [15] .
OpenCL bruges, som en af implementeringerne af det generelle GPU- koncept , i forskellig software.
Khronos-gruppens standarder | |
---|---|
Aktiv | |
Inaktiv |