OpenCL
Den aktuella versionen av sidan har ännu inte granskats av erfarna bidragsgivare och kan skilja sig väsentligt från
versionen som granskades den 15 mars 2022; kontroller kräver
2 redigeringar .
OpenCL ( Eng. Open C omputing L anguage- open computing language) är ett ramverk för att skriva datorprogram relaterade till parallell beräkning på olika grafik- och centralprocessorer , samt FPGA . OpenCL inkluderar ett programmeringsspråk som är baserat på programmeringsspråksstandarden C99 och ett applikationsprogrammeringsgränssnitt . OpenCL tillhandahåller parallellitet på instruktionsnivå och datanivå och är en implementering av GPGPU- tekniken . OpenCL är en helt öppen standard och det finns inga licensavgifter för att använda den.
Målet med OpenCL är att komplettera de öppna industristandarderna för 3D-datorgrafik och ljud – OpenGL respektive OpenAL – med GPU -funktioner för högpresterande datoranvändning. OpenCL utvecklas och underhålls av Khronos Group , ett ideellt konsortium som inkluderar många stora företag inklusive AMD , Apple , ARM , Intel , Nvidia , Sony Computer Entertainment och andra.
Historik
OpenCL utvecklades ursprungligen av Apple Inc. Apple har lämnat in förslag för utveckling av specifikationen till Khronos-kommittén. Snart beslutade AMD att stödja utvecklingen av OpenCL (och DirectX 11 ), som borde ersätta Close to Metal -ramverket . [1] [2]
Den 16 juni 2008 bildades Khronos Compute Working Group för att utveckla OpenCL-specifikationer. Det inkluderar Apple , nVidia , AMD , IBM , Intel , ARM , Motorola och andra företag, inklusive de som specialiserar sig på att skapa datorspel. Arbetet pågick under fem månader, varefter Khronos Group den 9 december 2008 presenterade den första versionen av standarden.
OpenCL 1.0 visades först för allmänheten den 9 juni 2008 och släpptes med Mac OS X 10.6 den 28 augusti 2009. [3]
Den 5 april 2009 tillkännagav AMD tillgängligheten för nedladdning av betaversionen av ATI Stream SDK v2.0, som inkluderar OpenCL-multiprocessorprogrammeringsspråket.
Den 20 april 2009 släppte nVidia en betadrivrutin och mjukvaruutvecklingskit ( SDK ) med stöd för den öppna GPGPU-standarden OpenCL. Denna beta-drivrutin är avsedd för utvecklare som deltar i OpenCL Early Access-programmet, som kan delta i betatestet från och med den 20 april. För GPU Computing Registered Developers-medlemmar kommer en betaversion av OpenCL-drivrutinen att göras tillgänglig vid ett senare tillfälle. [4] [5] [6]
Den 26 november 2009 släppte nVidia en drivrutin som stöder OpenCL 1.0 (rev 48).
För en visuell representation av hur OpenCL-tekniken använder kapaciteten hos ett 24-kärnsystem för att rendera videoeffekter, rekommenderas det att titta på följande demo: [1] Arkiverad 9 mars 2017 på Wayback Machine .
OpenCL 1.1 introducerades av Khronos Group den 14 juni 2010 . Den nya versionen utökar avsevärt funktionaliteten för parallell programmering, flexibilitet och prestanda, och lägger till nya funktioner.
- Nya datatyper inklusive 3-komponentsvektorer och ytterligare bildformat.
- Bearbetning av kommandon från flera värdtrådar och buffertbearbetning mellan flera enheter.
- Buffertregionoperationer inklusive läsning, skrivning och kopiering av rektangulära 1D-, 2D- eller 3D-områden.
- Utökad användning av händelsen för att hantera och kontrollera exekveringen av kommandon.
- Förbättrad interoperabilitet med OpenGL genom effektiv bilddelning.
OpenCL 1.2 introducerades den 15 november 2011 . Den nya versionen innehåller många små förbättringar relaterade till ökad språkflexibilitet och prestandaoptimeringar. OpenCL 1.2 lade till ett antal betydande innovationer.
- Enhetspartitionering är möjligheten att partitionera en enhet i flera underenheter på OpenCL-applikationsnivå för att direkt binda jobb till specifika datorenheter, reservera resurser för högre prioriterade uppgifter eller mer effektivt dela hårdvaruresurser som cache.
- Separat kompilering och länkning av objekt - det blev möjligt att skapa dynamiska bibliotek som gör det möjligt att använda tidigare implementerade rutiner med OpenCL-beräkningar i tredjepartsprogram.
- Utökat bildstöd, inklusive möjligheten att arbeta med 1D-bilder och arrayer av 1D- eller 2D-bilder. Dessutom lägger delningstillägget till möjligheten att skapa en OpenCL-bild baserad på individuella OpenGL-texturer eller texturarrayer.
- Inbäddade OpenCL-kärnor låter dig nu dra fördel av anpassad eller icke-programmerbar hårdvara och tillhörande firmware. Till exempel blev det möjligt att använda funktionerna och den närmare integrationen med OpenCL-ramverket för enheter som DSP-processorer eller videokodare/avkodare.
- Möjlighet att sömlöst dela ytor (Media Surface Sharing) mellan OpenCL och API DirectX 9/11.
OpenCL 2.0 introducerades den 22 juli 2013 [7] och standardiserades den 18 november samma år [8] .
- Delat virtuellt minne - Tillåter värd- och enhetskärnor att dela datastrukturer baserade på komplexa adressreferenser, vilket eliminerar explicita överföringar mellan värd och enheter samtidigt som programmeringsflexibiliteten ökar.
- Kapslad parallellism - Uppdateringen har förbättrat programmeringsupplevelsen och ökat applikationsprestanda.
- Universellt adressutrymme - Låter dig skriva funktioner utan att namnge ett adressutrymme, vilket ökar flexibiliteten och sparar tid genom att eliminera behovet av att skriva flera funktioner.
- Device Side Atomic C11 Operations - En delmängd av C11 atomic och synkroniseringsoperationer möjliggör parallell exekvering av trådar för att fungera säkert på delade datamängder.
- Kanaler - Minnesobjekt organiserade på ett FIFO-sätt, vilket förenklar datastrukturerna för en delad kö.
OpenCL 2.1 introducerades den 3 mars 2015 och standardiserades den 16 november samma år. Den skrev om kärnan från C till C++14 .
OpenCL 3.0 introducerades den 27 april 2020 [9] och standardiserades den 30 september samma år [10] . Noterbara förändringar inkluderar att OpenCL 3.0 API nu täcker alla versioner av OpenCL (1.2, 2.x), utan att tillhandahålla separata specifikationer för varje version.
Händelser
- 3 mars 2011 — Khronos-gruppen tillkännager skapandet av WebCL-arbetsgruppen för att utveckla ett JavaScript -gränssnitt till OpenCL-standarden. Detta skapar potential att använda GPU:er och flerkärniga processorer för att bearbeta beräkningar parallellt i en webbläsare. [elva]
- 4 maj 2011 - Nokia Research släppte ett WebCL-tillägg med öppen källkod för webbläsaren Firefox . [elva]
- 1 juli 2011 - Samsung Electronics släppte en öppen WebCL-prototyp för WebKit-motorn . [elva]
- 8 augusti 2011 — AMD släppte AMD Accelerated Parallel Processing (APP) Software Development Kit (SDK) v2.5 OpenCL-drivrutinen, som ersätter ATI Stream SDK.
- 15 november 2011 - Khronos-kommittén släppte en uppdaterad OpenCL 1.2-specifikation. Den nya versionen innehåller många små förbättringar relaterade till ökad språkflexibilitet och prestandaoptimeringar.
- 1 december 2012 - Khronos-kommittén släppte ytterligare en uppdatering av OpenCL 1.2-specifikationen. Den nya versionen har förbättrat interaktion med OpenGL, förbättrad säkerhet i WebGL, lagt till stöd för att ladda OpenCL-program från SPIR-mellanrepresentationen.
Funktioner i språket
De viktigaste skillnaderna mellan det använda språket och C (1999 ISO-standard) är:
- brist på stöd för funktionspekare , rekursion , bitfält , arrayer med variabel längd (VLA), standardhuvudfiler [12] ;
- språktillägg för samtidighet: vektortyper, synkronisering, funktioner för arbetsobjekt/arbetsgrupper [12] ;
- minnestypskvalificerare: __global, __local, __constant, __private;
- olika uppsättning inbyggda funktioner.
Exempel
FFT- beräkningsexempel :
[13]
// att skapa en datorkontext för GPU- kontexten (videokort) = clCreateContextFromType ( NULL , CL_DEVICE_TYPE_GPU , NULL , NULL , NULL );
// skapa en kommandokö
kö = clCreateCommandQueue ( kontext , NULL , 0 , NULL );
// minnesallokering i form av buffertar
memobjs [ 0 ] = clCreateBuffer ( kontext , CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR , sizeof ( float ) * 2 * num_entries , srcA , NULL ;
memobjs [ 1 ] = clCreateBuffer ( kontext , CL_MEM_READ_WRITE , sizeof ( float ) * 2 * num_entries , NULL , NULL );
// skapa ett program från
källprogrammet = clCreateProgramWithSource ( context , 1 , & fft1D_1024_kernel_src , NULL , NULL );
// kompilera programmet
clBuildProgram ( program , 0 , NULL , NULL , NULL , NULL );
// skapa ett kärnobjekt från en kompilerad programkärna
= clCreateKernel ( program , " fft1D_1024 " , NULL );
// förbered argument
clSetKernelArg ( kärna , 0 , sizeof ( cl_mem ), ( void * ) & memobjs [ 0 ]);
clSetKernelArg ( kärna , 1 , sizeof ( cl_mem ), ( void * ) & memobjs [ 1 ]);
clSetKernelArg ( kärna , 2 , sizeof ( float ) * ( local_work_size [ 0 ] + 1 ) * 16 , NULL );
clSetKernelArg ( kärna , 3 , sizeof ( float ) * ( local_work_size [ 0 ] + 1 ) * 16 , NULL );
// ställa in ND-intervallet med arbetsobjektdimensioner och skicka det till exekveringskön
global_work_size [ 0 ] = antal_poster ;
local_work_size [ 0 ] = 64 ;
clEnqueueNDRangeKernel ( kö , kärna , 1 , NULL , global_work_size , local_work_size , 0 , NULL , NULL );
Direkta beräkningar (baserade på att FFT anpassas till G80-arkitekturrapporten) [14] :
// Denna kod beräknar FFT av längd 1024 genom att dela upp den i 16, 16 och 4
__kärna 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 ] ;
// adress för början av den bearbetade datan i globalt minne
i = in + blockIdx ; ut = ut + blockIdx ;
globalLoads ( data , in , 64 ); // sammanslagna globala läser fftRadix16Pass ( data ); // in-place radix-16 pass twiddleFactorMul ( data , tid , 1024 , 0 );
// lokal blandning med lokalt minne
localShuffle ( data , sMemx , sMemy , tid , ((( tid & 15 ) * 65 ) + ( tid >> 4 )));
fftRadix16Pass ( data ); // in-place radix-16 pass twiddleFactorMul ( data , tid , 64 , 4 ); // twiddle factor multiplikation
localShuffle ( data , sMemx , sMemy , tid , ((( tid >> 4 ) * 64 ) + ( tid & 15 )));
// 4 FFT-anrop av order 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 , ut , 64 );
}
En fullständig implementering av FFT i OpenCL finns tillgänglig på Apples webbplats [15] .
Applikation
OpenCL används, som en av implementeringarna av det allmänna GPU- konceptet , i olika programvaror.
- WinZip v16.5 ( 2012 ) från Corel - förutom den uppdaterade motorn för att förbättra dess optimering för flerkärniga processorer, har OpenCL-stöd lagts till för AMD GPU:er (dock inte för Intel och Nvidia) - samtidigt som prestanda ökar i denna tillämpning på Trinity och Llano APU var upp till 45 %. [16]
Se även
Anteckningar
- ↑ AMD driver antagande av industristandarder i GPGPU-programvaruutveckling . AMD. Arkiverad från originalet den 19 mars 2012. (obestämd)
- ↑ AMD stöder OpenCL, Microsoft DirectX 11 . eWeek. Arkiverad från originalet den 19 mars 2012. (obestämd)
- ↑ Apple förhandsgranskar Mac OS X Snow Leopard för utvecklare . Äpple. Arkiverad från originalet den 19 mars 2012. (obestämd)
- ↑ Andrew Humber. NVIDIA släpper OpenCL-drivrutin till utvecklare . NVIDIA (20 april 2009). - Originalnyheter på den officiella webbplatsen för NVIDIA Corporation. Hämtad 21 april 2009. Arkiverad från originalet 19 mars 2012.
- ↑ Pavel Shubsky. NVIDIA har öppnat GPGPU för utvecklare under OpenCL (inte tillgänglig länk) . Igromania (tidskrift) (21 april 2009). Hämtad 21 april 2009. Arkiverad från originalet 25 april 2009. (obestämd)
- ↑ Sergey och Marina Bondarenko. OpenCL-drivrutin för utvecklare från NVIDIA . 3DNews (21 april 2009). Hämtad 21 april 2009. Arkiverad från originalet 23 april 2009. (obestämd)
- ↑ Khronos släpper OpenCL 2.0 . khronos.org (22 juli 2013). Hämtad 22 juli 2013. Arkiverad från originalet 17 augusti 2013.
- ↑ Khronos slutför OpenCL 2.0 Specification for Heterogeneous Computing , Khronos Group ( 18 november 2013). Arkiverad 11 november 2020. Hämtad 20 november 2013.
- ↑ Khronos Group släpper OpenCL 3.0 provisoriska specifikationer . Khronos Group (27 april 2020). Hämtad 27 april 2020. Arkiverad från originalet 18 januari 2021.
- ↑ OpenCL 3.0-specifikation slutförd och initial Khronos Open Source OpenCL SDK släppt . Khronos Group (30 september 2020). Hämtad 30 september 2020. Arkiverad från originalet 30 september 2020.
- ↑ 1 2 3 Implementering av WebCL-teknologi presenterad för WebKit . opennet.ru (4 juli 2011). Hämtad 31 oktober 2011. Arkiverad från originalet 18 maj 2012. (ryska)
- ↑ 12 AMD . Introduktion till OpenCL-programmering 201005, sid 89-90
- ↑ OpenCL . SIGGRAPH2008 (14 augusti 2008). Hämtad 14 augusti 2008. Arkiverad från originalet 19 mars 2012. (obestämd)
- ↑ Montera FFT på G80 Architecture (PDF). Vasily Volkov och Brian Kazian, UC Berkeley CS258 projektrapport (maj 2008). Hämtad 14 november 2008. Arkiverad från originalet 19 mars 2012.
(obestämd)
- ↑ .
OpenCL på FFT (inte tillgänglig länk) . Apple (16 november 2009). Hämtad 7 december 2009. Arkiverad från originalet 30 november 2009. (obestämd)
- ↑ AMD Trinity Benchmarks - OpenCL Arkiverad 29 augusti 2012 på Wayback Machine // THG
Litteratur
- Aaftab Munshi; Benedict R. Gaster; Timothy G. Mattson; James Fung; Dan Ginsburg. OpenCL programmeringsguide. - Addison-Wesley Professional, 2011. - 648 sid. — ISBN 978-0-321-74964-2 .
Länkar