close

OpenCL

Přejít na navigaci Přejít na hledání
OpenCL
Heterogenní výpočetní část
OpenCL logo.svg
Programmeinstelungen OpenCL Mandelbulber v2.23 20201208.png
Obecná informace
typ programu Aplikační programovací rozhraní , GPGPU
Autor Manzana
vývojář Skupina Kronos
První vydání 28. srpna 2009
Licence bez poplatku
Technické informace
Naplánováno v
Podporované platformy
Verze
Nejnovější stabilní verze 3.0 [ 1 ]​ ( info ) ( 27. dubna 2020 (2 roky, 5 měsíců a 21 dní) [ 1 ] ​)
Odkazy

OpenCL ( Open Computing Language ) se skládá z aplikačního programovacího rozhraní a programovacího jazyka . Dohromady vám umožňují vytvářet aplikace s paralelním zpracováním dat a úloh, které mohou běžet jak na centrálních procesorových jednotkách , tak na grafických procesorových jednotkách . Jazyk je založen na C99 , odstraňuje některé funkce a rozšiřuje je o vektorové operace. [ 2 ]

Původní specifikace byla vytvořena společností Apple a vyvinuta ve spolupráci s AMD , IBM , Intel a NVIDIA . Apple jej navrhl skupině Khronos Group , aby se stal otevřeným standardem bez licenčních poplatků. Dne 16. června 2008 vytvořil Khronos Compute Working Group [ 3 ] , aby provedla proces standardizace. V roce 2013 byla vydána verze 2.0 standardu.

OpenCL je součástí Mac OS X v10.6 ('Snow Leopard'), [ 4 ] zatímco AMD se rozhodlo podporovat OpenCL místo svého starého Close to Metal API . [ 5 ] ​[ 6 ]​ Intel má také své vlastní vývojové prostředí a NVIDIA, kromě vlastního API pro grafické čipy zvané CUDA, podporuje také OpenCL.

Příklad

Tento příklad počítá rychlou Fourierovu transformaci . [ 2 ]​ Volání API jsou následující:

// vytvoření kontextu výpočtu s kontextem zařízení GPU 
= clCreateContextFromType ( CL_DEVICE_TYPE_GPU ) ;  

// vytvoření fronty pracovní 
fronty = clCreateWorkQueue ( context , NULL , NULL , 0 );     

// alokace objektů vyrovnávací paměti 
memobjs [ 0 ] = clCreateBuffer ( kontext , 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 );     

// vytvořte výpočetní program 
program = clCreateProgramFromSource ( context , 1 , & fft1D_1024_kernel_src , NULL );     

// sestavení spustitelného souboru výpočetního programu 
clBuildProgramExecutable ( program , false , NULL , NULL );   

// vytvoření výpočetního jádra 
jádra = clCreateKernel ( program , fft1D_1024 );   

// vytvoření objektu rozsahu ND s rozměry pracovní položky 
global_work_size [ 0 ] = n ;  
local_work_size [ 0 ] = 64 ;  
rozsah = clCreateNDRangeContainer ( kontext , 0 , 1 , global_work_size , local_work_size );      

// nastavení hodnot args 
​​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 ( jádro , 3 , NULL , sizeof ( float ) * ( local_work_size [ 0 ] + 1 ) * 16 , NULL );    

 // vykoná jádro 
clExecuteKernel ( fronta , jádro , NULL , rozsah , NULL , 0 , NULL );      

Samotný výpočet je tento:

// Toto jádro počítá FFT délky 1024. FFT délky 1024 se rozloží na 
// volání funkce radix 16, další funkce radix 16 a poté funkce radix 4 
__kernel void fft1D_1024 ( __global float2 * in , * out , _global float2 __local float * sMemx , __local float * sMemy ) { int tid = get_local_id ( 0 ); int blockIdx = get_group_id ( 0 ) * 1024 + tid ; data float2 [ 16 ]; // počáteční index dat do/z globální paměti in = in + blockIdx ; out = out + blockIdx ; globalLoads ( data , in , 64 ); // sloučené globální čtení fftRadix16Pass ( data ); // in-place radix-16 pass twiddleFactorMul ( data , tid , 1024 , 0 ); // místní náhodné přehrávání pomocí lokální paměti localShuffle ( data , sMemx , sMemy , tid , ((( tid & 15 ) * 65 ) + ( tid >> 4 ))); fftRadix16Pass ( data ); // in-place radix-16 pass twiddleFactorMul ( data , tid , 64 , 4 ); // násobení faktoru twiddle localShuffle ( data , sMemx , sMemy , tid , ((( tid >> 4 ) * 64 ) + ( tid & 15 ))); // čtyři volání funkce radix-4 fftRadix4Pass ( data ); fftRadix4Pass ( data + 4 ); fftRadix4Pass ( data + 8 ); fftRadix4Pass ( data + 12 ); // coalesced global zapisuje globalStores ( data , out , 64 ); }         
                                 
      
          
    
  
             
     
        
      
  
               
                 
      
               
  
      
        
  
     

Viz také

Reference

  1. a b Khronos vydává OpenCL 3.0
  2. ^ a b "OpenCL" . SIGGRAPH2008. 14. srpna 2008. Archivováno z originálu 19. března 2012 . Staženo 14. srpna 2008 . 
  3. ^ „Khronos spouští iniciativu heterogenních počítačů“ . Skupina Chronos. 16. června 2008. Archivováno z originálu 20. června 2008 . Získáno 18. června 2008 . 
  4. „Apple zobrazuje vývojářům Mac OS X Snow Leopard“ . Manzana. 9. června 2008. Archivováno z originálu 11. června 2008 . Získáno 9. června 2008 . 
  5. ^ „AMD podporuje přijetí průmyslových standardů ve vývoji softwaru GPGPU“ . AMD. 6. srpna 2008. Archivováno z originálu 16. září 2008 . Staženo 14. srpna 2008 . 
  6. ^ "AMD podporuje OpenCL, Microsoft DirectX 11" . eTýden. 6. srpna 2008. Archivováno z originálu 19. března 2012 . Staženo 14. srpna 2008 . 

Externí odkazy