grafikus kártyák, mint olcsó szuperszámítógépek -...

84
GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák, mint olcsó szuperszámítógépek - I. tanuló szeminárium Jurek Zoltán, Tóth Gyula SZFKI, Röntgendiffrakciós csoport

Upload: others

Post on 24-Oct-2019

2 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 1 )

Grafikus kártyák, mint olcsó szuperszámítógépek - I.

tanuló szeminárium

Jurek Zoltán, Tóth GyulaSZFKI, Röntgendiffrakciós csoport

Page 2: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 2 )

VázlatI.

● Motiváció● Beüzemelés● C alapok● CUDA programozási modell, hardware adottságok

II.● Optimalizálás● Tippek (pl. több GPU egyidejű használata)● Könyvtárak (cuFFT, cuBLAS, ...)● GPU számolás CUDA programozás nélkül

Page 3: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 3 )

Irodalom - CUDA● http://heim.ifi.uio.no/~knutm/geilo2008/seland.pdf

● CUDA, Supercomputing for the Masses Part 1-15http://www.drdobbs.com/cpp/207200659

● CUDA official manualsProgramming Guide, Reference Manual, Release Noteshttp://developer.nvidia.com/object/cuda_2_3_downloads.html

Page 4: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 4 )

Irodalom - Egyéb● Kernighan, Ritchie: The C Programming Languagehttp://zanasi.chem.unisa.it/download/C.pdfhttp://www.windowsceportal.hu/download/doc/cpl_hu.zip

● OpenMP tutorialhttps://computing.llnl.gov/tutorials/openMP/

● MPI tutorialhttps://computing.llnl.gov/tutorials/mpi/

Page 5: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 5 )

Motiváció

Page 6: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 6 )

Szuperszámítógép GPU-ból

Page 7: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 7 )

Moore törvényeTranzisztorok száma másfél-két évente duplázódik

Számítógép sebessége exp. növekszik

DEaz utóbbi ~4 évben megtorpant!

3GHz, 45nm

Page 8: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 8 )

A párhuzamosítás korszaka!

● Nem a sebesség, hanem a processzorok száma nő

● Át kell gondolni algoritmusaink szerkezetét: soros párhuzamos

Page 9: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 9 )

A párhuzamosítás korszaka!MPI (Message Passing Interface) - process szintű

● Tipikus sok gép(klaszter) esetén

● Külön memória a processznek

● Hálózati (TCP/IP) adattranszfer

Page 10: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 10 )

A párhuzamosítás korszaka!OpenMP (Open Multi-Processing) – szál (thread) szintű

● Egy gép – sok mag esetén

● Szálak: közös memóriaterület + saját változók

Page 11: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 11 )

Grafikus kártyák

nVidia GTX295:2 x 240 db 1.3GHz proc2 x 900MB memória

Tesla C10601 x 240 db 1.3GHz proc1 x 4000MB memória

GPU : Graphics Processing Unit

Page 12: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 12 )

Grafikus kártyák● CPU + coprocesszor (GPU)

● 1920 mag, 14 Tflops (float) (FLoating point Operations Per Second)

200x asztali gép teljesítmény

● ,,Személyi szuperszámítógép”: 1 kutató, 1 számítógép ● Elérhető: megfizethető ár

win/linux/mac + C

Page 13: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 13 )

Heterogén számolások

Host computer + Device

Page 14: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 14 )

GPU vs. CPUTEXTSzámítási teljesítmény

Page 15: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 15 )

GPU vs. CPUMemória sávszélesség

Page 16: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 16 )

GPU vs. CPUSzál-végrehajtás

● CPU: MIMDMultiple Instruction, Multiple Data

● GPU: SIMD Single Instruction, Multiple Data

Page 17: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 17 )

GPU vs. CPUA nagy memória (RAM) elérése rendkívül időigényes

(~100 órajel)

gyorsítás szükséges

CPU

~MB gyorsmemória (cache) a CPU-n

GPU

kicsi (~16kB) gyorsmemóriade ~128szál/mag hyperthreading

Page 18: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 18 )

GPGPU programozás története● Kezdet: masszív GPU programozás

● Utóbbi években két fejlesztői környezet:- nVidia – Compute Unified Device Architecture, CUDA - AMD Firestream (ATI)

(- intel: Larrabee, ~x86)

● OpenCL (Open Computing Language): nyílt szabványheterogén rendszerek (pl. CPU+GPU) programozáshoz

Page 19: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 19 )

CUDACompute Unified Device Architecture

● Magas szintű kiterjesztés a C/C++ nyelvhez

● CUDA programozási és memória modell

● nvcc fordító

GPUmagok számával skálázódó programok (kód újrafordítása nélkül)

Page 20: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 20 )

PéldákTEXT

Page 21: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 21 )

PéldákMolekula dinamika / kvantumkémia kódok + GPU

Page 22: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 22 )

CUDA - Beüzemelés

Page 23: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 23 )

CUDA eszközökhttp://www.nvidia.com/object/cuda_gpus.html

Page 24: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 24 )

CUDA telepítésHardware:GPU: 4 x nVidia GTX295

(1920 x 1.3GHz mag)CPU: Intel(R) Xeon(R) CPU

E5520 @ 2.27GHz (8 valós +

8 virtuális mag)Software:OpenSuse 11.2 Linux

gcc-4.4.1kernel 2.6.31.5-0.1 x86_64

Page 25: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 25 )

CUDA telepítésHardware:GPU: 4 x nVidia GTX295

(1920 x 1.3GHz mag)CPU: Intel(R) Xeon(R) CPU

E5520 @ 2.27GHz (8 valós +

8 virtuális mag)Software:OpenSuse 11.2 Linux

gcc-4.4.1kernel 2.6.31.5-0.1 x86_64

Page 26: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 26 )

CUDA telepítésHardware:GPU: 4 x nVidia GTX295

(1920 x 1.3GHz mag)CPU: Intel(R) Xeon(R) CPU

E5520 @ 2.27GHz (8 valós +

8 virtuális mag)Software:OpenSuse 11.2 Linux

gcc-4.4.1kernel 2.6.31.5-0.1 x86_64

Page 27: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 27 )

CUDA telepítésHardware:GPU: 4 x nVidia GTX295

(1920 x 1.3GHz mag)CPU: Intel(R) Xeon(R) CPU

E5520 @ 2.27GHz (8 valós +

8 virtuális mag)Software:OpenSuse 11.2 Linux

gcc-4.4.1kernel 2.6.31.5-0.1 x86_64

Page 28: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 28 )

CUDA telepítésDriver (root-ként telepíteni)

nvidia.ko; /usr/lib64/libcuda.so

Toolkit (célszerű root-ként telepíteni)nvcc compiler; CUDA FFT,BLAS; profiler; gdb default install: /usr/local/cuda

SDK (Software Development Kit; lehet felhasználóként is telepíteni)Példaprogramok; ~/NVIDIA_GPU_Computing_SDK

Page 29: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 29 )

CUDA letöltésekhttp://developer.nvidia.com/object/cuda_2_3_downloads.html

Page 30: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 30 )

CUDA letöltésekhttp://developer.nvidia.com/object/cuda_2_3_downloads.html

Page 31: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 31 )

CUDA telepítésDriver NVIDIA-Linux-x86_64-190.53-pkg2.run

root@linux> sh NVIDIA-Linux-x86_64-190.53-pkg2.run

szükséges: Base-development (gcc, make)Kernel-devel (kernel-source, headers)

Toolkit cudatoolkit_2.3_linux_64_suse11.1.runroot@linux> sh cudatoolkit_2.3_linux_64_suse11.1.run

SDK cudasdk_2.3_linux.runuser@linux> sh cudasdk_2.3_linux.run

Page 32: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 32 )

CUDA telepítés - rendszerbeállítások

● Futtatni release_notes_linux.txt (CUDA download page) scriptjét (-› load module, devs)

● ~/.bashrc-be:export PATH=/usr/local/cuda/binexport LD_LIBRARY_PATH=/usr/local/cuda/lib64

Megj. (”nem támogatott” linux esetén): ● nvcc nem kompatibilis gcc-4.4-gyel gcc-4.3● SDK példaprog.-hoz kellett: freeglut freeglut-devel

Page 33: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 33 )

SDK - példaprogramok

Fordítás:

cd ~/NVIDIA_GPU_Computing_SDK/Cmake

Példaprogramok:

cd ~/NVIDIA_GPU_Computing_SDK/C/bin/linux/release ls

Page 34: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 34 )

SDK - példaprogramokTEXT

Page 35: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 35 )

C gyorstalpaló

Page 36: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 36 )

C gyorstalpalómain függvény, változók

int main(void) // main fg. definiálás{

int i; // lokális változó def.

i=1; // értékadás

return(i); // fg. visszatérési érték}

// Ez egy komment

Adattípusok: int, float, double, char, ...

Page 37: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 37 )

C gyorstalpaló

Fordítás:

gcc -o test.out test.c

Futtatás:

./test.out

Page 38: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 38 )

C gyorstalpalóKülső függvények

#include <stdio.h> // küls� fg-ek deklarálásavoid main(void) // main fg. definiálás{

int i; // lokális változó def.

i=1; // értékadás

printf(”%d\n”,i); // küls� fg. hívása}

// Ez egy komment

Adattípusok: int, float, double, char, ...

Page 39: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 39 )

C gyorstalpalóKülső függvények

#include <math.h> // #include <stdio.h>

void main(void){

double x;

x = sqrt(2.0); // Küls� fg.

printf(”%e\n”,x);}

Page 40: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 40 )

C gyorstalpaló

Fordítás:

gcc -o test.out test.c -lm

Futtatás:

./test.out

Page 41: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 41 )

C gyorstalpalóFüggvények

int foo(int i, int j) { // fg. definiálásreturn(j*i); // visszatérési érték

}

int main(void) // main fg. definiálás{

int i=1; // lokális változó def.

i = foo(2,i); // függvényhívás

return(i); // fg. visszatérési érték}

Page 42: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 42 )

C gyorstalpalóFüggvények

int foo(int i, int j); // fg. deklarálás

int main(void) { // main fg. definiálásint i=1; // lokális változó def.

i = foo(2,i); // függvényhívás

return(i); // fg. visszatérési érték}

int foo(int i, int j) { // fg. definiálásreturn(j*i); // visszatérési érték

}

Page 43: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 43 )

C gyorstalpalóMutatók

i

Memória

p

int i, *p ;

p = &i ;

*p i

Page 44: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 44 )

C gyorstalpalóMutatók

#include <stdio.h>void main(void){

int i, *p; // mutató definiálás

i=1;

p = &i; // mutató i címéreprintf(”%d %d\n”,i,*p);// p értékének kiírása

*p = 2; // értékadás p értékéreprintf(”%d %d\n”,i,*p); // kiiratás

}

Page 45: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 45 )

C gyorstalpalóMutatók - tömbök

p[0] p[2]

Memória

p

int *p ;

p = malloc(5*sizeof(int));

p[0] *p

p[2] *(p+2)

p+2

sizeof(int)

Page 46: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 46 )

C gyorstalpalóTömbök - vektorok

#include <stdlib.h>void main(void) {

int i, *p, N=10;

p = (int*)malloc(N*sizeof(int)); //din.mem.f.

for (i=0; i<N; i=i+1) // tömbfeltöltés{

p[i] = 2*i; // vektorelem} // 2.0: double, 2.0f: float

free(p); // mem. felszabadítás}

Page 47: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 47 )

C gyorstalpalóTömbök - mátrixok

#include <stdlib.h>void main(void) {

int i, j, *p, N=10, M=20;

p = (int*)malloc(N*M*sizeof(int)); //mem.f.

for (i=0; i<N; i=i+1) { for (j=0; j<M; j=j+1) {

p[i*M+j] = 2*(i*M+j); // tömbfeltöltés }

}free(p);

}

Page 48: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 48 )

CUDA programozási modellés hardware felépítés

Page 49: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 49 )

Programozási modell● A CPU egy számoló egysége (coprocesszora) a GPU.

● A CPU és GPU külön memóriával rendelkezik (adatmásolás)

● Az eszközre fordított objektum a kernel

● A szálanként (thread) futó kernel

● adatpárhuzamos sok azonos vázú számolás különböző adatokon

Page 50: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 50 )

Kódséma

● CUDA programkód (”.cu” kiterjesztéssel)

● Fordítás nvcc fordítóval

● Futtatás

Megj.: célszerű egy könyvtárat létrehozni az adott részfeladat GPU-n történő elvégzéséhez, majd azt CPU-s programunkhoz kapcsolni (”linkelni”).

Page 51: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 51 )

Kódséma CUDA programkód:

● GPU-n futó rész (kernel): fg., ami a számolási feladat időigényes részét számolja (általában eredetileg röveidebb CPU kódrész)

● CPU-n futó rész: adatelőkészítésadatmásolás a GPU-raGPU kernel futtatásaadatmásolás a GPU-ról

Page 52: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 52 )

Futtatási modellEmlékeztető: OpenMP a CPU-n

Szálak: 0, 1, 2, ..., N-1

2

1

0

N-2

N-1

...2

1

0

N-2

N-1

...

Page 53: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 53 )

SDK - deviceQuery

Page 54: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 54 )

Fizikai felépítés

Reg

Reg

Global

SHARED

● N db multiprocessor (MP)● M db singleprocessor(SP) / MP

GeForce 9400M

GTX295

N 2 30M 8 8

Órajel 0.2 GHz 1.24 GHzMegj. dupla

kártya

Page 55: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 55 )

Futtatási modell● A grid thread blockokból áll

● A threadek a kernelt hajtják végre

● A blockok számát és méretét (execution configuration) a host alkalmazás állítja be

● Azonosítás (beépített): blockIdx, threadIdx (blockon belül), blockDim idx = blockIdx.x * blockDim.x + threadIdx.x

Thread bSize-1

Thread 1

Thread 0

...

Block 0

Thread bSize-1

Thread 1

Thread 0

...

Block nBlck-1

DeviceGrid

...

Page 56: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 56 )

Futtatási modellDeviceGrid

...0 1 2 3 0 1 2 3 0 1 2 3

gridDim.x = 3 , blockDim.x = 4

blockIdx.x=0 blockIdx.x=1 blockIdx.x=2

threadIdx.x:

Global threadID:idx = blockIdx.x * blockDim.x + threadIdx.x

0 1 2 3 4 5 6 7 8 9 10 11

Page 57: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 57 )

Futtatási modell● A grid és a blockok méretét a host alkalmazás állítja be

● Grid dim.: 1 vagy 2

● Block dim.: 1, 2 vagy 3

pl. threadIdx.xthreadIdx.ythreadIdx.z

Page 58: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 58 )

Példaprogram – soros CPU#include <stdlib.h>

void myfunc(float *v, int D, float c) { ... }

int main(void) { int i, D=1000000, s; float *h; s = D * sizeof(float); // size in bytes h = (float*) malloc(s); for (i=0; i<D; i=i+1) { h[i] = (float)i; } myfunc (h, D, 2.0f); free(h);}

Page 59: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 59 )

Példaprogram – soros CPU#include <stdlib.h>

void myfunc(float *v, int D, float c) { int i; for (i=0; i<D; i=i+1) { v[i] = v[i] * c; }}

int main(void) { ...}

0 1 D

Page 60: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 60 )

Példaprogram – párhuzamos CPU#include <stdlib.h>#include <omp.h>

void myfunc(float *v, int D, float c) { int id,N,i; N = omp_get_num_procs(); omp_set_num_threads(N); #pragma omp parallel private(id,i) { id = omp_get_thread_num(); for (i=id; i<D; i=i+N) { v[i] = v[i] * c; } }}

i i+N i+2Ni. thread:

Page 61: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 61 )

Példaprogram - CUDA__device__ void mykernel(float *v, int D, float c) {…}

int main(void) { int i, D=1000000, s; float *h, *d; s = D * sizeof(float); cudaMallocHost((void**) &h, s); cudaMalloc( (void**) &d, s) ; for (i=0; i<D; i=i+1) { h[i] = (float)i; } cudaMemcpy( d, h, s, cudaMemcpyHostToDevice); dim3 grid (30); dim3 threads (32); mykernel <<< grid, threads >>> (d, D, 2.0f); cudaMemcpy( h, d, s, cudaMemcpyDeviceToHost); cudaFreeHost(h); cudaFree(d); }

Page 62: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 62 )

Példaprogram - CUDA__device__ void mykernel(float *v, int D, float c) {…}

int main(void) { // var. deklarációk int i, D=1000000, s; // tömb hossza byte-ban float *h, *d; s = D * sizeof(float); cudaMallocHost((void**) &h, s); cudaMalloc( (void**) &d, s) ; for (i=0; i<D; i=i+1) { h[i] = (float)i; } cudaMemcpy( d, h, s, cudaMemcpyHostToDevice); dim3 grid (30); dim3 threads (32); mykernel <<< grid, threads >>> (d, D, 2.0f); cudaMemcpy( h, d, s, cudaMemcpyDeviceToHost); cudaFreeHost(h); cudaFree(d); }

Page 63: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 63 )

Példaprogram - CUDA__device__ void mykernel(float *v, int D, float c) {…}

int main(void) { // mem. foglalás int i, D=1000000, s; // host-on és device-on float *h, *d; s = D * sizeof(float); cudaMallocHost((void**) &h, s); cudaMalloc( (void**) &d, s) ; for (i=0; i<D; i=i+1) { h[i] = (float)i; } cudaMemcpy( d, h, s, cudaMemcpyHostToDevice); dim3 grid (30); dim3 threads (32); mykernel <<< grid, threads >>> (d, D, 2.0f); cudaMemcpy( h, d, s, cudaMemcpyDeviceToHost); cudaFreeHost(h); cudaFree(d); }

Page 64: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 64 )

Példaprogram - CUDA__device__ void mykernel(float *v, int D, float c) {…}

int main(void) { // tömb inicializálás int i, D=1000000, s; float *h, *d; s = D * sizeof(float); cudaMallocHost((void**) &h, s); cudaMalloc( (void**) &d, s) ; for (i=0; i<D; i=i+1) { h[i] = (float)i; } cudaMemcpy( d, h, s, cudaMemcpyHostToDevice); dim3 grid (30); dim3 threads (32); mykernel <<< grid, threads >>> (d, D, 2.0f); cudaMemcpy( h, d, s, cudaMemcpyDeviceToHost); cudaFreeHost(h); cudaFree(d); }

Page 65: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 65 )

Példaprogram - CUDA__device__ void mykernel(float *v, int D, float c) {…}

int main(void) { // tömb másolása device-ra int i, D=1000000, s; float *h, *d; s = D * sizeof(float); cudaMallocHost((void**) &h, s); cudaMalloc( (void**) &d, s) ; for (i=0; i<D; i=i+1) { h[i] = (float)i; } cudaMemcpy( d, h, s, cudaMemcpyHostToDevice); dim3 grid (30); dim3 threads (32); mykernel <<< grid, threads >>> (d, D, 2.0f); cudaMemcpy( h, d, s, cudaMemcpyDeviceToHost); cudaFreeHost(h); cudaFree(d); }

Page 66: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 66 )

Példaprogram - CUDA__device__ void mykernel(float *v, int D, float c) {…}

int main(void) { // grid definiálás int i, D=1000000, s; float *h, *d; s = D * sizeof(float); cudaMallocHost((void**) &h, s); cudaMalloc( (void**) &d, s) ; for (i=0; i<D; i=i+1) { h[i] = (float)i; } cudaMemcpy( d, h, s, cudaMemcpyHostToDevice); dim3 grid (30); dim3 threads (32); mykernel <<< grid, threads >>> (d, D, 2.0f); cudaMemcpy( h, d, s, cudaMemcpyDeviceToHost); cudaFreeHost(h); cudaFree(d); }

Page 67: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 67 )

Példaprogram - CUDA__device__ void mykernel(float *v, int D, float c) {…}

int main(void) { // kernel futtatása device-on int i, D=1000000, s; // futtatási konfig. megadása float *h, *d; s = D * sizeof(float); cudaMallocHost((void**) &h, s); cudaMalloc( (void**) &d, s) ; for (i=0; i<D; i=i+1) { h[i] = (float)i; } cudaMemcpy( d, h, s, cudaMemcpyHostToDevice); dim3 grid (30); dim3 threads (32); mykernel <<< grid, threads >>> (d, D, 2.0f); cudaMemcpy( h, d, s, cudaMemcpyDeviceToHost); cudaFreeHost(h); cudaFree(d); }

Page 68: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 68 )

Példaprogram - CUDA__device__ void mykernel(float *v, int D, float c) {…}

int main(void) { // eredmény visszamásolása int i, D=1000000, s; float *h, *d; s = D * sizeof(float); cudaMallocHost((void**) &h, s); cudaMalloc( (void**) &d, s) ; for (i=0; i<D; i=i+1) { h[i] = (float)i; } cudaMemcpy( d, h, s, cudaMemcpyHostToDevice); dim3 grid (30); dim3 threads (32); mykernel <<< grid, threads >>> (d, D, 2.0f); cudaMemcpy( h, d, s, cudaMemcpyDeviceToHost); cudaFreeHost(h); cudaFree(d); }

Page 69: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 69 )

Példaprogram - CUDA__device__ void mykernel(float *v, int D, float c) {…}

int main(void) { // memóriafelszabadítás int i, D=1000000, s; // host-on és device-on float *h, *d; s = D * sizeof(float); cudaMallocHost((void**) &h, s); cudaMalloc( (void**) &d, s) ; for (i=0; i<D; i=i+1) { h[i] = (float)i; } cudaMemcpy( d, h, s, cudaMemcpyHostToDevice); dim3 grid (30); dim3 threads (32); mykernel <<< grid, threads >>> (d, D, 2.0f); cudaMemcpy( h, d, s, cudaMemcpyDeviceToHost); cudaFreeHost(h); cudaFree(d); }

Page 70: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 70 )

Példaprogram - CUDA__device__ void mykernel(float *v, int D, float c) { int id,N,i;

id = blockIdx.x * blockDim.x + threadIdx.x ; N = gridDim.x * blockDim.x;

for (i=id; i<D; i=i+N) { v[i] = v[i] * c; }}

int main(void) { ...}

i i+N i+2Ni. thread:

Page 71: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 71 )

Példaprogramok

Fordítás:

gcc -o testserial.out testserial.c

gcc -o testomp.out testomp.c -fopenmp -lgomp

nvcc -o testcuda.out testcuda.c

Page 72: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 72 )

Aritmetika időigénye

Page 73: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 73 )

GPU memóriaGlobal

Shared

Register

Constant

Texture

Local

Page 74: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 74 )

GPU memóriaGlobal (~GB):

● lassú elérés (400-600 órajel)

● host és device írja, olvassa

● elérése gyorsítható, ha a szálak rendezetten olvasnak/írnak

pl. cudaMalloc cudaMemcpy

Page 75: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 75 )

GPU memóriaRegister (16384 db):

● leggyorsabb memória● egy thread látja● csak device írja/olvassa

pl. kernel (__device__) lokális változói:

int id, N, i;

Page 76: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 76 )

GPU memóriaShared (16kB):

● gyors● egy Block összes threadje látja

● csak device írja/olvassa

pl. kernelben: __shared__ float x[8]

Page 77: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 77 )

GPU memóriaLocal:

● lassú (global-ban fekszik)

● csak egy thread látja● csak device írja/olvassa

Page 78: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 78 )

GPU memóriaConstant: ld. irodalomTexture: ld. irodalom

Page 79: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 79 )

GPU memória

Memória láthatóság R/W sebességGlobal grid RW lassúShared block RW gyorsRegister thread RW gyorsLocal thread RW lassú

Constant grid RO lassú/cache gyorsítTexture grid RO lassú/cache gyorsít

Page 80: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 80 )

Fizikai végrehajtás● N db multiprocessor (MP)● M db singleprocessor(SP) / MP● Egy MP több Blockot is számol- egy Block-ot egy MP számol

● Minden Block SIMD csoportokra van osztva: warp- a warpok fizikailag egyszerre hajtódnak végre

● Egy warpot alkotó threadek ID-jai egymást követőek

● manapság a warp 32 szálból áll

Reg

Reg

Global

SHARED

Page 81: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 81 )

CUDA � skálázódás

Page 82: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 82 )

CUDA � skálázódás

Page 83: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 83 )

Következmények● # Block / # MP › 1

� minden MP számol● # Block / # MP › 2

� egy MP egyszerre több Blockot is számol● # Block / # MP › 100● egy Block erőforrás-igénye ≤ MP teljes erőforrása

shared memória, registeregy MP egyszerre több Blockot is számolhat

● egy warpon belüli thread-divergencia kerülendőa különböző ágak sorbarendezve hajtódnak végre

Page 84: Grafikus kártyák, mint olcsó szuperszámítógépek - I.jurek/archive/2010_CUDAseminar/jurek-GPUseminar-2009-1.pdf · GPU, mint szuperszámítógép – I. ( 1 ) Grafikus kártyák,

GPU, mint szuperszámítógép – I. ( 84 )

FOLYT. KÖV.: Optimalizálás