OpenCL

Kokeneet kirjoittajat eivät ole vielä tarkistaneet sivun nykyistä versiota, ja se voi poiketa merkittävästi 15. maaliskuuta 2022 tarkistetusta versiosta . tarkastukset vaativat 2 muokkausta .
OpenCL
Tyyppi API
Tekijä Omena
Kehittäjä Khronos ryhmä
Sisään kirjoitettu C++ ja C
Käyttöjärjestelmä Monialustainen ohjelmisto
Ensimmäinen painos 28. elokuuta 2009
Laitteistoalusta x86_64 , IA-32 ja ARM
uusin versio 3.0.11 (6. toukokuuta 2022)
Lisenssi EULA
Verkkosivusto khronos.org/opencl/
 Mediatiedostot Wikimedia Commonsissa

OpenCL ( Eng.  Open C computing L Anguage  - open computing Language) on kehys rinnakkaislaskentaan liittyvien tietokoneohjelmien kirjoittamiseen erilaisilla grafiikka- ja keskusprosessoreilla sekä FPGA :lla . OpenCL sisältää ohjelmointikielen , joka perustuu C99 - ohjelmointikielistandardiin ja sovellusohjelmointirajapinnan . OpenCL tarjoaa käskytason ja datatason rinnakkaisuuden ja on GPGPU -tekniikan toteutus . OpenCL on täysin avoin standardi , eikä sen käytöstä peritä lisenssimaksuja.

OpenCL:n tavoitteena on täydentää avoimia 3D-tietokonegrafiikan ja -äänen alan standardeja – OpenGL ja OpenALGPU -ominaisuuksilla korkean suorituskyvyn laskentaa varten. OpenCL:n kehittää ja ylläpitää Khronos Group , voittoa tavoittelematon konsortio , johon kuuluu monia suuria yrityksiä, kuten AMD , Apple , ARM , Intel , Nvidia , Sony Computer Entertainment ja muut.

Historia

OpenCL:n on alun perin kehittänyt Apple Inc. Apple on toimittanut ehdotuksia eritelmän kehittämiseksi Khronos-komitealle. Pian AMD päätti tukea OpenCL:n (ja DirectX 11 :n ) kehitystä, jonka pitäisi korvata Close to Metal -kehys . [1] [2]

16. kesäkuuta 2008 perustettiin Khronos Compute Working Group kehittämään OpenCL-spesifikaatioita. Se sisältää Applen , nVidia , AMD , IBM , Intel , ARM , Motorola ja muut yritykset, mukaan lukien tietokonepelien luomiseen erikoistuneet. Työtä tehtiin viisi kuukautta, minkä jälkeen 9.12.2008 Khronos Group esitteli standardin ensimmäisen version.

OpenCL 1.0 esiteltiin ensimmäisen kerran yleisölle 9. kesäkuuta 2008, ja se julkaistiin Mac OS X 10.6 :n kanssa 28. elokuuta 2009. [3]

AMD ilmoitti 5. huhtikuuta 2009, että ATI Stream SDK v2.0:n beta-versio, joka sisältää OpenCL-moniprosessoriohjelmointikielen, on ladattavissa.

20. huhtikuuta 2009 nVidia julkaisi beta-ohjaimen ja ohjelmistokehityspaketin ( SDK ), joka tukee avointa GPGPU-standardia OpenCL. Tämä beta-ajuri on tarkoitettu OpenCL Early Access -ohjelmaan osallistuville kehittäjille, jotka voivat osallistua betatestiin 20. huhtikuuta alkaen. GPU Computing Registered Developers -jäsenille OpenCL-ohjaimen beta-versio julkaistaan ​​myöhemmin. [4] [5] [6]

26. marraskuuta 2009 nVidia julkaisi ohjaimen, joka tukee OpenCL 1.0:aa (versio 48).

Visuaalisen esityksen siitä, kuinka OpenCL-tekniikka käyttää 24-ytimisen järjestelmän ominaisuuksia videotehosteiden hahmontamiseen, on suositeltavaa katsoa seuraava demo: [1] Arkistoitu 9. maaliskuuta 2017 Wayback Machinessa .

Khronos Group esitteli OpenCL 1.1 :n 14. kesäkuuta 2010 . Uusi versio laajentaa merkittävästi rinnakkaisohjelmoinnin toimintoja, joustavuutta ja suorituskykyä sekä lisää uusia ominaisuuksia.

OpenCL 1.2 esiteltiin 15. marraskuuta 2011 . Uusi versio sisältää monia pieniä parannuksia, jotka liittyvät lisääntyneeseen kielen joustavuuteen ja suorituskyvyn optimointiin. OpenCL 1.2 lisäsi useita merkittäviä innovaatioita.

OpenCL 2.0 esiteltiin 22. heinäkuuta 2013 [7] ja standardisoitiin 18. marraskuuta samana vuonna [8] .

OpenCL 2.1 esiteltiin 3. maaliskuuta 2015 ja standardisoitiin 16. marraskuuta samana vuonna. Se kirjoitti ytimen uudelleen C:stä C++14 :ään .

OpenCL 3.0 esiteltiin 27. huhtikuuta 2020 [9] ja standardisoitiin 30. syyskuuta samana vuonna [10] . Huomattavia muutoksia ovat muun muassa se, että OpenCL 3.0 API kattaa nyt kaikki OpenCL:n versiot (1.2, 2.x), ilman erillisiä määrityksiä jokaiselle versiolle.

Tapahtumat

Kielen ominaisuudet

Tärkeimmät erot käytetyn kielen ja C:n (1999 ISO-standardi) välillä ovat:

Esimerkkejä

FFT- laskentaesimerkki : [13]

// laskentakontekstin luominen GPU (näytönohjain) -kontekstia varten = clCreateContextFromType ( NULL , CL_DEVICE_TYPE_GPU , NULL , NULL , NULL ); // luo komentojono queue = clCreateCommandQueue ( konteksti , NULL , 0 , NULL ); // muistin varaus puskureiden muodossa memobjs [ 0 ] = clCreateBuffer ( konteksti , CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR , koko ( float ) * 2 * num_entries , srcA , NULL ); memobjs [ 1 ] = clCreateBuffer ( konteksti , CL_MEM_READ_WRITE , koko ( float ) * 2 * merkintöjen määrä , NULL , NULL ); // luo ohjelma lähdeohjelmasta = clCreateProgramWithSource ( konteksti , 1 , & fft1D_1024_kernel_src , NULL , NULL ) ; // kääntää ohjelman clBuildProgram ( ohjelma , 0 , NULL , NULL , NULL , NULL ); // luo ydinobjektin käännetystä ohjelmasta kernel = clCreateKernel ( ohjelma , "fft1D_1024" , NULL ); // valmistaa argumentit clSetKernelArg ( kernel , 0 , sizeof ( cl_mem ), ( void * ) & memobjs [ 0 ]); clSetKernelArg ( ydin , 1 , koko ( cl_mem ), ( void * ) & memobjs [ 1 ]); clSetKernelArg ( ydin , 2 , sizeof ( float ) * ( local_work_size [ 0 ] + 1 ) * 16 , NULL ); clSetKernelArg ( ydin , 3 , sizeof ( float ) * ( local_work_size [ 0 ] + 1 ) * 16 , NULL ); // ND-alueen asettaminen työkohteen dimensioilla ja sen lähettäminen suoritusjonoon global_work_size [ 0 ] = num_entries ; paikallinen_työkoko [ 0 ] = 64 ; clEnqueueNDRangeKernel ( jono , ydin , 1 , NULL , globaali_työkoko , paikallinen_työkoko , 0 , NULL , NULL );

Suorat laskelmat (perustuu FFT:n sovittamiseen G80-arkkitehtuuriraporttiin) [14] :

// Tämä koodi laskee 1024 pituisen FFT:n jakamalla sen 16, 16 ja 4 __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 ; float2data [ 16 ] ; // käsiteltyjen tietojen alun osoite globaalissa muistissa in = in + blockIdx ; ulos = ulos + blockIdx ; globalLoads ( data , in , 64 ); // yhdistetty globaali lukee fftRadix16Pass ( data ); // in-place-radix-16 pass twiddleFactorMul ( data , tid , 1024 , 0 ); // paikallinen sekoitus paikallista muistia käyttäen localShuffle ( data , sMemx , sMemy , tid , ((( tid & 15 ) * 65 ) + ( tid >> 4 ))); fftRadix16Pass ( data ); // in-place radix-16 pass twiddleFactorMul ( data , tid , 64 , 4 ); // twiddle-kerroin localShuffle ( data , sMemx , sMemy , tid , ((( tid >> 4 ) * 64 ) + ( tid & 15 ))); // 4 FFT-kutsua järjestyksessä 4 fftRadix4Pass ( data ); // kantaluku-4-funktion numero 1 fftRadix4Pass ( data + 4 ); // kantaluku-4-funktion numero 2 fftRadix4Pass ( data + 8 ); // kantaluku-4-funktion numero 3 fftRadix4Pass ( data + 12 ); // kantaluku-4 funktion numero 4 // yhdistetty globaali kirjoittaa globalStores ( data , out , 64 ); }

FFT:n täydellinen toteutus OpenCL:ssä on saatavilla Applen verkkosivustolla [15] .

Sovellus

OpenCL:ää käytetään yhtenä yleiskäyttöisen GPU -konseptin toteutuksista erilaisissa ohjelmistoissa.

  • WinZip v16.5 ( 2012 ) Corelilta  - päivitetyn moottorin lisäksi, joka parantaa sen optimointia moniytimisille prosessoreille, OpenCL-tuki on lisätty AMD GPU :ille (ei kuitenkaan Intelille ja Nvidialle) - samalla kun suorituskyky paranee tässä Trinity- ja Llano - apuyksiköiden käyttöaste oli jopa 45 %. [16]

Katso myös

Muistiinpanot

  1. AMD Drives Teollisuuden standardien ottaminen käyttöön GPGPU-ohjelmistokehityksessä . AMD. Arkistoitu alkuperäisestä 19. maaliskuuta 2012.
  2. AMD tukee OpenCL:tä, Microsoft DirectX 11:tä . eWeek. Arkistoitu alkuperäisestä 19. maaliskuuta 2012.
  3. Apple esikatselee Mac OS X Snow Leopardia kehittäjille . Omena. Arkistoitu alkuperäisestä 19. maaliskuuta 2012.
  4. Andrew Humber. NVIDIA julkaisee OpenCL-ohjaimen  kehittäjille . NVIDIA (20. huhtikuuta 2009). - Alkuperäiset uutiset NVIDIA Corporationin virallisella verkkosivustolla. Haettu 21. huhtikuuta 2009. Arkistoitu alkuperäisestä 19. maaliskuuta 2012.
  5. Pavel Shubsky. NVIDIA on avannut GPGPU:n kehittäjille OpenCL:n alla (ei saatavilla linkki) . Igromania (aikakauslehti) (21. huhtikuuta 2009). Haettu 21. huhtikuuta 2009. Arkistoitu alkuperäisestä 25. huhtikuuta 2009. 
  6. Sergey ja Marina Bondarenko. NVIDIA:n OpenCL-ohjain kehittäjille . 3DNews (21. huhtikuuta 2009). Haettu 21. huhtikuuta 2009. Arkistoitu alkuperäisestä 23. huhtikuuta 2009.
  7. Khronos julkaisee OpenCL  2.0 :n . khronos.org (22. heinäkuuta 2013). Haettu 22. heinäkuuta 2013. Arkistoitu alkuperäisestä 17. elokuuta 2013.
  8. Khronos viimeistelee OpenCL 2.0 -spesifikaation heterogeeniselle laskennalle , Khronos Group  ( 18. marraskuuta 2013). Arkistoitu 11. marraskuuta 2020. Haettu 20. marraskuuta 2013.
  9. ↑ Khronos Group julkaisee OpenCL 3.0:n väliaikaiset tekniset tiedot  . Khronos Group (27.4.2020). Haettu 27. huhtikuuta 2020. Arkistoitu alkuperäisestä 18. tammikuuta 2021.
  10. OpenCL 3.0 -spesifikaatio viimeistelty ja alkuperäinen Khronosin avoimen lähdekoodin OpenCL SDK on  julkaistu . Khronos Group (30.9.2020). Haettu 30. syyskuuta 2020. Arkistoitu alkuperäisestä 30. syyskuuta 2020.
  11. 1 2 3 WebKitille esitellyn WebCL-teknologian käyttöönotto . opennet.ru (4. heinäkuuta 2011). Haettu 31. lokakuuta 2011. Arkistoitu alkuperäisestä 18. toukokuuta 2012.
  12. 12 AMD . Johdatus OpenCL-ohjelmointiin 201005, sivut 89-90
  13. OpenCL . SIGGRAPH2008 (14. elokuuta 2008). Haettu 14. elokuuta 2008. Arkistoitu alkuperäisestä 19. maaliskuuta 2012.
  14. FFT:n sovittaminen G80-arkkitehtuuriin (PDF). Vasily Volkov ja Brian Kazian, UC Berkeley CS258 -projektiraportti (toukokuu 2008). Haettu 14. marraskuuta 2008. Arkistoitu alkuperäisestä 19. maaliskuuta 2012.
  15. . OpenCL FFT:llä (linkki ei saatavilla) . Apple (16. marraskuuta 2009). Haettu 7. joulukuuta 2009. Arkistoitu alkuperäisestä 30. marraskuuta 2009. 
  16. AMD Trinity Benchmarks - OpenCL Arkistoitu 29. elokuuta 2012 Wayback Machinessa // THG

Kirjallisuus

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

Linkit