OpenCL
| OpenCL | ||
|---|---|---|
| Heterogenní výpočetní část | ||
|
| ||
|
| ||
| 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é
- GPGPU
- CUDA
- blízko kovu
- BrookGPU
- Lib Sh
- Larrabee (GPU)
Reference
- ↑ a b Khronos vydává OpenCL 3.0
- ^ a b "OpenCL" . SIGGRAPH2008. 14. srpna 2008. Archivováno z originálu 19. března 2012 . Staženo 14. srpna 2008 .
- ^ „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 .
- ↑ „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 .
- ^ „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 .
- ^ "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 .