Rok kdemiki 0/0, Wykłd r 6 /4 Pl wykłdu r 6 Iformtyk Politehik Biłostok - Wydził Elektryzy Elektrotehik, semestr III, studi stjore I stopi Rok kdemiki 0/0 Progrmowie oiektowe w języku C++ dziedzizeie fukje wirtule (polimorfizm) Operje wektorh i mierzh możeie mierzy przez wektor możeie mierzy przez mierz ormy wektor i mierzy Wykłd r 6 (0..0) Rok kdemiki 0/0, Wykłd r 6 /4 Rok kdemiki 0/0, Wykłd r 6 4/4 Dziedzizeie Dziedzizeie dziedzizeie jest to tehik pozwljąą defiiowie owej klsy przy wykorzystiu klsy już istiejąej poleg przejmowiu jedej klsy (zowej, podstwowej) przez ią klsę (pohodą) przy dziedzizeiu, w skłd oiektów klsy pohodej utomtyzie whodzą pol klsy zowej do oiektów klsy pohodej możemy stosowć operje zdefiiowe przez fukje skłdowe klsy zowej przykłdow kls podstwow i kls pohod /* kls podstwow */ lss oso hr *imie; hr *zwisko; it wiek; puli: oso(hr *i,hr *,it w); ~oso() void drukuj(); ; /* kls pohod */ lss studet : puli oso hr *wydzil; it semestr; puli: studet(hr *i,hr *, it w,hr *wy,it s); ~studet() void drukuj(); void promoj(); ;
Rok kdemiki 0/0, Wykłd r 6 5/4 Rok kdemiki 0/0, Wykłd r 6 6/4 Dziedzizeie Dziedzizeie - sposoy dziedzizei sposó dziedzizei kls podstwow privte proteted puli privte - - - proteted privte proteted proteted puli privte proteted puli w klsie pohodej moż zdefiiowć: dodtkowe de skłdowe dodtkowe fukje skłdowe de i fukje o tkih smyh zwh jk w klsie podstwowej (de i fukje z klsy podstwowej są zsłie) jeśli ie podmy sposou dziedzizei, to domyślie ędzie to privte podzs dziedzizei ie są dziedzizoe: kostruktor, destruktor i opertor przypisi "" Przykłd: studet st("j","kos",0,"we",); st.drukuj(); st.oso::drukuj(); - deklrj oiektu - wywołie fukji z klsy studet - wywołie fukji z klsy oso możliwe jest dziedzizeie wielokrote, tz. kls pohod może yć klsą podstwową dl iej klsy Rok kdemiki 0/0, Wykłd r 6 7/4 Rok kdemiki 0/0, Wykłd r 6 8/4 Przykłd r - dziedzizeie (/4) Przykłd r - dziedzizeie (/4) #ilude <iostrem> #ilude <strig> usig mespe std; lss oso privte: hr *imie; hr *zwisko; it wiek; puli: oso(hr*,hr*,it); ~oso(); void drukuj(); ; kls podstwow (zow) lss studet : puli oso privte: hr *wydzil; it semestr; puli: studet(hr*,hr*,it, hr*,it); ~studet(); void drukuj(); void promoj(); ; kls pohod oso::oso(hr *i, hr *, it w) imie ew hr[strle(i)+]; zwisko ew hr[strle()+]; strpy(imie,i); strpy(zwisko,); wiek w; oso::~oso() delete [] imie; delete [] zwisko; void oso::drukuj() out << imie << " " << zwisko; out << " " << wiek << edl; destruktor klsy oso kostruktor klsy oso
Rok kdemiki 0/0, Wykłd r 6 9/4 Rok kdemiki 0/0, Wykłd r 6 0/4 Przykłd r - dziedzizeie (/4) Przykłd r - dziedzizeie (4/4) studet::studet(hr *i,hr *,it w,hr *wy,it s) : oso(i,,w) wydzil ew hr[strle(wy)+]; strpy(wydzil,wy); semestr s; studet::~studet() delete [] wydzil; kostruktor klsy studet void studet::drukuj() oso::drukuj(); out << "Wydzil: " << wydzil; out << " Semestr: " << semestr << edl; destruktor klsy studet list iijlizyj kostruktor klsy studet zwierją wywołie kostruktor klsy podstwowej (oso) void studet::promoj() semestr++; it mi() studet st("j","kowlski",0,"we",); st.drukuj(); st.promoj(); st.drukuj(); st.oso::drukuj(); jko pierwszy zostie wywoły kostruktor klsy podstwowej (oso) po im kostruktor klsy pohodej (studet) kolejość wywołi destruktorów jest odwrot w stosuku do kostruktorów - jko pierwszy jest wywoływy destruktor klsy studet, po im destruktor klsy oso Rok kdemiki 0/0, Wykłd r 6 /4 Rok kdemiki 0/0, Wykłd r 6 /4 Przykłd r - dziedzizeie (4/4) void studet::promoj() J Kowlski 0 jko pierwszy Wydzil: zostie wywoły WE Semestr: semestr++; kostruktor J klsy Kowlski podstwowej 0 (oso) po Wydzil: im kostruktor WE Semestr: klsy pohodej J Kowlski (studet) 0 it mi() studet st("j","kowlski",0,"we",); st.drukuj(); st.promoj(); st.drukuj(); st.oso::drukuj(); kolejość wywołi destruktorów jest odwrot w stosuku do kostruktorów - jko pierwszy jest wywoływy destruktor klsy studet, po im destruktor klsy oso Fukje wirtule (polimorfizm) Przykłd: złóżmy, że piszemy progrm wyświetljąy ekrie róże figury (kwdrt, trójkąt, koło) do wyświetlei kżdej figury stosow jest oddziel fukj, figury powiy yć wyświetle ekrie w określoej kolejośi Prolem: Rozwiązie: jk zorgizowć przehowywie iformji o figurh? jk zorgizowć wyświetlie figur? klsy + dziedzizeie + fukje wirtule defiiujemy klsę podstwową (figur) orz trzy klsy pohode (kwdrt, trojkt, kolo) w klsie podstwowej umieszzmy fukję void rysuj() poprzedzoą słowem virtul (fukj t i ie roi) w klsh pohodyh umieszzmy fukje o tkih smyh zwh jk w klsie podstwowej - void rysuj() wyświetljąe poszzególe figury
Rok kdemiki 0/0, Wykłd r 6 /4 Rok kdemiki 0/0, Wykłd r 6 4/4 Przykłd r - fukje wirtule (/) Przykłd r - fukje wirtule (/) #ilude <iostrem> usig mespe std; lss figur puli: virtul void rysuj() ; ; kls podstwow figur fukj wirtul rysuj() lss kwdrt : puli figur kls pohod kwdrt puli: void rysuj() out << "Kwdrt" << edl; ; lss trojkt : puli figur kls pohod trojkt puli: void rysuj() out << "Trojkt" << edl; ; lss kolo : puli figur kls pohod kolo puli: void rysuj() out << "Kolo" << edl; ; Rok kdemiki 0/0, Wykłd r 6 5/4 Rok kdemiki 0/0, Wykłd r 6 6/4 Fukje wirtule (polimorfizm) Przykłd r - fukje wirtule (/) jeśli wskźikowi do klsy podstwowej (figur) przypiszemy dres oiektu klsy pohodej (kwdrt, trojkt, kolo), to wywołują poprzez wskźik fukję rysuj(), wywołmy fukję odpowidjąą demu oiektowi, p. figur *ptr; kwdrt kw; trojkt tr; kolo kol; ptr &kw; ptr->rysuj(); ptr &tr; ptr->rysuj(); ptr &kol; ptr->rysuj(); - deklrj wskźik do oiektu klsy figur - deklrj oiektu klsy kwdrt - deklrj oiektu klsy trojkt - deklrj oiektu klsy kolo - wywoł zostie fukj rysuj() z klsy kwdrt - wywoł zostie fukj rysuj() z klsy trojkt - wywoł zostie fukj rysuj() z klsy kolo it mi() kwdrt kwdrt, kwdrt; trojkt trojkt, trojkt; kolo kolo, kolo; figur *list[6]; list[0] &trojkt; list[] &kwdrt; list[] &kolo; list[] &kwdrt; list[4] &kolo; list[5] &trojkt; for (it i0; i<6; i++) list[i]->rysuj(); Trojkt Kwdrt Kolo Kwdrt Kolo Trojkt mówimy, że w powyższym przykłdzie wystąpił polimorfizm (wielopostiowość)
Rok kdemiki 0/0, Wykłd r 6 7/4 Rok kdemiki 0/0, Wykłd r 6 8/4 Możeie mierzy przez wektor Możeie mierzy przez mierz Operj: C A W A[N][M] - mierz N M - elemetow W[M] - wektor M - elemetowy (kolumowy) C[N] - wektor N - elemetowy (kolumowy) Operj: C A B A[N][M] - mierz N M - elemetow B[M][K] - mierz M K - elemetow C[N][K] - mierz N K - elemetow w + w + w w w w + w + w w + w w + w Progrm w języku C: for (i0; i<n i++) C[i] 0.0; for (j0; j<m; j++) C[i] + A[i][j] * W[j]; M j i ij w j, i,, K, N N + + + + + + N + + + + + + K M K M + + + + + + Rok kdemiki 0/0, Wykłd r 6 9/4 Rok kdemiki 0/0, Wykłd r 6 0/4 Możeie mierzy przez mierz Możeie mierzy przez mierz N (i) Operj: C A B (A[N][M],B[M][K],C[N][K]) N (i) K (k) Progrm w języku C: for (k0; k<k; k++) C[i][k] 0.0; for (j0; j<m; j++) C[i][k] + A[i][j] * B[j][k]; M (j) M ik j K (k) M (j) i,, K, N ij jk, k,, K, K Koszt lgorytmu: O( ) szykość wykoywi olizeń wpływ ie tylko liz operji zmieoprzeikowyh, le tkże sposó poieri dyh z pmięi komputer oee systemy komputerowe mją hierrhizą udowę pmięi: rejestry proesor pmięć podręz (he) pmięć operyj pmięć zewętrz olizei są efektywie wykoywe, gdy odywją się zmieyh zjdująyh się w jk jszyszej pmięi
Rok kdemiki 0/0, Wykłd r 6 /4 Rok kdemiki 0/0, Wykłd r 6 /4 Możeie mierzy przez mierz Możeie mierzy przez mierz rozptrzmy dw lgorytmy możei mierzy: Algorytm r for (k0; k<n; k++) for (j0; j<n; j++) C[i][k] + A[i][j]*B[j][k]; Algorytm r for (j0; j<n; j++) for (k0; k<n; k++) C[i][k] + A[i][j]*B[j][k]; mierze: 048 048 proesor: Itel Core i5-40m,0 GHz kompiltor: Mirosoft Visul C++ 008 Stdrd Editio Algorytm r : ez optymlizji: 68,0 [s] z optymlizją: 9,05 [s] Algorytm r : ez optymlizji: 49,409 [s] z optymlizją: 6,70 [s] N Metod przehowywi mierzy w pmięi liiowej M [0][0] [0][] [0][] [0][] [][0] [][] [][] [][] [][0] [][] [][] [][] mierz w pmięi liiowej (wektor) mierz Pmięć podręz (he memory) Rok kdemiki 0/0, Wykłd r 6 /4 Rok kdemiki 0/0, Wykłd r 6 4/4 Możeie mierzy przez mierz Biliotek umeryz BLAS Algorytm r for (k0; k<k; k++) for (j0; j<m; j++) C[i][k] + A[i][j] * B[j][k]; Algorytm r for (j0; j<m; j++) for (k0; k<k; k++) C[i][k] + A[i][j] * B[j][k]; [0][0] [0][] [0][] [0][] [][0] [][] [][] [][] [][0] [][] [][] [][] C A B C A B BLAS - Bsi Lier Alger Suprogrms Ziór proedur służąyh do wykoywi operji podstwowyh oiekth lgery liiowej: sklrh wektorh mierzh Stro głów: http://www.etli.org/ls Rok pulikji: 979 Orygilie pis w języku Fortr 77 Osługuje lizy: rzezywiste pojedyzej i podwójej preyzji zespoloe pojedyzej i podwójej preyzji
Rok kdemiki 0/0, Wykłd r 6 5/4 Rok kdemiki 0/0, Wykłd r 6 6/4 Biliotek umeryz BLAS Wyróżi się poziomy strkji lgorytmów BLAS BLAS Level operje typu wektor-wektor (dodwie wektorów, ormy wektor, ilozy sklry wektorów) y α + y BLAS Level operje typu mierz-wektor (możeie mierzy przez wektor) y αa + y BLAS Level operje typu mierz-mierz (możeie mierzy przez mierz) C αa B + C BLAS - Nzwy proedur Struktur zwy: <hrter> <me> <mod> ( ) <hrter> - ozz preyzję (typ dyh): S - pojedyz, lizy rzezywiste (rel, sigle preisio) C - pojedyz, lizy zespoloe (omple, sigle preisio) D - podwój, lizy rzezywiste (rel, doule preisio) Z - podwój, lizy zespoloe (omple, doule preisio) <me> - w BLAS ozz typ operji: COPY - kopiowie wektorów ( vetor opy) DOT - ilozy sklry wektorów ( vetor dot produt) ROT - orót wektor ( vetor rottio) SWAP - zmi wektorów ( vetor swp) Rok kdemiki 0/0, Wykłd r 6 7/4 Rok kdemiki 0/0, Wykłd r 6 8/4 BLAS - Nzwy proedur <me> - w BLAS i ozz typ mierzy: GE - mierz ogól (geerl mtri) SY - mierz symetryz (symmetri mtri) TR - mierz trójkąt (trigulr mtri) <mod> - dodtkowe iformje o operji - w BLAS : MV - możeie mierzy przez wektor (mtri-vetor produt) SV - rozwiązie ukłdu rówń liiowyh (solvig system of lier equtios with mtri-vetor opertios) <mod> - dodtkowe iformje o operji - w BLAS : MM - możeie mierzy (mtri-mtri produt) SM - rozwiązie ukłdu rówń liiowyh (solvig system of lier equtios with mtri-mtri opertios BLAS - Nzwy proedur Przykłdy zw: DGEMV - możeie mierzy przez wektor, mierz i wektor zwierją lizy rzezywiste podwójej preyzji y α A + β y lu T y α A + β y SGEMM - możeie mierzy przez mierz, mierze zwierją lizy rzezywiste pojedyzej preyzji y α op( A) op( B) + β C op( X) X, op( X) X, op( X) ojg( X SSWAP - zmi wektorów zwierjąyh lizy rzezywiste pojedyzej preyzji T y T )
Rok kdemiki 0/0, Wykłd r 6 9/4 Rok kdemiki 0/0, Wykłd r 6 0/4 BLAS - Implemetje GPGPU i CUDA Stro głów: http://www.etli.org/ls Stro głów zwier iezoptymlizową iliotekę BLAS MKL (Itel) Itel Mth Kerel Lirry (Itel MKL) v http://softwre.itel.om/e-us/itel-mkl ACML (AMD) AMD Core Mth Lirry http://developer.md.om/tools/pu-developmet/md-ore-mthlirry-ml/ ATLAS (ope soure) Automtilly Tued Lier Alger Softwre http://mth-tls.soureforge.et/ GPGPU - Geerl Purpose omputig o Grphis Proessig Uits CUDA (Compute Uified Devie Arhiteture) hrdwre - rówoległ rhitektur olizeiow GPU softwre - kompiltor v, ilioteki i ie rrzędzi NVIDIA Corportio (USA) Pierwsz wersj: luty 007 Stro WWW: http://www.vidi.pl/ojet/ud_home_ew_pl.html Liej: freewre Rok kdemiki 0/0, Wykłd r 6 /4 Rok kdemiki 0/0, Wykłd r 6 /4 CUDA - Jk używć? CUBLAS Sprwdzić zy krt grfiz w komputerze osługuje CUDA wszystkie owe krty grfize NVIDIA są komptyile z CUDA Śiągąć oprogrmowie CUDA The CUDA Driver - zitegrowy ze sterowikiem krty grfizej The CUDA Toolkit - zwier rzędzi potrzee do kompilowi plikji z wykorzystiem Mirosoft Visul Studio (rzędzi, ilioteki, pliki główkowe, ie zsoy) The GPU Computig SDK - przykłdowe progrmy Zistlowć CUDA driver (jeśli jest to koieze) Zistlowć oprogrmowie CUDA - Toolkit, SDK Użyć szlou (templte projet) do stworzei włsego progrmu wykorzystująego CUDA Biliotek CUBLAS - implemetj BLAS (Bsi Lier Alger Suprogrms) dl krt grfizyh NVIDIA i środowisk CUDA Zstosowie CUBLAS w progrmie wymg: iijlizji ilioteki CUBLAS: ulsiit() przydzielei pmięi GPU mierze i wektory: ulsallo() przesłi mierzy i wektorów do pmięi GPU: ulssetmtri() wywołi odpowiedih fukji CUBLAS: ulssgemm() przesłi wyików olizeń z pmięi GPU do pmięi RAM komputer: ulsgetmtri() zwoliei pmięi GPU: ulsfree() zkońzei pry ilioteki CUBLAS: ulsshutdow()
Rok kdemiki 0/0, Wykłd r 6 /4 Rok kdemiki 0/0, Wykłd r 6 4/4 Normy wektor i mierzy Normy wektor orm jest lizą, stowiąą w pewym sesie mirę wektor lu mierzy ormy wektorów: m i i [ K K ] i i i i i mksimum pierwsz drug (euklidesow) Przykłd: [ ] dy jest wektor: 5 4 6 8 wrtośi orm wyoszą: orm mksimum: m i i 8 ormy mierzy: A m ij i j A m j i ij A E ij i j ieskońzoość pierwsz euklidesow orm pierwsz: i i orm drug (euklidesow): i i + 5 + 4 + 6 + 8 + + 9 + 5 + ( 4) + 6 + ( 8) + + 55,45 Rok kdemiki 0/0, Wykłd r 6 5/4 Rok kdemiki 0/0, Wykłd r 6 6/4 Przykłd r - ormy wektor (/) Przykłd r - ormy wektor (/) #ilude <iostrem> #ilude <stdli> #ilude <mth> usig mespe std; #defie N 7 it mi() /* Wektor */ flot [N], 5, -4, 6, -8,, ; flot orm_m, orm, orm; it i; /* Norm mksimum */ orm_m fs([0]); for (i; i<n; i++) if (orm_m < fs([i])) orm_m fs([i]); /* Norm pierwsz */ orm 0; orm orm + fs([i]); /* Norm drug(euklidesow) */ orm 0; orm orm + [i]*[i]; orm sqrt(orm); Norm mksimum: 8 Norm pierwsz: 9 Norm euklidesow:.4499 /* Wyswietleie wyikow */ out << "Norm mksimum: " << orm_m << edl; out << "Norm pierwsz: " << orm << edl; out << "Norm euklidesow: " << orm << edl;
Rok kdemiki 0/0, Wykłd r 6 7/4 Rok kdemiki 0/0, Wykłd r 6 8/4 Normy mierzy Przykłd: 5 4 wiersz + 5 + 4 A 6 9 A m ij wiersz + 6 + 9 7 A i j 7 5 wiersz 7 + 5 + 5 7 5 4 kolum + + 7 A 6 9 A m 5 + 6 + 5 6 6 ij kolum A j i 7 5 kolum 4 + 9 + 6 5 4 A 6 9 A E ij A i j 7 5 E + 5 + 4 + + 6 + 5,97 + 9 + 7 + 5 + Przykłd r - ormy mierzy (/) #ilude <iostrem> #ilude <stdli> #ilude <mth> usig mespe std; #defie N it mi() flot A[N][N], -5, 4,, 6, -9, 7, 5, ; flot orm_if; flot orm; flot orm_euk; flot sum; it i, j; Rok kdemiki 0/0, Wykłd r 6 9/4 Rok kdemiki 0/0, Wykłd r 6 40/4 Przykłd r - ormy mierzy (/) Przykłd r - ormy mierzy (/) /* Norm ieskozoos */ orm_if 0; sum 0; for (j0; j<n; j++) sum sum + fs(a[i][j]); if (sum > orm_if) orm_if sum; /* Norm pierwsz */ orm 0; for (j0; j<n; j++) sum 0; sum sum + fs(a[i][j]); if (sum > orm) orm sum; /* Norm euklidesow */ orm_euk 0; for (j0; j<n; j++) Norm ieskozoos: 7 Norm pierwsz: 6 Norm euklidesow: 5.974 orm_euk orm_euk + A[i][j]*A[i][j]; orm_euk sqrt(orm_euk); /* Wyswietleie wyikow */ out << "Norm ieskozoos: " << orm_if << edl; out << "Norm pierwsz: " << orm << edl; out << "Norm euklidesow: " << orm_euk << edl;
Rok kdemiki 0/0, Wykłd r 6 4/4 Koie wykłdu r 6 Dziękuję z uwgę!