OpenCL - The open standard for parallel programming of heterogeneous systems
GPU-k általános számításokhoz GPU Graphics Processing Unit Képalkotás: sok, általában egyszerű és független művelet < 2006: programmable shaders renderelés (Pixar RenderMan Toy Story) 2006: CUDA -Compute Unified Device Architecture csak Nvidia kártyákon kezdetben 128 CUDA core, 8 compute unit (Tesla c870) 2008: OpenCL cross-platform Khronos csoport (OpenGL!) OpenCL 1.0: Mac OS X Snow Leopard 2009 fontosabb partnerek: AMD, Intel (Larrabee) és természetesen Nvidia Alternatívák: DirectCompute, OpenMP, OpenACC stb.
OpenCL working group members Nvidia in chair, Apple is specification editor Már most is tekinthető általános szabványnak.
OpenCL könyvek OpenCL Programming Guide - The Red Book of OpenCL http://www.amazon.com/opencl-programming-guide-aaftab-munshi/dp/0321749642 OpenCL in Action http://www.amazon.com/opencl-action-accelerate-graphics-computations/dp/1617290173/ Heterogeneous Computing with OpenCL http://www.amazon.com/heterogeneous-computing-with-opencl-ebook/dp/b005jrhyus The OpenCL Programming Book http://www.fixstars.com/en/opencl/book/
OpenCL API AMD http://developer.amd.com/zones/openclzone/ INTEL http://software.intel.com/en-us/articles/opencl-sdk/ NVIDIA http://developer.nvidia.com/opencl
OpenCL: egy példa Soros megoldás OpenCL megoldás void add_vector(int dim,float *A,float *B, float *C) { for(int i=0;i<dim;i++) C[i]=A[i]+B[i]; } kernel void add_vector( global float *A, global float *B,_global float *C) { int tidx = get_global_id(0); Különbségek:? C[tidx]=A[tidx]+B[tidx]; }
OpenCL: egy példa (C) Soros megoldás OpenCL megoldás void add_vector(int dim,float *A,float *B, float *C) { for(int i=0;i<dim;i++) C[i]=A[i]+B[i]; } kernel void add_vector( global float *A, global float *B,_global float *C) { int i = get_global_id(0); C[i]=A[i]+B[i]; } Különbségek: - hol a vektor dimenziója? Soros kód: dim változó OpenCL: a get_global_id(0) maximumális értéke a dimenzió, melyet előzőleg beállítottunk a kernel hívás előtt - milyen memória címeket használhatunk? Minden OpenCL compute device saját memória területtel rendelkezik, melyet előre le kell foglalnunk
OpenCL: compute device memory types Global domain: work item size Local groups: workgroups Eszköz specifikus a paraméterezés, de mindent le tudunk kérdezni futásidőben.
OpenCL: memória Az architektúra legnagyobb hátránya: Egy számolás eredményének elérése: host device host Még abban az esetben is, ha a kódunkat a lokális CPU-n futtatjuk! A másolás egyik korlátja maga a PCI-express Lehetőség párhuzamos másolás-számolásra Megjegyzés: 1. sok esetben hatékonyabb helyben újraszámolni mint beolvasni 2. sok esetben a kiolvasás lassúsága miatt nem hatékony 3. Nincs virtuális memória de lesz!
OpenCL: memória Hierarchikus memória: Minél Az architektúra legnagyobb hátránya: lentebb megyünk annál kisebb a memória eredményének mérete, cserébe egyre Egy számolás elérése: gyorsabb! host device host Még 1. abban esetben is, ha a kódunkat Hostazmemory a lokáliscsak CPU-n futtatjuk! a CPU éri el, 10-20 GB/s Akár 512 GB 2. Global/Constant memory Csak az adott device-on látható Lehetőség párhuzamos másolás-számolásra 100-250 GB/sec (GPU), <6GB 3. Local memory Megjegyzés: Csak egy adott workgroup látja 1. sok esetben hatékonyabb helyben 16-64 KB/work-item újraszámolni mint beolvasni 4. Private memory 2. sok esetben a kiolvasás lassúsága Csak az adott work-item látja miatt nemkb hatékony 16-64 A másolás egyik korlátja maga a PCI-express 3. Nincs virtuális memória de lesz!
OpenCL: fordítás Fordítás történhet offline és online módon. Utóbbi az elterjedt. univerzális OpenCL API: C/C++ objektumok: Konfiguráció: Device - eszköz objektuma Context - eszközök környezet Queue - feladatok kiosztása Memória: Buffer - memória blokkok Image - 2D vagy 3D kép Végrehajtás: Program - kernelek Kernel - maguk a feladatok Példa fordításra: Mac OS X (>10.6): g++ -framework OpenCL cl_test.cpp -o cl_test Linux: Nvidia SDK g++ -I<NVIDIA_SDK>/OpenCL/common/inc/ cl_test.cpp -o cl_test
OpenCL: fordítás
Példa: Alacsony szintű képi leírók számolása Segmentation Region of Interest Dense Grid
Példa: Alacsony szintű képi leírók számolása Sok ezer független leíró képenként a párhuzamosítás alapja Mivel GPU/CPU közös kód: - csak egy dimenziós párhuzamosítás - no image support Kis memória igény: - maga a nyers kép pl. 1Mio*3Byte - gradiens képek: 1Mio*4Byte - leírók: 128*4*N Byte Nyereség: ~10x CPU-hoz képest (nem optimális) Még több ha PCA + Fisher számolás : ~40x