Rok kdemiki 20/20, Wykłd nr 4 2/44 Pln wykłdu nr 4 Informtyk 2 Politehnik Biłostok - Wydził Elektryzny Elektrotehnik, semestr III, studi stjonrne I stopni Rok kdemiki 20/20 Progrmownie oiektowe w języku C++ przełdownie (przeiążnie) opertorów dziedzizenie funkje wirtulne Operje n wektorh i mierzh mnożenie mierzy przez wektor mnożenie mierzy przez mierz Wykłd nr 4 (23..20) dr inż. Jrosłw Foren Rok kdemiki 20/20, Wykłd nr 4 3/44 Rok kdemiki 20/20, Wykłd nr 4 4/44 Przełdownie (przeiążnie) opertorów Przełdownie opertorów w klsie przełdownie opertor poleg n ndniu mu spejlnego znzeni w momenie, gdy stoi on ook oiektu jkiejś klsy przełdownie opertor dokonuje się definiują funkję o posti:... int min() LizZespolon z, z2, w;... w = z + z2;... z = 2.0 * z2; z = 2 * z2;... out << z << z2;...
Rok kdemiki 20/20, Wykłd nr 4 5/44 Rok kdemiki 20/20, Wykłd nr 4 6/44 Przełdownie opertorów w klsie Przełdownie opertorów w klsie możn przełdowć prktyznie wszystkie opertory nie możn wymyślć swoih opertorów nie możn zmienić priorytetu opertorów utomtyznie tworzone są opertory: przypisni (=) porni dresu (&) new, new [], delete i delete [] (tworzenie i usuwnie oiektów) ten sm opertor możn przełdowć wielokrotnie, le z kżdym rzem funkj opertorow musi mieć inny typ lu kolejność rgumentów opertory mogą yć przełdowne jko funkj gloln lu jko funkj skłdow klsy Opertor jko funkj gloln: mierz opertor - (mierz m, mierz m2) mierz wynik(m.size); for (int i=0;i<m.size;i++) for (int j=0;j<m.size;j++) *(wynik.m+i*wynik.size+j)=*(m.m+i*m.size+j) -*(m2.m+i*m2.size+j); return wynik; y funkj gloln mogł korzystć z pól prywtnyh klsy musi yć funkją zprzyjźnioną z klsą: friend mierz opertor - (mierz, mierz); umieszzone w definiji klsy Rok kdemiki 20/20, Wykłd nr 4 7/44 Rok kdemiki 20/20, Wykłd nr 4 8/44 Przełdownie opertorów w klsie Opertor jko funkj skłdow klsy: mierz mierz::opertor - (mierz m2) mierz wynik(size); *(wynik.m+i*wynik.size+j) = *(m+i*size+j) - *(m2.m+i*m2.size+j); return wynik; do funkji przekzywny jest tylko jeden rgument (drugi), pierwszy przekzywny jest domyślnie przez wskźnik this funkj opertorow, któr jest skłdową klsy wymg, y oiekt stojąy po lewej stronie opertor ył oiektem tej klsy opertory >> i << możn przełdowywć tylko jko funkje glolne Przykłd nr - operje n mierzh (/7) #inlude <iostrem> #inlude <stdli.h> #inlude <time.h> using nmespe std; lss mierz privte: int size; /* rozmir mierzy */ int *m; /* wskźnik n mierz */ puli: mierz(int); /* konstruktor */ mierz(onst mierz &); /* konstruktor kopiująy */ ~mierz(); /* destruktor */ void generuj(int,int); mierz & opertor = (onst mierz &); mierz opertor + (mierz); friend mierz opertor - (mierz, mierz); friend ostrem & opertor << (ostrem &, mierz); ;
Rok kdemiki 20/20, Wykłd nr 4 9/44 Rok kdemiki 20/20, Wykłd nr 4 0/44 Przykłd nr - operje n mierzh (2/7) Przykłd nr - operje n mierzh (3/7) mierz::mierz(int n) size = n; m = new int[n*n]; *(m+i*size+j) = 0; mierz::mierz(onst mierz &m) size = m.size; m = new int[size*size]; *(m+i*size+j) = *(m.m+i*size+j); konstruktor klsy mierz (z dynmiznym przydziłem pmięi) konstruktor kopiująy mierz::~mierz() delete [] m; destruktor void mierz::generuj(int, int ) funkj generują elementy srnd(time(null)); mierzy z zkresu <,> *(m+i*size+j) = rnd()%(-+)+; Rok kdemiki 20/20, Wykłd nr 4 /44 Rok kdemiki 20/20, Wykłd nr 4 /44 Przykłd nr - operje n mierzh (4/7) Przykłd nr - operje n mierzh (5/7) mierz & mierz::opertor = (onst mierz &m) if (&m == this) return *this; delete [] m; przełdownie opertor size = m.size; przypisni =, koniezne do m = new int[size*size]; wykonni operji typu A=B *(m+i*size+j) = *(m.m+i*size+j); return *this; mierz mierz::opertor + (mierz m) mierz wynik(size); *(wynik.m+i*size+j) = *(m+i*size+j) + *(m.m+i*size+j); return wynik; mierz opertor - (mierz m, mierz m2) mierz wynik(m.size); for (int i=0;i<m.size;i++) for (int j=0;j<m.size;j++) *(wynik.m+i*wynik.size+j) = *(m.m+i*m.size+j) - *(m2.m+i*m2.size+j); return wynik; przełdownie opertor + w klsie przełdownie opertor - poz klsą
Rok kdemiki 20/20, Wykłd nr 4 /44 Rok kdemiki 20/20, Wykłd nr 4 4/44 Przykłd nr - operje n mierzh (6/7) Przykłd nr - operje n mierzh (7/7) ostrem & opertor << (ostrem &ekrn, mierz m) for (int i=0;i<m.size;i++) for (int j=0;j<m.size;j++) out << *(m.m+i*m.size+j) << " "; out << endl; return ekrn; przełdownie opertor << poz klsą (inzej nie możn!!!) int min() mierz m(3), m2(3), m3(3); out << m << endl << m2 << endl; m.generuj(0,20); m2.generuj(-0,0); out << m << endl << m2 << endl; m3 = m + m2; out << m3 << endl; m3 = m - m2; out << m3 << endl; system ("puse"); return 0; 9 6 20 7 20 9-8 0 5 3 0 0 4 0-9 2 23 7 6 20 0 27 7 7 8 20 28 Rok kdemiki 20/20, Wykłd nr 4 5/44 Rok kdemiki 20/20, Wykłd nr 4 6/44 Dziedzizenie Dziedzizenie dziedzizenie jest to tehnik pozwljąą n definiownie nowej klsy przy wykorzystniu klsy już istniejąej poleg n przejmowniu jednej klsy (zowej, podstwowej) przez inną klsę (pohodną) przy dziedzizeniu, w skłd oiektów klsy pohodnej utomtyznie whodzą pol klsy zowej do oiektów klsy pohodnej możemy stosowć operje zdefiniowne przez funkje skłdowe klsy zowej przykłdow kls podstwow i kls pohodn /* kls podstwow */ lss oso hr *imie; hr *nzwisko; int wiek; puli: oso(hr *i,hr *n,int w); ~oso() void drukuj(); ; /* kls pohodn */ lss student : puli oso hr *wydzil; int semestr; puli: student(hr *i,hr *n, int w,hr *wy,int s); ~student() void drukuj(); void promoj(); ;
Rok kdemiki 20/20, Wykłd nr 4 7/44 Rok kdemiki 20/20, Wykłd nr 4 8/44 Dziedzizenie Dziedzizenie - sposoy dziedzizeni sposó dziedzizeni kls podstwow privte proteted puli privte - - - proteted privte proteted proteted puli privte proteted puli w klsie pohodnej możn zdefiniowć: dodtkowe dne skłdowe dodtkowe funkje skłdowe dne i funkje o tkih smyh nzwh jk w klsie podstwowej (dne i funkje z klsy podstwowej są zsłnine) jeśli nie podmy sposou dziedzizeni, to domyślnie ędzie to privte podzs dziedzizeni nie są dziedzizone: konstruktor, destruktor i opertor przypisni "=" Przykłd: student st("jn","kos",20,"we",2); st.drukuj(); st.oso::drukuj(); - deklrj oiektu - wywołnie funkji z klsy student - wywołnie funkji z klsy oso możliwe jest dziedzizenie wielokrotne, tzn. kls pohodn może yć klsą podstwową dl innej klsy Rok kdemiki 20/20, Wykłd nr 4 9/44 Rok kdemiki 20/20, Wykłd nr 4 20/44 Przykłd nr 2 - dziedzizenie (/4) Przykłd nr 2 - dziedzizenie (2/4) #inlude <iostrem> #inlude <string.h> using nmespe std; lss oso privte: hr *imie; hr *nzwisko; int wiek; puli: oso(hr*,hr*,int); ~oso(); void drukuj(); ; kls podstwow (zow) lss student : puli oso privte: hr *wydzil; int semestr; puli: student(hr*,hr*,int, hr*,int); ~student(); void drukuj(); void promoj(); ; kls pohodn oso::oso(hr *i, hr *n, int w) imie = new hr[strlen(i)+]; nzwisko = new hr[strlen(n)+]; strpy(imie,i); strpy(nzwisko,n); wiek = w; oso::~oso() delete [] imie; delete [] nzwisko; void oso::drukuj() out << imie << " " << nzwisko; out << " " << wiek << endl; destruktor klsy oso konstruktor klsy oso
Rok kdemiki 20/20, Wykłd nr 4 2/44 Rok kdemiki 20/20, Wykłd nr 4 /44 Przykłd nr 2 - dziedzizenie (3/4) Przykłd nr 2 - dziedzizenie (4/4) student::student(hr *i,hr *n,int w,hr *wy,int s) : oso(i,n,w) wydzil = new hr[strlen(wy)+]; strpy(wydzil,wy); semestr = s; student::~student() delete [] wydzil; konstruktor klsy student void student::drukuj() oso::drukuj(); out << "Wydzil: " << wydzil; out << " Semestr: " << semestr << endl; destruktor klsy student list inijlizyjn konstruktor klsy student zwierją wywołnie konstruktor klsy podstwowej (oso) void student::promoj() semestr++; int min() student st("jn","kowlski",20,"we",2); st.drukuj(); st.promoj(); st.drukuj(); st.oso::drukuj(); system("puse"); return 0; jko pierwszy zostnie wywołny konstruktor klsy podstwowej (oso) po nim konstruktor klsy pohodnej (student) kolejność wywołni destruktorów jest odwrotn w stosunku do konstruktorów - jko pierwszy jest wywoływny destruktor klsy student, po nim destruktor klsy oso Rok kdemiki 20/20, Wykłd nr 4 23/44 Rok kdemiki 20/20, Wykłd nr 4 24/44 Przykłd nr 2 - dziedzizenie (4/4) void student::promoj() Jn Kowlski 20 jko pierwszy Wydzil: zostnie wywołny WE Semestr: 2 semestr++; konstruktor Jn klsy Kowlski podstwowej 20 (oso) po Wydzil: nim konstruktor WE Semestr: klsy 3 pohodnej Jn Kowlski (student) 20 int min() student st("jn","kowlski",20,"we",2); st.drukuj(); st.promoj(); st.drukuj(); st.oso::drukuj(); system("puse"); return 0; kolejność wywołni destruktorów jest odwrotn w stosunku do konstruktorów - jko pierwszy jest wywoływny destruktor klsy student, po nim destruktor klsy oso Funkje wirtulne (polimorfizm) Przykłd: złóżmy, że piszemy progrm wyświetljąy n ekrnie różne figury (kwdrt, trójkąt, koło) do wyświetleni kżdej figury stosown jest oddzieln funkj, figury powinny yć wyświetlne n ekrnie w określonej kolejnośi Prolem: Rozwiąznie: jk zorgnizowć przehowywnie informji o figurh? jk zorgnizowć wyświetlnie figur? klsy + dziedzizenie + funkje wirtulne definiujemy klsę podstwową (figur) orz trzy klsy pohodne (kwdrt, trojkt, kolo) w klsie podstwowej umieszzmy funkję void rysuj() poprzedzoną słowem virtul (funkj t ni nie roi) w klsh pohodnyh umieszzmy funkje o tkih smyh nzwh jk w klsie podstwowej - void rysuj() wyświetljąe poszzególne figury
Rok kdemiki 20/20, Wykłd nr 4 25/44 Rok kdemiki 20/20, Wykłd nr 4 26/44 Przykłd nr 3 - funkje wirtulne (/3) Przykłd nr 3 - funkje wirtulne (2/3) #inlude <iostrem> using nmespe std; lss figur puli: virtul void rysuj() ; ; kls podstwow figur funkj wirtuln rysuj() lss kwdrt : puli figur kls pohodn kwdrt puli: void rysuj() out << "Kwdrt" << endl; ; lss trojkt : puli figur kls pohodn trojkt puli: void rysuj() out << "Trojkt" << endl; ; lss kolo : puli figur kls pohodn kolo puli: void rysuj() out << "Kolo" << endl; ; Rok kdemiki 20/20, Wykłd nr 4 27/44 Rok kdemiki 20/20, Wykłd nr 4 28/44 Funkje wirtulne (polimorfizm) Przykłd nr 3 - funkje wirtulne (3/3) jeśli wskźnikowi do klsy podstwowej (figur) przypiszemy dres oiektu klsy pohodnej (kwdrt, trojkt, kolo), to wywołują poprzez wskźnik funkję rysuj(), wywołmy funkję odpowidjąą dnemu oiektowi, np. figur *ptr; kwdrt kw; trojkt tr; kolo kol; ptr = &kw; ptr->rysuj(); ptr = &tr; ptr->rysuj(); ptr = &kol; ptr->rysuj(); - deklrj wskźnik do oiektu klsy figur - deklrj oiektu klsy kwdrt - deklrj oiektu klsy trojkt - deklrj oiektu klsy kolo - wywołn zostnie funkj rysuj() z klsy kwdrt - wywołn zostnie funkj rysuj() z klsy trojkt - wywołn zostnie funkj rysuj() z klsy kolo mówimy, że w powyższym przykłdzie wystąpił polimorfizm (wielopostiowość) int min() kwdrt kwdrt, kwdrt2; trojkt trojkt, trojkt2; kolo kolo, kolo2; figur *list[6]; list[0] = &trojkt; list[] = &kwdrt; list[2] = &kolo; list[3] = &kwdrt2; list[4] = &kolo2; list[5] = &trojkt2; for (int i=0; i<6; i++) list[i]->rysuj(); return 0; Trojkt Kwdrt Kolo Kwdrt Kolo Trojkt
Rok kdemiki 20/20, Wykłd nr 4 29/44 Rok kdemiki 20/20, Wykłd nr 4 30/44 Mnożenie mierzy przez wektor Mnożenie mierzy przez mierz Operj: C = A W A[N][M] - mierz N M - elementow W[M] - wektor M - elementowy (kolumnowy) C[N] - wektor N - elementowy (kolumnowy) Operj: C = A B A[N][M] - mierz N M - elementow B[M][K] - mierz M K - elementow C[N][K] - mierz N K - elementow 2 3 = 2 3 2 2 = w + = w + 2 2 2 23 33 w w2 w 3 = w + w + w w + 23 33 3 w w + w 3 3 Progrm w języku C: for (i=0; i<n i++) C[i] = 0.0; for (j=0; j<m; j++) C[i] += A[i][j] * W[j]; M = j= i ij w j, i =,2, K, N 2 N = = = 2 + 2 + + 2 2 2 + + + 23 33 23 33 = N = = = 2 2 + + + + + + 23 33 23 33 K M K 2 23 33 = = = 2 23 M 33 + + + 23 23 23 + + + 33 23 33 33 33 Rok kdemiki 20/20, Wykłd nr 4 /44 Rok kdemiki 20/20, Wykłd nr 4 /44 Mnożenie mierzy przez mierz Mnożenie mierzy przez mierz N (i) Operj: C = A B (A[N][M],B[M][K],C[N][K]) = N (i) 2 23 2 23 2 23 33 33 33 K (k) Progrm w języku C: for (i=0; i<n; i++) for (k=0; k<k; k++) C[i][k] = 0.0; for (j=0; j<m; j++) C[i][k] += A[i][j] * B[j][k]; M (j) M ik = j= K (k) M (j) i =,2, K, N ij jk, k =,2, K, K Koszt lgorytmu: O( n 3 ) n szykość wykonywni olizeń wpływ nie tylko liz operji zmiennoprzeinkowyh, le tkże sposó poierni dnyh z pmięi komputer oene systemy komputerowe mją hierrhizną udowę pmięi: rejestry proesor pmięć podręzn (he) pmięć operyjn pmięć zewnętrzn olizeni są efektywnie wykonywne, gdy odywją się n zmiennyh znjdująyh się w jk njszyszej pmięi
Rok kdemiki 20/20, Wykłd nr 4 33/44 Rok kdemiki 20/20, Wykłd nr 4 34/44 Mnożenie mierzy przez mierz Mnożenie mierzy przez mierz rozptrzmy dw lgorytmy mnożeni mierzy: rozptrzmy dw lgorytmy mnożeni mierzy: Algorytm nr for (i=0; i<n; i++) for (k=0; k<n; k++) for (j=0; j<n; j++) C[i*N+k] += A[i*N+j]*B[j*N+k]; Algorytm nr 2 for (i=0; i<n; i++) for (j=0; j<n; j++) for (k=0; k<n; k++) C[i*N+k] += A[i*N+j]*B[j*N+k]; mierze: 2048 2048 proesor: Intel Core i5-240m 2,30 GHz kompiltor: Mirosoft Visul C++ 2008 Stndrd Edition Algorytm nr : ez optymlizji: 268,02 [s] z optymlizją: 92,053 [s] Algorytm nr 2: ez optymlizji: 49,409 [s] z optymlizją: 6,270 [s] Algorytm nr for (i=0; i<n; i++) for (k=0; k<n; k++) for (j=0; j<n; j++) C[i*N+k] += A[i*N+j]*B[j*N+k]; Algorytm nr 2 for (i=0; i<n; i++) for (j=0; j<n; j++) for (k=0; k<n; k++) C[i*N+k] += A[i*N+j]*B[j*N+k]; Rok kdemiki 20/20, Wykłd nr 4 35/44 Rok kdemiki 20/20, Wykłd nr 4 36/44 Biliotek numeryzn BLAS BLAS - Bsi Liner Alger Suprogrms Ziór proedur służąyh do wykonywni operji n podstwowyh oiekth lgery liniowej: sklrh wektorh mierzh Stron główn: http://www.netli.org/ls Rok pulikji: 979 Oryginlnie npisn w języku Fortrn 77 Osługuje lizy: rzezywiste pojedynzej i podwójnej preyzji zespolone pojedynzej i podwójnej preyzji Biliotek numeryzn BLAS Wyróżni się 3 poziomy strkji lgorytmów BLAS BLAS Level operje typu wektor-wektor (dodwnie wektorów, normy wektor, ilozyn sklrny wektorów) y α x + y BLAS Level 2 operje typu mierz-wektor (mnożenie mierzy przez wektor) y αax + y BLAS Level 3 operje typu mierz-mierz (mnożenie mierzy przez mierz) C αa B + C
Rok kdemiki 20/20, Wykłd nr 4 37/44 Rok kdemiki 20/20, Wykłd nr 4 38/44 BLAS - Nzwy proedur Struktur nzwy: <hrter> <nme> <mod> ( ) <hrter> - oznz preyzję (typ dnyh): S - pojedynz, lizy rzezywiste (rel, single preision) C - pojedynz, lizy zespolone (omplex, single preision) D - podwójn, lizy rzezywiste (rel, doule preision) Z - podwójn, lizy zespolone (omplex, doule preision) <nme> - w BLAS oznz typ operji: COPY - kopiownie wektorów ( vetor opy) DOT - ilozyn sklrny wektorów ( vetor dot produt) ROT - orót wektor ( vetor rottion) SWAP - zmin wektorów ( vetor swp) BLAS - Nzwy proedur <nme> - w BLAS 2 i 3 oznz typ mierzy: GE - mierz ogóln (generl mtrix) SY - mierz symetryzn (symmetri mtrix) TR - mierz trójkątn (tringulr mtrix) <mod> - dodtkowe informje o operji - w BLAS 2: MV - mnożenie mierzy przez wektor (mtrix-vetor produt) SV - rozwiąznie ukłdu równń liniowyh (solving system of liner equtions with mtrix-vetor opertions) <mod> - dodtkowe informje o operji - w BLAS 3: MM - mnożenie mierzy (mtrix-mtrix produt) SM - rozwiąznie ukłdu równń liniowyh (solving system of liner equtions with mtrix-mtrix opertions Rok kdemiki 20/20, Wykłd nr 4 39/44 Rok kdemiki 20/20, Wykłd nr 4 40/44 BLAS - Nzwy proedur BLAS - Implementje Przykłdy nzw: DGEMV - mnożenie mierzy przez wektor, mierz i wektor zwierją lizy rzezywiste podwójnej preyzji y α A x + β y lu T y α A x + β y SGEMM - mnożenie mierzy przez mierz, mierze zwierją lizy rzezywiste pojedynzej preyzji y α op( A) op( B) + β C op( X) = X, op( X) = X, op( X) = onjg( X SSWAP - zmin wektorów zwierjąyh lizy rzezywiste pojedynzej preyzji T x y T ) Stron główn: http://www.netli.org/ls Stron główn zwier niezoptymlizowną iliotekę BLAS MKL (Intel) Intel Mth Kernel Lirry (Intel MKL) v0.3 http://softwre.intel.om/en-us/rtiles/intel-mkl/ ACML (AMD) AMD Core Mth Lirry v5.0.0 http://developer.md.om/lirries/ml/pges/defult.spx ATLAS (open soure) Automtilly Tuned Liner Alger Softwre http://mth-tls.soureforge.net/
Rok kdemiki 20/20, Wykłd nr 4 4/44 Rok kdemiki 20/20, Wykłd nr 4 42/44 GPGPU i CUDA CUDA - Jk używć? GPGPU - Generl Purpose omputing on Grphis Proessing Units CUDA (Compute Unified Devie Arhiteture) hrdwre - równoległ rhitektur olizeniow GPU softwre - kompiltor nv, ilioteki i inne nrrzędzi NVIDIA Corportion (USA) Pierwsz wersj: luty 2007 Stron WWW: http://www.nvidi.pl/ojet/ud_home_new_pl.html Lienj: freewre Sprwdzić zy krt grfizn w komputerze osługuje CUDA wszystkie nowe krty grfizne NVIDIA są komptyilne z CUDA Śiągnąć oprogrmownie CUDA The CUDA Driver - zintegrowny ze sterownikiem krty grfiznej The CUDA Toolkit - zwier nrzędzi potrzene do kompilowni plikji z wykorzystniem Mirosoft Visul Studio (nrzędzi, ilioteki, pliki ngłówkowe, inne zsoy) The GPU Computing SDK - przykłdowe progrmy Zinstlowć CUDA driver (jeśli jest to koniezne) Zinstlowć oprogrmownie CUDA - Toolkit, SDK Użyć szlonu (templte projet) do stworzeni włsnego progrmu wykorzystująego CUDA Rok kdemiki 20/20, Wykłd nr 4 43/44 Rok kdemiki 20/20, Wykłd nr 4 44/44 CUBLAS Konie wykłdu nr 4 Biliotek CUBLAS - implementj BLAS (Bsi Liner Alger Suprogrms) dl krt grfiznyh NVIDIA i środowisk CUDA Zstosownie CUBLAS w progrmie wymg: inijlizji ilioteki CUBLAS: ulsinit() przydzieleni pmięi GPU n mierze i wektory: ulsallo() przesłni mierzy i wektorów do pmięi GPU: ulssetmtrix() wywołni odpowiednih funkji CUBLAS: ulssgemm() przesłni wyników olizeń z pmięi GPU do pmięi RAM komputer: ulsgetmtrix() zwolnieni pmięi GPU: ulsfree() zkońzeni pry ilioteki CUBLAS: ulsshutdown() Dziękuję z uwgę!