Luoja | Omena |
---|---|
Kehittäjä | Khronos-ryhmä |
Ensimmäinen versio | 28. elokuuta 2009 |
Viimeinen versio | 3,0 (30. syyskuuta 2020) |
Kirjoitettu | C ja C ++ |
Käyttöjärjestelmä | Microsoft Windows , macOS , Linux , FreeBSD ja Android |
Ympäristö | X86_64 , IA-32 ( sisään ) ja ARM-arkkitehtuuri |
Tyyppi |
Framework Ohjelmointikieli |
Lisenssi | Avoimen lähdekoodin lisenssi ( d ) |
Verkkosivusto | www.khronos.org/opencl |
OpenCL ( Open C omputing L anguage ) on yhdistelmä API: ta ja C: stä johdettua ohjelmointikieliä , jonka Khronos-ryhmä ehdotti avoimeksi standardiksi . OpenCL on suunniteltu ohjelmoimaan heterogeenisiä rinnakkaisjärjestelmiä, jotka käsittävät esimerkiksi sekä moniytimisen CPU: n että GPU: n . Siksi OpenCL tarjoaa ohjelmointimallin, joka sijaitsee uudessa risteyksessä suorittimien ja grafiikkasuorittimien välillä , joista ensimmäinen on yhä rinnakkaisempi ja jälkimmäinen yhä ohjelmoitavampi.
OpenCL erottaa isäntäkoneen prosessorin (johtimena toimivan keskusprosessorin) niistä oheislaitteista (CPU, GPU tai muut), joiden tehtävänä on laskentaa vaativien ytimien suorittaminen. Siksi OpenCL erottaa toisaalta isäntäprosessorissa käynnissä olevan sovelluksen (ja joka kutsuu OpenCL-sovellusliittymää), ja toisaalta ytimet, jotka on ohjelmoitu OpenCL-C: hen (ja joiden tehtävän on tarkoitus toimia laitteilla).
OpenCL: n avulla voidaan ilmaista tehtävien rinnakkaisuus mutta myös tietojen rinnakkaisuus kahdessa muodossa; SPMD ( Single Program Multiple Data ) ja SIMD ( Single Instruction Multiple Data ), kaikki hierarkkisella tavalla. Tehtäväkaavio voidaan luoda dynaamisesti OpenCL-sovellusliittymän kautta. Jokainen tehtävä voidaan esittää joko yhtenä instanssina (kutsutaan tehtäväksi) tai saman ytimen esiintymien kokoelmana (nimeltään NDRange). NDRanges voi olla 1, 2 tai 3 ulottuvuutta. Kutakin NDRange-alueeseen kuuluvaa ytimen esiintymää kutsutaan työkohteeksi . NDrange voidaan itse rakentuu työhön ryhmissä , mikä mahdollistaa työhön eriä sisällä työ-ryhmät voivat jakaa tietoja ja synkronoida itsensä kautta esteitä.
Jos joidenkin teknisten tavoitteiden joukossa OpenCL näyttää olevan lähempänä C: tä CUDA: lle , joka on Nvidia-yhtiön oma ohjelmointimalli, OpenCL: llä on laajemmat tavoitteet, koska se ei ole omistettu vain GPU: ille. Suorituskykyisen tietojenkäsittelyn tai pelaamisen maailmassa OpenCL mahdollistaa grafiikkasuorittimien, moniydinten suorittimien tai muiden intensiivisten tietojenkäsittelyjärjestelmien, kuten IBM: n CELLin , hyödyntämisen, joka erityisesti varustaa PlayStation 3 : n Sonyn kanssa. Piiriin upotettujen järjestelmien ( SoC ) maailmassa , kuten älypuhelimissa , OpenCL sallii ainutlaatuisen ohjelmointiinfrastruktuurin kautta pääsyn keskusprosessoriin sekä erilaisiin sulautettuihin multimediaosajärjestelmiin (GPU, DSP) , laskentataulukko tai muut).
Tällä hetkellä OpenCL-ytimien virheenkorjaukseen on muutama tapa. Ensinnäkin NVIDIA Parallel Nsight -vianetsintälaite , joka pystyy virheenkorjaamaan CUDA-ketjun ketjulta , ei tällä hetkellä tue OpenCL: ää, mutta sallii vain API-puhelujen seuraamisen . Sitten AMD ehdottaa laajennusta, jonka avulla jäljet voidaan lisätä suoraan OpenCL-koodiin (cl_amd_printf). Lopuksi gDebugger-nimisen ohjelman (Gremedyn, sitten AMD: n ) avulla voit seurata algoritmin etenemistä säikeittäin . gDebugger on kehittynyt, sitä kutsutaan nyt CodeXL: ksi, ja sitä isännöi GPUOPEN- aloite .
OpenCL: n on alun perin suunnitellut Apple (joka rekisteröi tavaramerkin), ja sitä kehitettiin yhteistyössä AMD: n , Intelin ja Nvidian kanssa . Apple toimittaa ensin alkuperäisen ehdotuksensa Khronos-ryhmälle . 16. kesäkuuta 2008, muodostetaan Khronos Compute -työryhmä , johon kuuluvat laitteisto- ja ohjelmistovalmistajien edustajat. Hän työskenteli viisi kuukautta täydentääkseen OpenCL 1.0 -määrityksen teknisiä yksityiskohtia . Khronosin jäsenet tarkastavat eritelmän ja hyväksyvät kokeiluversioksi8. joulukuuta. Uusi versio, OpenCL 1.1 , julkaistaankesäkuu 2010jonka Khronoksen . OpenCL 1.1 selventää joitain näkökohtia edellisestä erittelystä ja tuo uusia toimintoja, kuten alipuskurit , 3-elementtiset vektorit, käyttäjän tapahtumat, uudet sisäänrakennetut toiminnot , vakiotuki valinnaisille 1.0- laajennuksille (kuten toiminnot 32-bittinen atomi).
OpenCL on integroitu Mac OS X 10.6 ( Snow Leopard ) -käyttöjärjestelmään . AMD päättää tukea OpenCL ja DirectX 11 sen sijaan Lähellä Metal sen Stream SDK puitteet . RapidMind (in) ilmoittaa OpenCL: n käyttöönoton alustakehityksessään tukemaan eri valmistajien grafiikkaprosessoreita yhdellä käyttöliittymällä. Nvidia vahvistaa myös9. joulukuuta 2008täysi tuki 1.0 spesifikaation sen GPU Computing Toolkit .
15. marraskuuta 2011, Khronos-konserni julkaisi OpenCL 1.2 -ominaisuudet . Se sisältää liikkuvuuteen ja siirrettävyyteen liittyviä ominaisuuksia, esimerkiksi mahdollisuuden jakaa ytimen linkkien kokoaminen ja muokkaaminen .
Khronos-ryhmä on myös kehittänyt OpenCL: n, rinnakkaislaskentakirjaston, integraation kaikkiin HTML5- ohjelmointirajapintoihin . Tällä hetkellä selaimet käyttävät laajennuksia OpenCL: n hallintaan.
Nokia ja Mozilla ovat kehittäneet laajennuksia Firefoxille. Samsung on WebKit ja Motorolan varten Node.js .
OpenCL-toteutuksia on nykyään useimmilla alustoilla. IBM supertietokoneilleen GNU / Linux-käyttöjärjestelmissä, joissa on Power-prosessorit, Intelin ja AMD: n X86-prosessorit ja niiden perinteisesti mukana olevat GPU: t (ATI, nVidia, VIA), ARM Cortex-A9 -prosessorit (SSE- ja fpu 128-bittiset neonosat) sekä DSP: t , GPU ja muut tietojenkäsittelyn taulukot toimivat heidän monissa toteutuksissa System Chip (SoC) (nVidia Tegra2 , Qualcomm Snapdragon , Apple A4 , Marvell Armada , jne ). Mesa (OpenGL / OpenVG-toteutus GNU / Linuxissa) sisältää kehitteillä olevan OpenCL - tilaseurannan Gallium3D: lle, nimeltään Clover
10. joulukuuta 2008, AMD ja Nvidia tekevät ensimmäisen julkisen esittelyn OpenCL: stä, 75 minuutin esityksestä SIGGRAPH Asia 2008: ssa . AMD esittelee suorittimen nopeuttaman OpenCL: n ja selittää OpenCL: n skaalautuvuuden yhdellä tai useammalla ytimellä, kun taas NVIDIA osoittaa GPU: lla nopeutetun esittelyn.
26. maaliskuuta 2009, GDC 2009: ssä , AMD ja Havok esittävät ensimmäisen OpenCL-nopeutetun toteutuksen, Havok Clothin AMD Radeon HD 4000 -sarjan GPU: lla .
20. huhtikuuta 2009, Nvidia ilmoittaa OpenCL-ohjaimen ja SDK : n julkaisun kehittäjille, jotka osallistuvat sen OpenCL Early Access -ohjelmaan .
5. elokuuta 2009, AMD paljastaa ensimmäiset kehitystyökalut OpenCL-alustalleen osana ATI Stream SDK v2.0 Beta -ohjelmaa .
28. elokuuta 2009, Apple julkaisee Mac OS X Snow Leopard -sovelluksen , joka sisältää OpenCL: n täydellisen toteutuksen.
In Snow Leopard , OpenCL aluksi tuettu ATI Radeon HD 4850 , ATI Radeon HD 4870 -sirut sekä Nvidia Geforce 8600M GT, GeForce 8800 GS, GeForce 8800 GT, GeForce 8800 GTS, GeForce 9400M, GeForce 9600M GT, GeForce GT sirut 120 , GeForce GT 130 , GeForce GTX 285 , Quadro FX 4800 ja Quadro FX 5600 .
28. syyskuuta 2009, Nvidia julkaisee omat OpenCL-ohjaimet ja SDK-toteutuksen.
13. lokakuuta 2009, AMD julkaisi ATI Stream SDK 2.0: n neljännen beetaohjelman , joka tarjoaa täydellisen OpenCL-toteutuksen kaikille R700 / R800- perheiden GPU: ille , myös käyttämällä suorittimien SSE3- yksiköitä . SDK on saatavana sekä GNU / Linuxille että Windowsille.
30. lokakuuta 2009, IBM julkaisee GNU / Linuxille tarkoitetun OpenCL SDK: n version 0.1 Power- arkkitehtuurilla, jota käytetään suurimmalla osalla maailman tehokkaimmista supertietokoneista.
26. marraskuuta 2009, Nvidia julkaisee ajureita OpenCL 1.0 (rev 48) -toteutukseen.
Applen OpenCL toteutuksia, Nvidia, RapidMind (in) ja Mesa Gallium3D perustuvat kaikki kokoamista teknologiaan llvm ja käyttää kääntäjä Clang kuten käyttöliittymää .
10. joulukuuta 2009, VIA julkaisee ensimmäisen tuotteensa, joka tukee OpenCL 1.0 -ohjelmaa - VN1000-siruihin sisältyvä ChromotionHD 2.0 -videoprosessori .
21. joulukuuta 2009AMD on vapauttaa tuotannon version ATI Stream SDK 2.0 , joka tarjoaa OpenCL 1,0 tukea varten R800 GPU ja beeta tuki R700 .
29. kesäkuuta 2011, Intel julkaisee lopullisen version kehityspaketistaan, joka tukee OpenCL- versiota 1.1 .
3. elokuuta 2011, AMD julkistaa ATI Stream SDK 2.5 -kehityspaketin , joka muun muassa parantaa CPU / GPU-kaistanleveyttä saadakseen enemmän irti viimeaikaisista APU-laitteistaan .
Intelillä grafiikkaprosessorit sisältyvät sen Ivy Bridge -prosessorivalikoimaan , joka julkaistiin29. huhtikuuta 2012, Intel HD 2500 sekä HD 4000 ja uudemmat, ovat ensimmäiset arkkitehtuurit, jotka tukevat OpenCL- versiota versiossa 1.1 .
Donut- kirjasto on ilmainen OpenCL-kirjasto Intel Ivy Bridge GT2 -prosessoreille osana freedesktop.org- projektia , ja sen on kehittänyt pääasiassa Intel. Se käyttää pääasiassa LLVM: ää , mutta on myös yhteensopiva GCC: n kanssa .
Vuoden 2013 lopussa ARM puolestaan ilmoitti " Mali OpenCL SDK: n " Mali T600- ja uudemmille grafiikkaprosessoreille , joiden ensimmäiset mallit julkaistiin vuonna 2012. Lähteet ovat saatavilla, mutta lisenssi on omistettu ja sitova uudelleenjakelulle .
Tämä esimerkki laskee nopean Fourier-muunnoksen
/* 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);Laskelma: (perustuu FFT: n asentamiseen G80-arkkitehtuuriin )
// 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); }