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 ( 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 OpenAL – GPU -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.
- Uudet tietotyypit, mukaan lukien 3-komponenttiset vektorit ja lisäkuvamuodot.
- Käsittelee komentoja useista isäntäsäikeistä ja puskurikäsittelyä useiden laitteiden välillä.
- Puskurialueen toiminnot, mukaan lukien 1D-, 2D- tai 3D-suorakulmaisten alueiden lukeminen, kirjoittaminen ja kopioiminen.
- Tapahtuman laajennettu käyttö komentojen suorittamisen hallintaan ja ohjaukseen.
- Parannettu yhteentoimivuus OpenGL:n kanssa tehokkaan kuvien jakamisen ansiosta.
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.
- Laitteiden osiointi on kyky osioida laite useisiin alilaitteisiin OpenCL-sovellustasolla, jotta työt voidaan suoraan sitoa tiettyihin laskentayksiköihin, varata resursseja korkeamman prioriteetin tehtäviin tai jakaa tehokkaammin laitteistoresursseja, kuten välimuistia.
- Objektien erillinen kokoaminen ja linkittäminen - tuli mahdolliseksi luoda dynaamisia kirjastoja, jotka mahdollistavat aiemmin toteutettujen rutiinien käytön OpenCL-laskennan kanssa kolmansien osapuolien ohjelmissa.
- Laajennettu kuvatuki, mukaan lukien mahdollisuus työskennellä 1D-kuvien ja 1D- tai 2D-kuvien ryhmien kanssa. Lisäksi jakamislaajennus lisää mahdollisuuden luoda OpenCL-kuvan yksittäisten OpenGL-kuvioiden tai pintakuviotaulukoiden perusteella.
- Sulautetut OpenCL-ytimet mahdollistavat nyt mukautetun tai ei-ohjelmoitavan laitteiston ja siihen liittyvän laiteohjelmiston hyödyntämisen. Esimerkiksi DSP-prosessorien tai videokooderien/dekooderien kaltaisten laitteiden ominaisuuksia ja tiiviimpää integrointia OpenCL-kehyksen kanssa tuli mahdolliseksi.
- Mahdollisuus jakaa saumattomasti pintoja (Media Surface Sharing) OpenCL:n ja API DirectX 9/11:n välillä.
OpenCL 2.0 esiteltiin 22. heinäkuuta 2013 [7] ja standardisoitiin 18. marraskuuta samana vuonna [8] .
- Jaettu virtuaalimuisti – Mahdollistaa isäntä- ja laiteytimien jakaa tietorakenteita monimutkaisten osoiteviittausten perusteella, mikä eliminoi eksplisiittiset siirrot isäntäkoneen ja laitteiden välillä ja lisää ohjelmoinnin joustavuutta.
- Sisäkkäinen rinnakkaisuus – Päivitys on parantanut ohjelmointikokemusta ja lisännyt sovellusten suorituskykyä.
- Universal Address Space - Mahdollistaa funktioiden kirjoittamisen ilman osoiteavaruuden nimeämistä, mikä lisää joustavuutta ja säästää aikaa poistamalla tarpeen kirjoittaa useita toimintoja.
- Device Side Atomic C11 Operations – C11-atomi- ja synkronointitoimintojen osajoukko mahdollistaa säikeiden rinnakkaisen suorittamisen, jotta ne voivat toimia turvallisesti jaetuissa tietojoukoissa.
- Kanavat - FIFO-tavalla järjestetyt muistiobjektit, mikä yksinkertaistaa jaetun jonon tietorakenteita.
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
- 3. maaliskuuta 2011 – Khronos Group ilmoittaa WebCL-työryhmän perustamisesta JavaScript -rajapinnan kehittämiseksi OpenCL-standardiin. Tämä luo mahdollisuuden käyttää GPU:ita ja moniytimiä prosessoreita laskennan rinnakkaiseen käsittelyyn verkkoselaimessa. [yksitoista]
- 4. toukokuuta 2011 - Nokia Research julkaisi avoimen lähdekoodin WebCL-laajennuksen Firefox -selaimelle . [yksitoista]
- 1. heinäkuuta 2011 - Samsung Electronics julkaisi avoimen WebCL-prototyypin WebKit-moottorille . [yksitoista]
- 8. elokuuta 2011 – AMD julkaisi AMD Accelerated Parallel Processing (APP) Software Development Kit (SDK) v2.5 OpenCL-ohjaimen, joka korvaa ATI Stream SDK:n.
- 15. marraskuuta 2011 - Khronos-komitea julkaisi päivitetyn OpenCL 1.2 -spesifikaation. Uusi versio sisältää monia pieniä parannuksia, jotka liittyvät lisääntyneeseen kielen joustavuuteen ja suorituskyvyn optimointiin.
- 1. joulukuuta 2012 - Khronos-komitea julkaisi uuden päivityksen OpenCL 1.2 -spesifikaatioon. Uudessa versiossa on parannettu vuorovaikutusta OpenGL:n kanssa, parannettu WebGL:n suojausta, lisätty tuki OpenCL-ohjelmien lataamiseen SPIR-väliesityksen avulla.
Kielen ominaisuudet
Tärkeimmät erot käytetyn kielen ja C:n (1999 ISO-standardi) välillä ovat:
- funktioosoittimien , rekursion , bittikenttien , muuttuvan pituisten taulukoiden (VLA), vakiomuotoisten otsikkotiedostojen tuen puute [12] ;
- kielilaajennukset samanaikaisuutta varten: vektorityypit, synkronointi, funktiot työkohteita/työryhmiä varten [12] ;
- muistityypin tarkenteet: __global, __local, __constant, __private;
- erilaisia sisäänrakennettuja toimintoja.
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
- ↑ AMD Drives Teollisuuden standardien ottaminen käyttöön GPGPU-ohjelmistokehityksessä . AMD. Arkistoitu alkuperäisestä 19. maaliskuuta 2012. (määrätön)
- ↑ AMD tukee OpenCL:tä, Microsoft DirectX 11:tä . eWeek. Arkistoitu alkuperäisestä 19. maaliskuuta 2012. (määrätön)
- ↑ Apple esikatselee Mac OS X Snow Leopardia kehittäjille . Omena. Arkistoitu alkuperäisestä 19. maaliskuuta 2012. (määrätön)
- ↑ 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.
- ↑ 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. (määrätön)
- ↑ Sergey ja Marina Bondarenko. NVIDIA:n OpenCL-ohjain kehittäjille . 3DNews (21. huhtikuuta 2009). Haettu 21. huhtikuuta 2009. Arkistoitu alkuperäisestä 23. huhtikuuta 2009. (määrätön)
- ↑ Khronos julkaisee OpenCL 2.0 :n . khronos.org (22. heinäkuuta 2013). Haettu 22. heinäkuuta 2013. Arkistoitu alkuperäisestä 17. elokuuta 2013.
- ↑ Khronos viimeistelee OpenCL 2.0 -spesifikaation heterogeeniselle laskennalle , Khronos Group ( 18. marraskuuta 2013). Arkistoitu 11. marraskuuta 2020. Haettu 20. marraskuuta 2013.
- ↑ 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.
- ↑ 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.
- ↑ 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. (Venäjän kieli)
- ↑ 12 AMD . Johdatus OpenCL-ohjelmointiin 201005, sivut 89-90
- ↑ OpenCL . SIGGRAPH2008 (14. elokuuta 2008). Haettu 14. elokuuta 2008. Arkistoitu alkuperäisestä 19. maaliskuuta 2012. (määrätön)
- ↑ 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.
(määrätön)
- ↑ .
OpenCL FFT:llä (linkki ei saatavilla) . Apple (16. marraskuuta 2009). Haettu 7. joulukuuta 2009. Arkistoitu alkuperäisestä 30. marraskuuta 2009. (määrätön)
- ↑ 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