close

OpenCL

Zur Navigation gehen Zur Suche gehen
OpenCL
Teil des heterogenen Rechnens
OpenCL-Logo.svg
Programmeinstellungen OpenCL Mandelbulber v2.23 20201208.png
Allgemeine Information
Programmtyp Anwendungsprogrammierschnittstelle , GPGPU
Autor Manzana
Entwickler Kronos-Gruppe
Erstveröffentlichung 28. August 2009
Lizenz Gebührenfrei
Technische Information
Eingeplant
Unterstützte Plattformen
Versionen
Neueste stabile Version 3.0 [ 1 ]​ ( info ) ( 27. April 2020 (2 Jahre, 5 Monate und 21 Tage) [ 1 ] ​)
Verknüpfungen

OpenCL ( Open Computing Language ) besteht aus einer Anwendungsprogrammierschnittstelle und einer Programmiersprache . Zusammen ermöglichen sie die Erstellung von Anwendungen mit Parallelität auf Daten- und Aufgabenebene, die sowohl auf Zentraleinheiten als auch auf Grafikeinheiten laufen können . Die Sprache basiert auf C99 , entfernt einige Funktionen und erweitert sie um Vektoroperationen. [ 2 ]

Die ursprüngliche Spezifikation wurde von Apple erstellt und in Zusammenarbeit mit AMD , IBM , Intel und NVIDIA entwickelt . Apple schlug es der Khronos Group vor, es zu einem offenen, lizenzfreien Standard zu machen. Am 16. Juni 2008 gründete Khronos die Compute Working Group [ 3 ] , um den Standardisierungsprozess durchzuführen. 2013 wurde die Version 2.0 des Standards veröffentlicht.

OpenCL ist Teil von Mac OS X v10.6 ('Snow Leopard'), [ 4 ] während AMD sich entschieden hat, OpenCL anstelle seiner alten Close-to-Metal -API zu unterstützen . [ 5 ] ​[ 6 ]​ Intel hat auch eine eigene Entwicklungsumgebung und NVIDIA unterstützt neben einer eigenen API für Grafikchips namens CUDA auch OpenCL.

Beispiel

Dieses Beispiel berechnet eine schnelle Fourier-Transformation . [ 2 ]​ Die API-Aufrufe lauten wie folgt:

// Compute-Kontext mit GPU-Gerätekontext erstellen 
= clCreateContextFromType ( CL_DEVICE_TYPE_GPU ) ;  

// eine Arbeitswarteschlange erstellen 
= clCreateWorkQueue ( context , NULL , NULL , 0 ) ;     

// die Pufferspeicherobjekte zuweisen 
memobjs [ 0 ] = clCreateBuffer ( context , CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR , sizeof ( float ) * 2 * num_entries , srcA );       
memobjs [ 1 ] = clCreateBuffer ( Kontext , CL_MEM_READ_WRITE , sizeof ( float ) * 2 * num_entries , NULL );     

// Berechnungsprogramm erstellen 
program = clCreateProgramFromSource ( context , 1 , & fft1D_1024_kernel_src , NULL );     

// Erstellen der ausführbaren Datei des 
Rechenprogramms clBuildProgramExecutable ( program , false , NULL , NULL );   

// Rechenkern erstellen 
kernel = clCreateKernel ( program , fft1D_1024 );   

// ND-Bereichsobjekt mit Arbeitselementabmessungen erstellen 
global_work_size [ 0 ] = n ;  
local_work_size [ 0 ] = 64 ;  
range = clCreateNDRangeContainer ( Kontext , 0 , 1 , globale_Arbeitsgröße , lokale_Arbeitsgröße );      

// setze die 
Argumentwerte clSetKernelArg ( kernel , 0 , ( void * ) & memobjs [ 0 ], sizeof ( cl_mem ), NULL );     
clSetKernelArg ( Kernel , 1 , ( void * ) & memobjs [ 1 ], sizeof ( cl_mem ), NULL );     
clSetKernelArg ( kernel , 2 , NULL , sizeof ( float ) * ( local_work_size [ 0 ] + 1 ) * 16 , NULL );    
clSetKernelArg ( kernel , 3 , NULL , sizeof ( float ) * ( local_work_size [ 0 ] + 1 ) * 16 , NULL );    

 // Kernel ausführen 
clExecuteKernel ( Warteschlange , Kernel , NULL , Bereich , NULL , 0 , NULL );      

Die Berechnung selbst ist diese:

// Dieser Kernel berechnet FFT der Länge 1024. Die FFT der Länge 1024 wird zerlegt in 
// Aufrufe einer Radix-16-Funktion, einer weiteren Radix-16-Funktion und dann einer Radix-4-Funktion 
__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 -Daten [ 16 ]; // Anfangsindex der Daten zum/vom globalen Speicher in = in + blockIdx ; aus = aus + blockIdx ; globalLoads ( Daten , in , 64 ); // verschmolzene globale Lesevorgänge fftRadix16Pass ( data ); // in-place radix-16 pass twiddleFactorMul ( data , tid , 1024 , 0 ); // lokaler Shuffle mit lokalem Speicher localShuffle ( data , sMemx , sMemy , tid , ((( tid & 15 ) * 65 ) + ( tid >> 4 ))); fftRadix16Pass ( Daten ); // in-place radix-16 pass twiddleFactorMul ( data , tid , 64 , 4 ); // Twiddle-Faktor-Multiplikation localShuffle ( data , sMemx , sMemy , tid , ((( tid >> 4 ) * 64 ) + ( tid & 15 ))); // vier Radix-4-Funktionsaufrufe fftRadix4Pass ( data ); fftRadix4Pass ( Daten + 4 ); fftRadix4Pass ( Daten + 8 ); fftRadix4Pass ( Daten + 12 ); // koaleszierte globale Schreibvorgänge globalStores ( data , out , 64 ); }         
                                 
      
          
    
  
             
     
        
      
  
               
                 
      
               
  
      
        
  
     

Siehe auch

Referenzen

  1. a b Khronos veröffentlicht OpenCL 3.0
  2. ^ a b "OpenCL" . SIGGRAPH2008. 14. August 2008. Archiviert vom Original am 19. März 2012 . Abgerufen am 14. August 2008 . 
  3. ^ "Khronos startet heterogene Computing-Initiative" . Chronos-Gruppe. 16. Juni 2008. Archiviert vom Original am 20. Juni 2008 . Abgerufen am 18. Juni 2008 . 
  4. „Apple gibt Entwicklern eine Vorschau auf Mac OS X Snow Leopard“ . Manzana. 9. Juni 2008. Archiviert vom Original am 11. Juni 2008 . Abgerufen am 9. Juni 2008 . 
  5. ^ "AMD fördert die Übernahme von Industriestandards in der GPGPU-Softwareentwicklung" . AMD. 6. August 2008. Archiviert vom Original am 16. September 2008 . Abgerufen am 14. August 2008 . 
  6. ^ "AMD unterstützt OpenCL, Microsoft DirectX 11" . eWoche. 6. August 2008. Archiviert vom Original am 19. März 2012 . Abgerufen am 14. August 2008 . 

Externe Links