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



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

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

Párhuzamos és Grid rendszerek

Videókártya - CUDA kompatibilitás: CUDA weboldal: Példaterületek:

OpenCL - The open standard for parallel programming of heterogeneous systems

Magas szintű optimalizálás

CUDA alapok CUDA projektek. CUDA bemutató. Adatbányászat és Webes Keresés Kutatócsoport SZTAKI

Hallgatói segédlet: Nvidia CUDA C programok debugolása Nvidia Optimus technológiás laptopokon. Készítette: Kovács Andor. 2011/2012 első félév

Újrakonfigurálható technológiák nagy teljesítményű alkalmazásai

GPGPU-k és programozásuk Dezső, Sima Sándor, Szénási

Újrakonfigurálható technológiák nagy teljesítményű alkalmazásai

A CUDA előnyei: - Elszórt memória olvasás (az adatok a memória bármely területéről olvashatóak) PC-Vilag.hu CUDA, a jövő technológiája?!

KÉPFELDOLGOZÓ ALGORITMUSOK FEJLESZTÉSE GRAFIKUS HARDVER KÖRNYEZETBEN

GPGPU. GPU-k felépítése. Valasek Gábor

Párhuzamos programozási platformok

Párhuzamos programok futásának kiértékelése Scalasca profiler segítségével

Jurek Zoltán, Tóth Gyula

Négyprocesszoros közvetlen csatolású szerverek architektúrája:

Készítette: Trosztel Mátyás Konzulens: Hajós Gergely

Heterogén számítási rendszerek gyakorlatok (2017.)

CUDA haladó ismeretek

Párhuzamos programozási platformok

GPGPU. Architektúra esettanulmány

GPGPU-k és programozásuk

4. Funkcionális primitívek GPUn

Számítógépek felépítése

Az MTA Cloud a tudományos alkalmazások támogatására. Kacsuk Péter MTA SZTAKI

Mutatók és mutató-aritmetika C-ben március 19.

OpenCL Kovács, György

GPGPU: Általános célú grafikus processzorok cgpu: computational GPU GPGPU = cgpu Adatpárhuzamos gyorsító: dedikált eszköz, ami eleve csak erre

Bevezetés a párhuzamos programozási koncepciókba

A C programozási nyelv V. Struktúra Dinamikus memóriakezelés

Grafikus csővezeték 1 / 44

GPGPU alapok. GPGPU alapok Grafikus kártyák evolúciója GPU programozás sajátosságai

Mintavételes szabályozás mikrovezérlő segítségével

Programozás alapjai gyakorlat. 2. gyakorlat C alapok

GPU alkalmazása az ALICE eseménygenerátorában

Google Summer of Code OpenCL image support for the r600g driver

Programozás I. gyakorlat

Diplomamunka. Miskolci Egyetem. GPGPU technológia kriptográfiai alkalmazása. Készítette: Csikó Richárd VIJFZK mérnök informatikus

Utolsó módosítás:

C programozás. 1 óra Bevezetés

Eichhardt Iván GPGPU óra anyagai

Operációs rendszerek III.

Haladó Grafika EA. Inkrementális képszintézis GPU-n

Heterogén számítási rendszerek gyakorlatok (2018.)

C programozás. 6 óra Függvények, függvényszerű makrók, globális és

GPU-Accelerated Collocation Pattern Discovery

Eichhardt Iván GPGPU óra anyagai

Járműfedélzeti rendszerek II. 3. előadás Dr. Bécsi Tamás

Flynn féle osztályozás Single Isntruction Multiple Instruction Single Data SISD SIMD Multiple Data MISD MIMD

main int main(int argc, char* argv[]) { return 0; } main return 0; (int argc, char* argv[]) main int int int main main main

Programozás I gyakorlat. 10. Stringek, mutatók

Informatika el adás: Hardver

Programozás II. 2. Dr. Iványi Péter

Programozás alapjai 2.Gy: A C nyelv alapjai P R O

Függvények. Programozás I. Hatwágner F. Miklós november 16. Széchenyi István Egyetem, Gy r

Processzusok (Processes), Szálak (Threads), Kommunikáció (IPC, Inter-Process Communication)

Nemlineáris optimalizálási problémák párhuzamos megoldása grafikus processzorok felhasználásával

C programozási nyelv Pointerek, tömbök, pointer aritmetika

Programozás 1. Dr. Iványi Péter

Ismétlés: Moore törvény. Tranzisztorok mérőszáma: n*százmillió, n*milliárd.

A verem (stack) A verem egy olyan struktúra, aminek a tetejéről kivehetünk egy (vagy sorban több) elemet. A verem felhasználása

1. Alapok. Programozás II

HP-SEE projekt eredményei

GPGPU programozás lehetőségei. Nagy Máté Ferenc Budapest ALICE ELTE TTK Fizika MSc 2011 e-science Café

TI TMDSEVM6472 rövid bemutatása

Masszívan párhuzamos alkalmazások fejlesztése. Dr. Szénási Sándor Kertész Gábor, Kiss Dániel

Programozás alapjai. (GKxB_INTM023) Dr. Hatwágner F. Miklós október 11. Széchenyi István Egyetem, Gy r

Programozás alapjai C nyelv 8. gyakorlat. Mutatók és címek (ism.) Indirekció (ism)

Mutatók és címek (ism.) Programozás alapjai C nyelv 8. gyakorlat. Indirekció (ism) Néhány dolog érthetőbb (ism.) Változók a memóriában

7. fejezet: Mutatók és tömbök

Alprogramok, paraméterátadás

Párhuzamos és Grid rendszerek

Párhuzamos és Grid rendszerek. Áttekintés. Szálak. Eddig általános eszközöket láttunk, melyek

Heterogén számítási rendszerek

Az NIIF új szuperszámítógép infrastruktúrája Új lehetőségek a kutatói hálózatban

Programozás 5. Dr. Iványi Péter

KUTATÁSOK INFORMATIKAI TÁMOGATÁSA. Dr. Szénási Sándor

Programozás II. 2. gyakorlat Áttérés C-ről C++-ra

5-6. ea Created by mrjrm & Pogácsa, frissítette: Félix

Operációs rendszerek. Az NT memóriakezelése

GPGPU és számítások heterogén rendszereken

A C programozási nyelv I. Bevezetés

Programozás C és C++ -ban

Dr. Schuster György október 30.

Operációs rendszerek. Az NT folyamatok kezelése

1. Template (sablon) 1.1. Függvénysablon Függvénysablon példányosítás Osztálysablon

10. gyakorlat. Pointerek Tárolási osztályok

AliROOT szimulációk GPU alapokon

Grafikus processzorok általános célú programozása (GPGPU)

Bevezetés a programozásba. 9. Előadás: Rekordok

Ismerkedés a Python programnyelvvel. és annak micropython változatával

GPU Lab. 14. fejezet. OpenCL textúra használat. Grafikus Processzorok Tudományos Célú Programozása. Berényi Dániel Nagy-Egri Máté Ferenc

Programozás C++ -ban 2007/1

OpenCL alapú eszközök verifikációja és validációja a gyakorlatban

Utolsó módosítás:

A C programozási nyelv I. Bevezetés

11. gyakorlat Sturktúrák használata. 1. Definiáljon dátum típust. Olvasson be két dátumot, és határozza meg melyik a régebbi.

Ordering MCMC gyorsítása OpenCL környezetben

Átírás:

(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

(2) Vázlat I. 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

(3) Irodalom - CUDA http://heim.ifi.uio.no/~knutm/geilo2008/seland.pdf CUDA, Supercomputing for the Masses Part 1-15 http://www.drdobbs.com/cpp/207200659 CUDA official manuals Programming Guide, Reference Manual, Release Notes http://developer.nvidia.com/object/cuda_2_3_downloads.html

(4) Irodalom - Egyéb Kernighan, Ritchie: The C Programming Language http://zanasi.chem.unisa.it/download/c.pdf http://www.windowsceportal.hu/download/doc/cpl_hu.zip OpenMP tutorial https://computing.llnl.gov/tutorials/openmp/ MPI tutorial https://computing.llnl.gov/tutorials/mpi/

Motiváció (5)

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

(7) Moore törvénye Tranzisztorok száma másfél-két évente duplázódik Számítógép sebessége exp. növekszik DE az utóbbi ~4 évben megtorpant! 3GHz, 45nm

(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

(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

( 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

Grafikus kártyák nvidia GTX295: 2 x 240 db 1.3GHz proc 2 x 900MB memória Tesla C1060 1 x 240 db 1.3GHz proc 1 x 4000MB memória ( 11 )

( 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

Heterogén számolások Host computer + Device ( 13 )

GPU vs. CPU TEXT Számítási teljesítmény ( 14 )

GPU vs. CPU Memória sávszélesség ( 15 )

( 16 ) GPU vs. CPU Szál-végrehajtás CPU: MIMD Multiple Instruction, Multiple Data GPU: SIMD Single Instruction, Multiple Data

( 17 ) GPU vs. CPU A nagy memória (RAM) elérése rendkívül időigényes (~100 órajel) gyorsítás szükséges CPU GPU ~MB gyorsmemória (cache) a CPU-n kicsi (~16kB) gyorsmemória de ~128szál/mag hyperthreading

( 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ány heterogén rendszerek (pl. CPU+GPU) programozáshoz

( 19 ) CUDA Compute 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)

Példák TEXT ( 20 )

( 21 ) Példák Molekula dinamika / kvantumkémia kódok + GPU

CUDA - Beüzemelés ( 22 )

( 23 ) CUDA eszközök http://www.nvidia.com/object/cuda_gpus.html

CUDA telepítés Hardware: 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.1 kernel 2.6.31.5-0.1 x86_64 ( 24 )

CUDA telepítés Hardware: 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.1 kernel 2.6.31.5-0.1 x86_64 ( 25 )

CUDA telepítés Hardware: 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.1 kernel 2.6.31.5-0.1 x86_64 ( 26 )

CUDA telepítés Hardware: 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.1 kernel 2.6.31.5-0.1 x86_64 ( 27 )

( 28 ) CUDA telepítés Driver (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

( 29 ) CUDA letöltések http://developer.nvidia.com/object/cuda_2_3_downloads.html

( 30 ) CUDA letöltések http://developer.nvidia.com/object/cuda_2_3_downloads.html

( 31 ) CUDA telepítés Driver 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.run root@linux> sh cudatoolkit_2.3_linux_64_suse11.1.run SDK cudasdk_2.3_linux.run user@linux> sh cudasdk_2.3_linux.run

( 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/bin export 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

( 33 ) SDK - példaprogramok Fordítás: cd ~/NVIDIA_GPU_Computing_SDK/C make Példaprogramok: cd ~/NVIDIA_GPU_Computing_SDK/C/bin/linux/release ls

( 34 ) SDK - példaprogramok TEXT

C gyorstalpaló ( 35 )

( 36 ) C gyorstalpaló main függvény, változók int main(void) { int i; // main fg. definiálás // 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,...

C gyorstalpaló Fordítás: gcc -o test.out test.c Futtatás:./test.out ( 37 )

( 38 ) C gyorstalpaló Külső függvények #include <stdio.h> void main(void) { int i; i=1; // küls fg-ek deklarálása // main fg. definiálás // lokális változó def. // értékadás printf( %d\n,i); // küls fg. hívása } // Ez egy komment Adattípusok: int, float, double, char,...

C gyorstalpaló Külső függvények #include <math.h> #include <stdio.h> // void main(void) { double x; x = sqrt(2.0); printf( %e\n,x); } // Küls fg. ( 39 )

C gyorstalpaló Fordítás: gcc -o test.out test.c -lm Futtatás:./test.out ( 40 )

( 41 ) C gyorstalpaló Függvények int foo(int i, int j) { return(j*i); } int main(void) { int i=1; } // fg. definiálás // visszatérési érték // main fg. definiálás // lokális változó def. i = foo(2,i); // függvényhívás return(i); // fg. visszatérési érték

( 42 ) C gyorstalpaló Függvények int foo(int i, int j); int main(void) { int i=1; // fg. deklarálás // main fg. definiálás // 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) { return(j*i); } // fg. definiálás // visszatérési érték

( 43 ) C gyorstalpaló Mutatók int i, *p ; p p = &i ; *p Memória i 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ére printf( %d %d\n,i,*p);// p értékének kiírása *p = 2; // értékadás p értékére printf( %d %d\n,i,*p); // kiiratás }

( 45 ) C gyorstalpaló Mutatók - tömbök int *p ; p p+2 Memória p[0] p[2] sizeof(int) p = malloc(5*sizeof(int)); p[0] *p p[2] *(p+2)

( 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

( 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); } } free(p); } // tömbfeltöltés

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

( 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

( 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 ).

( 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és adatmásolás a GPU-ra GPU kernel futtatása adatmásolás a GPU-ról

Futtatási modell Emlékeztető: OpenMP a CPU-n 0 0 1 1 2... N-2 2... N-2 N-1 N-1 Szálak: 0, 1, 2,..., N-1 ( 52 )

SDK - devicequery ( 53 )

( 54 ) Fizikai felépítés N db multiprocessor (MP) M db singleprocessor(sp) / MP Reg Reg Global S H A R E D GeForce 9400M GTX295 N 2 30 M 8 8 Órajel 0.2 GHz 1.24 GHz Megj. dupla kártya

( 55 ) Futtatási modell Device Grid Block 0 A grid thread blockokból áll A threadek a kernelt hajtják végre Thread 0 Thread 1... Thread bsize-1... A blockok számát és méretét (execution configuration) a host alkalmazás állítja be Block nblck-1 Thread 0 Thread 1... Thread bsize-1 Azonosítás (beépített): blockidx, threadidx (blockon belül), blockdim idx = blockidx.x * blockdim.x + threadidx.x

( 56 ) Futtatási modell Device Grid griddim.x = 3, blockdim.x = 4 blockidx.x=0 blockidx.x=1 blockidx.x=2 threadidx.x: 0... 1 2 3 0 1 2 3 0 1 2 3 Global threadid: idx = blockidx.x * blockdim.x + threadidx.x 0 1 2 3 4 5 6 7 8 9 10 11

( 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.x threadidx.y threadidx.z

( 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); }

( 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

( 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. thread: i i+n i+2n

( 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); }

( 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); }

( 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); }

( 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); }

( 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); }

( 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); }

( 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); }

( 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); }

( 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); }

( 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. thread: i i+n i+2n

( 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

Aritmetika időigénye ( 72 )

GPU memória Global Shared Register Constant Texture Local ( 73 )

( 74 ) GPU memória Global (~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

( 75 ) GPU memória Register (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;

( 76 ) GPU memória Shared (16kB): gyors egy Block összes threadje látja csak device írja/olvassa pl. kernelben: shared float x[8]

( 77 ) GPU memória Local: lassú (global-ban fekszik) csak egy thread látja csak device írja/olvassa

( 78 ) GPU memória Constant: ld. irodalom Texture: ld. irodalom

( 79 ) GPU memória Memória láthatóság R/W sebesség Global grid RW lassú Shared block RW gyors Register thread RW gyors Local thread RW lassú Constant grid RO lassú/cache gyorsít Texture grid RO lassú/cache gyorsít

( 80 ) Fizikai végrehajtás Reg Reg Global S H A R E D 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

CUDA skálázódás ( 81 )

CUDA skálázódás ( 82 )

( 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, register egy 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

( 84 ) FOLYT. KÖV.: Optimalizálás