Tvůrce | Jablko |
---|---|
Vyvinul | Skupina Khronos |
První verze | 28. srpna 2009 |
Poslední verze | 3,0 (30. září 2020) |
Napsáno | C a C ++ |
Operační systém | Microsoft Windows , macOS , Linux , FreeBSD a Android |
životní prostředí | Architektura X86_64 , IA-32 ( in ) a ARM |
Typ |
Rámcový programovací jazyk |
Licence | Licence open-source ( d ) |
webová stránka | www.khronos.org/opencl |
OpenCL ( Open C omputing L anguage ) je kombinace rozhraní API a programovacího jazyka odvozeného od jazyka C , který společnost Khronos Group navrhuje jako otevřený standard . OpenCL je navržen k programování heterogenních paralelních systémů zahrnujících například vícejádrový procesor a GPU . OpenCL proto nabízí programovací model umístěný na vznikající křižovatce mezi světem CPU a GPU , přičemž první je stále více paralelní a druhý programovatelnější.
OpenCL odlišuje hostitelský procesor (centrální procesor fungující jako vodič) od periferních zařízení (CPU, GPU nebo jiných), jejichž úkolem je provozovat jádra náročná na výpočet. OpenCL proto rozlišuje na jedné straně aplikaci běžící na hostitelském procesoru (a která bude volat OpenCL API) a na druhé straně jádra, která jsou naprogramována v OpenCL-C (a jejichž povolání má běžet na zařízeních).
OpenCL umožňuje vyjádřit paralelismus úkolů, ale také paralelismus dat ve dvou formách; SPMD ( Single Program Multiple Data ) a SIMD ( Single Instruction Multiple Data ), vše hierarchicky. Graf úkolů lze dynamicky vytvářet pomocí rozhraní OpenCL API. Každou úlohu lze reprezentovat buď jako jednu instanci (nazývanou úloha), nebo jako soubor instancí (nazývaných NDRange) stejného jádra. Změny NDR mohou mít 1, 2 nebo 3 rozměry. Každá instance jádra patřící do NDRange se nazývá pracovní položka . Samotný NDrange může být strukturován do pracovních skupin , což umožňuje pracovním položkám v rámci pracovních skupin sdílet data a synchronizovat se přes překážky.
Pokud se mezi některými z jeho technických cílů zdá OpenCL blíže C pro CUDA , proprietární programovací model společnosti Nvidia, má OpenCL širší cíle, protože není věnován pouze GPU. Ve světě vysoce výkonných počítačů nebo her vám OpenCL umožní využít sílu grafických procesorů, vícejádrových procesorů nebo jiných intenzivních výpočetních systémů, jako je IBM CELL , která zejména vybavuje PlayStation 3 Sony. Ve světě vestavěných systémů na čipu ( SoC ), jaké se nacházejí v chytrých telefonech , OpenCL umožní přístup prostřednictvím jediné programovací infrastruktury k centrálnímu procesoru i k různým vestavěným multimediálním subsystémům (GPU, DSP) , výpočetní pole nebo jiné).
V současné době existuje několik způsobů, jak ladit jádra OpenCL. Nejprve ladicí program NVIDIA Parallel Nsight , schopný ladit vlákno CUDA po vlákně, aktuálně nepodporuje OpenCL, ale umožňuje pouze sledování volání API . Poté AMD navrhuje rozšíření umožňující umístit stopy přímo do kódu OpenCL (cl_amd_printf). Nakonec program s názvem gDebugger (od společnosti Gremedy, poté od společnosti AMD ) vám umožní sledovat postup algoritmu vlákno po vlákně. gDebugger se vyvinul, nyní se nazývá CodeXL a je hostitelem iniciativy GPUOPEN .
OpenCL byl původně navržen společností Apple (která registrovala ochrannou známku) a vylepšil ji ve spolupráci s AMD , Intel a Nvidia . Apple nejprve předloží svůj původní návrh skupině Khronos . The16. června 2008, byla vytvořena pracovní skupina Khronos Compute Working Group , složená ze zástupců výrobců hardwaru a softwaru. Pracoval pět měsíců na dokončení technických podrobností specifikace OpenCL 1.0 . Specifikace je přezkoumána členy Khronos a schválena pro zkušební verzi dne8. prosince. Nová verze, OpenCL 1.1 , je vydána včerven 2010skupinou Khronos . OpenCL 1.1 objasňuje některé aspekty předchozí specifikace a přináší nové funkce, jako jsou dílčí vyrovnávací paměti , 3-elementové vektory, uživatelské události, nové vestavěné funkce , standardní podpora pro volitelná rozšíření 1.0 (například funkce 32bitové atomové).
OpenCL je integrován do Mac OS X 10.6 ( Snow Leopard ). AMD se ve svém rámci Stream SDK rozhodne podporovat spíše OpenCL a DirectX 11 než Close to Metal . RapidMind (in) ohlašuje přijetí OpenCL ve svém vývoji platformy pro podporu grafických procesorů od různých výrobců pomocí jediného rozhraní. Nvidia také potvrzuje 9. prosince 2008plnou podporu specifikace 1.0 ve své sadě GPU Computing Toolkit .
The 15. listopadu 2011, skupina Khronos vydala specifikace pro OpenCL 1.2 . Zahrnuje funkce související s mobilitou a přenositelností, například s možností disociace kompilace a úpravy odkazů na jádro .
Skupina Khronos také vyvinula integraci OpenCL, paralelní výpočetní knihovny, do všech programovacích rozhraní HTML5. V současné době používají prohlížeče ke správě OpenCL rozšíření.
Nokia a Mozilla vyvinuli rozšíření pro Firefox. Samsung na WebKit a Motorola pro Node.js .
Implementace OpenCL dnes existují pro většinu platforem. IBM pro své superpočítače pod GNU / Linux využívající procesory Power, procesory X86 od společností Intel a AMD a GPU, které je tradičně doprovázejí (ATI, nVidia, VIA), procesory ARM Cortex-A9 (části SSE a fpu 128 bitů Neon), stejně jako DSP , GPU a další počítačové čipy , které je doprovázejí v mnoha implementací systému na čipu (SoC) (nVidia Tegra2 , Qualcomm Snapdragon , Apple A4 , Marvell Armada , atd ). Mesa (implementace OpenGL / OpenVG v systému GNU / Linux) obsahuje sledovač stavu OpenCL pro vyvíjený Gallium3D s názvem Clover
The 10. prosince 2008Společnosti AMD a Nvidia představují první veřejnou demonstraci OpenCL, což je 75minutová prezentace na SIGGRAPH Asia 2008 . AMD předvádí OpenCL s akcelerací CPU a vysvětluje škálovatelnost OpenCL na jednom nebo více jádrech, zatímco NVIDIA předvádí demo s akcelerací GPU.
The 26. března 2009, na GDC 2009 , AMD a Havok předvádějí první implementaci s akcelerací OpenCL, Havok Cloth na GPU řady AMD Radeon HD 4000 .
The 20. dubna 2009„Nvidia oznamuje vydání svého ovladače OpenCL a SDK vývojářům, kteří se účastní jeho programu OpenCL Early Access Program .
The 5. srpna 2009AMD odhaluje první vývojové nástroje pro svou platformu OpenCL jako součást svého programu ATI Stream SDK v2.0 Beta .
The 28. srpna 2009, Apple vydává Mac OS X Snow Leopard , který obsahuje plnou implementaci OpenCL.
Ve Snow Leopard je OpenCL zpočátku podporován na čipech ATI Radeon HD 4850 , ATI Radeon HD 4870 a Nvidia Geforce 8600M GT, GeForce 8800 GS, GeForce 8800 GT, GeForce 8800 GTS, Geforce 9400M, GeForce 9600M GT, GeForce GT 120 , GeForce GT 130 , GeForce GTX 285 , Quadro FX 4800 a Quadro FX 5600 .
The 28. září 2009, Nvidia vydává své vlastní ovladače OpenCL a implementaci SDK.
The 13. října 2009Společnost AMD vydala čtvrtou beta verzi sady ATI Stream SDK 2.0 , která poskytuje plnou implementaci OpenCL na všech GPU rodiny R700 / R800 , rovněž s využitím jednotek SSE3 CPU. SDK je k dispozici pro GNU / Linux i Windows.
The 30. října 2009, IBM je uvolnění verze 0.1 svého OpenCL SDK pro GNU / Linux na Power architektury používané ve většině z nejvýkonnějších superpočítačů na světě.
The 26. listopadu 2009, Nvidia vydává ovladače pro implementaci OpenCL 1.0 (rev 48).
Implementace OpenCL společnosti Apple, Nvidia, RapidMind (in) a Mesa Gallium3D jsou založeny na kompilační technologii LLVM a používají kompilátor Clang jako rozhraní .
The 10. prosince 2009, VIA vydává svůj první produkt podporující OpenCL 1.0 - video procesor ChromotionHD 2.0 obsažený v čipech VN1000 .
The 21. prosince 2009, AMD vydává produkční verzi sady ATI Stream SDK 2.0 , která poskytuje podporu OpenCL 1.0 pro GPU R800 a beta podporu pro R700 .
The 29. června 2011, Intel vydává finální verzi své vývojové sady podporující OpenCL verze 1.1 .
The 3. srpna 2011, AMD oznamuje svoji vývojovou sadu ATI Stream SDK 2.5 , která mimo jiné zlepšuje šířku pásma CPU / GPU, aby co nejlépe využila své nedávné APU .
U společnosti Intel, grafické procesory zahrnuté v jeho řadě procesorů Ivy Bridge , vydané dne29.dubna 2012Intel HD 2500 a HD 4000 a vyšší jsou první architektury hardwarové podpory OpenCL ve verzi 1.1 .
Knihovna Donut je bezplatná knihovna OpenCL pro procesory Intel Ivy Bridge GT2, která je součástí projektu freedesktop.org a je vyvíjena hlavně společností Intel. Používá hlavně LLVM , ale je také kompatibilní s GCC .
Na konci roku 2013 společnost ARM zase oznámila „ Mali OpenCL SDK “ pro své grafické procesory Mali T600 a vyšší , jejichž první modely byly vydány v roce 2012. Zdroje jsou k dispozici, ale licence je vlastnická a závazná pro další distribuci .
Tento příklad vypočítá rychlou Fourierovu transformaci
/* 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);Výpočet: (na základě přizpůsobení FFT architektuře G80 )
// 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); }