OpenCL

Den aktuelle version af siden er endnu ikke blevet gennemgået af erfarne bidragydere og kan afvige væsentligt fra den version , der blev gennemgået den 15. marts 2022; checks kræver 2 redigeringer .
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.

Historie

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.

Begivenheder

Funktioner af sproget

De vigtigste forskelle mellem det anvendte sprog og C (1999 ISO-standard) er:

Eksempler

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 ( , 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] .

Ansøgning

OpenCL bruges, som en af ​​implementeringerne af det generelle GPU- koncept , i forskellig software.

  • WinZip v16.5 ( 2012 ) fra Corel  - udover den opdaterede motor for at forbedre dens optimering til multi-core processorer, er der tilføjet OpenCL support til AMD GPU'er (dog ikke til Intel og Nvidia) - mens ydeevnen stiger i denne anvendelse på Trinity og Llano APU'er var op til 45 %. [16]

Se også

Noter

  1. AMD driver overtagelse af industristandarder i GPGPU-softwareudvikling . AMD. Arkiveret fra originalen den 19. marts 2012.
  2. AMD støtter OpenCL, Microsoft DirectX 11 . eUge. Arkiveret fra originalen den 19. marts 2012.
  3. Apple forhåndsviser Mac OS X Snow Leopard til udviklere . Æble. Arkiveret fra originalen den 19. marts 2012.
  4. Andrew Humber. NVIDIA frigiver OpenCL-driver til  udviklere . NVIDIA (20. april 2009). - Originale nyheder på den officielle hjemmeside for NVIDIA Corporation. Hentet 21. april 2009. Arkiveret fra originalen 19. marts 2012.
  5. Pavel Shubsky. NVIDIA har åbnet GPGPU for udviklere under OpenCL (utilgængeligt link) . Igromania (magasin) (21. april 2009). Hentet 21. april 2009. Arkiveret fra originalen 25. april 2009. 
  6. Sergey og Marina Bondarenko. OpenCL-driver til udviklere fra NVIDIA . 3DNews (21. april 2009). Hentet 21. april 2009. Arkiveret fra originalen 23. april 2009.
  7. Khronos frigiver OpenCL  2.0 . khronos.org (22. juli 2013). Hentet 22. juli 2013. Arkiveret fra originalen 17. august 2013.
  8. Khronos afslutter OpenCL 2.0 Specification for Heterogeneous Computing , Khronos Group  ( 18. november 2013). Arkiveret 11. november 2020. Hentet 20. november 2013.
  9. ↑ Khronos Group frigiver OpenCL 3.0 foreløbige specifikationer  . Khronos Group (27. april 2020). Hentet 27. april 2020. Arkiveret fra originalen 18. januar 2021.
  10. OpenCL 3.0 Specifikation færdiggjort og indledende Khronos Open Source OpenCL SDK  frigivet . Khronos Group (30. september 2020). Hentet 30. september 2020. Arkiveret fra originalen 30. september 2020.
  11. 1 2 3 Implementering af WebCL-teknologi præsenteret for WebKit . opennet.ru (4. juli 2011). Hentet 31. oktober 2011. Arkiveret fra originalen 18. maj 2012.
  12. 12 AMD . Introduktion til OpenCL Programming 201005, side 89-90
  13. OpenCL . SIGGRAPH2008 (14. august 2008). Hentet 14. august 2008. Arkiveret fra originalen 19. marts 2012.
  14. Montering af FFT på G80 Architecture (PDF). Vasily Volkov og Brian Kazian, UC Berkeley CS258 projektrapport (maj 2008). Hentet 14. november 2008. Arkiveret fra originalen 19. marts 2012.
  15. . OpenCL på FFT (utilgængeligt link) . Apple (16. november 2009). Hentet 7. december 2009. Arkiveret fra originalen 30. november 2009. 
  16. AMD Trinity Benchmarks - OpenCL Arkiveret 29. august 2012 på Wayback Machine // THG

Litteratur

  • Aaftab Munshi; Benedict R. Gaster; Timothy G. Mattson; James Fung; Dan Ginsburg. OpenCL programmeringsvejledning. - Addison-Wesley Professional, 2011. - 648 s. — ISBN 978-0-321-74964-2 .

Links