Programowanie obiektowe w języku C++ dr inż. Jarosław Forenc. Przeładowanie (przeciążanie) operatorów. dziedziczenie funkcje wirtualne

Podobne dokumenty
Przykład: QS(tab,0,5); Sortowanie. Mnożenie macierzy. dr inż. Jarosław Forenc

Mnożenie macierzy Metody skrócenia czasu mnożenia macierzy. dr inż. Jarosław Forenc , K. metoda Strassena zmiana implementacji algorytmu

Programowanie obiektowe w języku C++ Operacje na wektorach i macierzach. dr inż. Jarosław Forenc. Dziedziczenie. funkcje wirtualne (polimorfizm)

Algorytmy komputerowe. Złożoność obliczeniowa Sortowanie. Mnożenie macierzy. dr inż. Jarosław Forenc

dr inż. Jarosław Forenc

Algebra Boole a. ccc dr inŝ. Jarosław Forenc

Semantyka i Weryfikacja Programów - Laboratorium 2 Działania na ułamkach, krotki i rekordy

Podstawy programowania obiektowego

PROGRAMOWANIE OBIEKTOWE W C++ cz. 2. Dziedziczenie, operacje wej cia-wyj cia, przeładowanie operatorów.

Programowanie obiektowe w języku C++ Zarządzanie procesami. dr inż. Jarosław Forenc. Przeładowanie (przeciążanie) operatorów

Elementy znajdujące się w opakowaniu mogą różnić się w zależności od kraju, w którym zakupiono urządzenie. Przewód zasilający do gniazdka ściennego

T W O R Z Y M Y. 15 godzin w cyklu 3-godzinnym

Rys Wyrównanie spostrzeżeń zawarunkowanych jednakowo dokładnych C. KRAKOWIANY

dr inż. Jarosław Forenc

Informatyka 2. Wykład nr 4 ( ) Politechnika Białostocka. - Wydział Elektryczny. dr inŝ. Jarosław Forenc

Wspomaganie obliczeń za pomocą programu MathCad

Całki oznaczone. wykład z MATEMATYKI

Połączenie (1) Optymalizacja poleceń SQL Część 3. Algorytm nested loops. Połączenie (2)

ZADANIA Z ZAKRESU SZKOŁY PODSTAWOWEJ, GIMNAZJUM I SZKOŁY ŚREDNIEJ

RBD Relacyjne Bazy Danych

Informatyka 2. Wykład nr 3 ( ) Politechnika Białostocka. - Wydział Elektryczny. dr inŝ. Jarosław Forenc

FUNKCJA KWADRATOWA. RÓWNANIA I NIERÓWNOŚCI DRUGIEGO STOPNIA.

WYZNACZNIKI. . Gdybyśmy rozważali układ dwóch równań liniowych, powiedzmy: Takie układy w matematyce nazywa się macierzami. Przyjmijmy definicję:

Wektor kolumnowy m wymiarowy macierz prostokątna o wymiarze n=1 Wektor wierszowy n wymiarowy macierz prostokątna o wymiarze m=1

PODSTAWY BAZ DANYCH Wykład 3 2. Pojęcie Relacyjnej Bazy Danych

G i m n a z j a l i s t ó w

Wprowadzenie do Sieci Neuronowych Łańcuchy Markowa

Analiza matematyczna i algebra liniowa

Wprowadzenie do Sieci Neuronowych Łańcuchy Markowa

Pierwiastek z liczby zespolonej

Metoda List łańcuchowych

a) b) Rys Schemat ideowo-konstrukcyjny układu do przykładu 6.1 a) i jego schemat blokowy

STYLE. TWORZENIE SPISÓW TREŚCI

Macierz. Wyznacznik macierzy. Układ równań liniowych

DZIAŁ 2. Figury geometryczne

WYŻSZA SZKOŁA INFORMATYKI STOSOWANEJ I ZARZĄDZANIA

Semantyka i Weryfikacja Programów - Laboratorium 7

Instrukcja montażu i obsługi

Zacznij tutaj. Podręcznik szybkiej obsługi DCP-7055 / DCP-7060D DCP-7065DN OSTRZEŻENIE CAUTION UWAGA

4. RACHUNEK WEKTOROWY

H. Dąbrowski, W. Rożek Próbna matura, grudzień 2014 r. CKE poziom rozszerzony 1. Zadanie 15 różne sposoby jego rozwiązania

Co można zrobić za pomocą maszyny Turinga? Wszystko! Maszyna Turinga potrafi rozwiązać każdy efektywnie rozwiązywalny problem algorytmiczny!

wersja podstawowa (gradient)

WYKŁAD 5. Typy macierzy, działania na macierzach, macierz układu równań. Podstawowe wiadomości o macierzach

wykład IV uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C, a C++. wykład IV dr Jarosław Mederski Spis Język C++ - wstęp

4.3. Przekształcenia automatów skończonych

typ y y p y z łoż o on o e n - tab a lice c e w iel e owym m ar a o r we, e stru r kt k ury

Programowanie w języku C++

XI. Rachunek całkowy funkcji wielu zmiennych. 1. Całka podwójna Całka podwójna po prostokącie. Oznaczenia:

4.6. Gramatyki regularne

Z INFORMATYKI RAPORT

PODSTAWY ALGEBRY MACIERZY. Operacje na macierzach

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

, 0 Informatyka w Zarządzaniu - test zaliczeniowy Zarządzanie III rok NS 7 Kwietnia 2013

Matematyczne Podstawy Informatyki

Komisja Egzaminacyjna dla Aktuariuszy LII Egzamin dla Aktuariuszy z 15 marca 2010 r. Część I Matematyka finansowa

2. Funktory TTL cz.2

Wymagania edukacyjne z matematyki

O pewnych zgadnieniach optymalizacyjnych O pewnych zgadnieniach optymalizacyjnych

System identyfikacji Doradców Podatkowych

Propozycja przedmiotowego systemu oceniania wraz z określeniem wymagań edukacyjnych (zakres podstawowy)

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego. best in training PRE TEST

Zacznij tutaj. Podręcznik szybkiej obsługi MFC-J200 OSTRZEŻENIE UWAGA WAŻNE INFORMACJA OSTRZEŻENIE

Metody generowania skończonych modeli zachowań systemów z czasem

Układy równań liniowych Macierze rzadkie

Wykªad 8. Pochodna kierunkowa.

Jest błędem odwołanie się do zmiennej, której nie przypisano wcześniej żadnej wartości.

Wyznacznikiem macierzy kwadratowej A stopnia n nazywamy liczbę det A określoną następująco:

KLUCZ PUNKTOWANIA ODPOWIEDZI

Jest błędem odwołanie się do zmiennej, której nie przypisano wcześniej żadnej wartości.

Przekształcenia automatów skończonych

CAŁKOWANIE NUMERYCZNE

MODEL ODPOWIEDZI I SCHEMAT OCENIANIA ARKUSZA EGZAMINACYJNEGO II

Zajęcia nr 5 Algorytmy i wskaźniki. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

Plik klasy. h deklaracje klas

Jak Windows zarządza pamięcią?

Wyk lad 1 Podstawowe wiadomości o macierzach

Zbiory rozmyte. logika rozmyta

a a a b M. Przybycień Matematyczne Metody Fizyki I

Języki Programowania. Prowadząca: dr inż. Hanna Zbroszczyk. tel: Konsultacje: piątek:

Programowanie obiektowe w języku C++ dr inż. Jarosław Forenc

Kodowanie liczb. Kodowanie stałopozycyjne liczb całkowitych. Niech liczba całkowita a ma w systemie dwójkowym postać: Kod prosty

class Student Deklaracja klasy Osoba: Deklaracja klasy Student:

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

Iloczyn skalarny

Pasek narzędziowy Symbolic [View Toolbars Math Symbolic] Pasek narzędziowy Modifier [Symbolic Modifiers]

Z600 Series Color Jetprinter

Laboratorium z metod numerycznych.

Zacznij tutaj. a b. Podręcznik szybkiej obsługi DCP-J140W OSTRZEŻENIE UWAGA OSTRZEŻENIE

Pierwiastek z liczby zespolonej

symbol dodatkowy element graficzny kolorystyka typografia

Chapter 1: Boolean Logic

Zadania. I. Podzielność liczb całkowitych

System Identyfikacji Wizualnej Miasta Kutno r

WEKTORY skalary wektory W ogólnym przypadku, aby określić wektor, należy znać:

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Wykład V. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

Programy współbieżne

III.3 Transformacja Lorentza prędkości i przyspieszenia. Efekt Dopplera

Programowanie obiektowe Wykład 3. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/21

Transkrypt:

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ę!