Upload
others
View
6
Download
0
Embed Size (px)
Citation preview
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/0321749642OpenCL 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/B005JRHYUSThe 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
__kernel void add_vector(__global float *A,__global float *B,_global float *C){ int tidx = get_global_id(0); C[tidx]=A[tidx]+B[tidx];}
void add_vector(int dim,float *A,float *B,float *C){ for(int i=0;i<dim;i++) C[i]=A[i]+B[i];}
Soros megoldás OpenCL megoldás
Különbségek: ?
OpenCL: egy példa (C)
__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];}
void add_vector(int dim,float *A,float *B,float *C){ for(int i=0;i<dim;i++) C[i]=A[i]+B[i];}
Soros megoldás OpenCL megoldás
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 devicememory types
Global domain: work item sizeLocal 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
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!
Hierarchikus memória: Minél lentebb megyünk annál kisebb a memória mérete, cserébe egyre gyorsabb!
1. Host memory Csak a CPU éri el, 10-20 GB/s Akár 512 GB2. Global/Constant memory Csak az adott device-on látható 100-250 GB/sec (GPU), <6GB3. Local memory Csak egy adott workgroup látja 16-64 KB/work-item4. Private memory Csak az adott work-item látja 16-64 KB
OpenCL: fordításFordí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 Dense Grid Region of Interest
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