Informatyka 1 Politechnika Białostocka - Wydział Elektryczny Elektrotechnika, semestr II, studia stacjonarne I stopnia Rok akademicki 2012/2013 Wykład nr 7 (10.04.2013)
Rok akademicki 2012/2013, Wykład nr 7 2/66 Plan wykładu nr 7 Algorytmy komputerowe definicje algorytmu podstawowe cechy algorytmu sposoy opisu algorytmów Rekurencja Złożoność oliczeniowa Sortowanie proste wstawianie proste wyieranie ąelkowe Quick-Sort Mnożenie macierzy
Rok akademicki 2012/2013, Wykład nr 7 3/66 Algorytm - definicje Definicja 1 Skończony, uporządkowany ciąg jasno zdefiniowanych czynności, koniecznych do wykonania pewnego zadania Definicja 2 Metoda rozwiązania zadania Definicja 3 Ściśle określona procedura oliczeniowa, która dla właściwych danych wejściowych zwraca żądane dane wyjściowe zwane wynikiem działania algorytmu
Rok akademicki 2012/2013, Wykład nr 7 4/66 Algorytmy Słowo algorytm pochodzi od nazwiska Muhammada in-musy al-chuwarizmiego (po łacinie pisanego jako Algorismus), matematyka perskiego z IX wieku Badaniem algorytmów zajmuje się algorytmika Algorytm może zostać zaimplementowany w postaci programu komputerowego Przetłumaczenie algorytmu na wyrany język programowania nazywane jest też kodowaniem algorytmu Ten sam algorytm może yć zaimplementowany (zakodowany) w różny sposó przy użyciu różnych języków programowania.
Rok akademicki 2012/2013, Wykład nr 7 5/66 Podstawowe cechy algorytmu Posiadanie danych wejściowych (w ilości większej lu równej zeru) pochodzących z dorze zdefiniowanego zioru Zwracanie wyniku Precyzyjne zdefiniowanie (każdy krok algorytmu musi yć jednoznacznie określony) Poprawność (dla każdego z założonego dopuszczalnego zestawu danych wejściowych) Zakończenie działania po skończonej liczie kroków (powinna istnieć poprawnie działająca reguła stopu algorytmu) Efektywność (jak najkrótszy czas wykonania i jak najmniejsze zapotrzeowanie na pamięć).
Rok akademicki 2012/2013, Wykład nr 7 6/66 Sposoy opisu algorytmów 1. Opis słowny w języku naturalnym lu w postaci listy kroków (opis w punktach) 2. Schemat lokowy 3. Pseudokod (nieformalna odmiana języka programowania) 4. Wyrany język programowania
Rok akademicki 2012/2013, Wykład nr 7 7/66 Opis słowny algorytmu Podanie kolejnych czynności, które należy wykonać, ay otrzymać oczekiwany efekt końcowy Przypomina przepis kulinarny z książki kucharskiej lu instrukcję osługi urządzenia, np. Algorytm: Tortilla ( Podróże kulinarne R. Makłowicza) Dane wejściowe: 0,5 kg ziemniaków, 100 g kiełasy Chorizo, 8 jajek Dane wyjściowe: gotowa Tortilla Opis algorytmu: Ziemniaki orać i pokroić w plasterki. Kiełasę pokroić w plasterki. Ziemniaki wrzucić na gorącą oliwę na patelni i przyrumienić z ou stron. Kiełasę wrzucić na gorącą oliwę na patelni i przyrumienić z ou stron. Uić jajka i dodać do połączonych ziemniaków i kiełasy. Dodać sól i pieprz. Usmażyć z ou stron wielki omlet nadziewany chipsami ziemniaczanymi z kiełaską.
Rok akademicki 2012/2013, Wykład nr 7 8/66 Lista kroków Uporządkowany opis wszystkich czynności, jakie należy wykonać podczas realizacji algorytmu Krok jest to pojedyncza czynność realizowana w algorytmie Kroki w algorytmie są numerowane, operacje wykonywane są zgodnie z rosnącą numeracją kroków Jedynym odstępstwem od powyższej reguły są operacje skoku (warunkowe lu ezwarunkowe), w których jawnie określa się numer kolejnego kroku Przykład (instrukcja otwierania wózka-specerówki): Krok 1: Krok 2: Krok 3: Zwolnij element lokujący wózek Rozkładaj wózek w kierunku kółek Naciskając nogą dolny element lokujący aż do zatrzaśnięcia, rozłóż wózek do pozycji przewozowej
Rok akademicki 2012/2013, Wykład nr 7 9/66 Schemat lokowy Zawiera plan algorytmu przedstawiony w postaci graficznej struktury elementów zwanych lokami Każdy lok zawiera informację o operacji, która ma yć w nim wykonana Pomiędzy lokami umieszczone są linie przepływu (strzałki) określające kolejność wykonywania loków algorytmu Podstawowe symole stosowane na schematach lokowych: linia przepływu (połączenie) występuje w postaci linii zakończonej strzałką określa kierunek przemieszczania się po schemacie
Rok akademicki 2012/2013, Wykład nr 7 10/66 Schemat lokowy Podstawowe symole stosowane na schematach lokowych: lok startowy, początek algorytmu wskazuje miejsce rozpoczęcia algorytmu może występować tylko jeden raz STOP lok końcowy, koniec algorytmu wskazuje miejsce zakończenia algorytmu musi występować przynajmniej jeden raz lok wykonawczy, lok funkcyjny zawiera polecenie (elementarną instrukcję) instrukcją może yć podstawienie, operacja arytmetyczna, wprowadzenie danych lu wyprowadzenie wyników
Rok akademicki 2012/2013, Wykład nr 7 11/66 Schemat lokowy Podstawowe symole stosowane na schematach lokowych: lok warunkowy (decyzyjny, porównujący) sprawdza umieszczony w nim warunek i dokonuje wyoru tylko jednej drogi wyjściowej połączenia wychodzące z loku: - T lu TAK - gdy warunek jest prawdziwy - N lu NIE - gdy warunek nie jest prawdziwy Czasami wprowadzanie i wyprowadzanie danych oznacza się dodatkowym lokiem wejścia-wyjścia lok wejścia-wyjścia poprzez ten lok wprowadzane są dane i wyprowadzane wyniki
Rok akademicki 2012/2013, Wykład nr 7 12/66 Pseudokod i język programowania Pseudokod: Pseudokod (pseudojęzyk) - uproszczona wersja języka programowania Często zawiera zwroty pochodzące z języków programowania Zapis w pseudokodzie może yć łatwo przetłumaczony na wyrany język programowania Opis w języku programowania: Zapis programu w konkretnym języku programowania Stosowane języki: Pascal, C, Matla (kiedyś - Fortran, Basic)
Rok akademicki 2012/2013, Wykład nr 7 13/66 Algorytm Euklidesa - lista kroków Algorytm Euklidesa - największy wspólny dzielnik dwóch licz Dane wejściowe: niezerowe liczy naturalne a i Dane wyjściowe: NWD(a,) Kolejne kroki: 1. Czytaj liczy a i 2. Dopóki a i są większe od zera, powtarzaj krok 3, a następnie przejdź do kroku 4 3. Jeśli a jest większe od, to weź za a resztę z dzielenia a przez, w przeciwnym razie weź za resztę z dzielenia przez a 4. Przyjmij jako największy wspólny dzielnik tę z licz a i, która pozostała większa od zera 5. Drukuj NWD(a,)
Rok akademicki 2012/2013, Wykład nr 7 14/66 Algorytm Euklidesa - przykład NWD(1675,3752) =? a Dzielenie większej liczy przez mniejszą Zamiana 1675 3752 /a = 3752/1675 = 2 reszta 402 = 402 1675 402 a/ = 1675/402 = 4 reszta 67 a = 67 67 402 /a = 402/67 = 6 reszta 0 = 0 67 0 KONIEC NWD(1675,3752) = 67
Rok akademicki 2012/2013, Wykład nr 7 15/66 Algorytm Euklidesa - schemat lokowy
Rok akademicki 2012/2013, Wykład nr 7 16/66 Algorytm Euklidesa - pseudokod NWD(a,) while a>0 i >0 do if a> then a a mod else mod a if a>0 then return a else return
Rok akademicki 2012/2013, Wykład nr 7 17/66 Algorytm Euklidesa - język programowania (C) int NWD(int a, int ) { while (a>0 && >0) if (a>) a = a % ; else = % a; if (a>0) return a; else return ; }
Rok akademicki 2012/2013, Wykład nr 7 18/66 Wartość ezwzględna liczy - schemat lokowy x x dla = x dla x 0 x < 0 START START Wczytaj(x) Wczytaj(x) tak x 0 nie tak x 0 nie Drukuj(x) Drukuj(-x) Drukuj(x) Drukuj(-x) STOP STOP STOP
Rok akademicki 2012/2013, Wykład nr 7 19/66 Parzystość liczy - schemat lokowy START START Wczytaj(x) Wczytaj(x) x < 0 tak nie x mod 2 = 0 tak nie x = -x x > 1 nie Drukuj (x - nieparzyste) Drukuj (x - parzyste) tak x = x -2 nie x = 0 tak STOP Drukuj (x - nieparzyste) Drukuj (x - parzyste) STOP
Rok akademicki 2012/2013, Wykład nr 7 20/66 Równanie kwadratowe - schemat lokowy ax 2 = + x + c 2 4ac = 0 START Wczytaj(a,,c) delta= 2-4ac > 0 : x 1 =, 2a = 0 : x 1 = x 2 = 2 a x 2 = + 2a x tak x1 = 2a 2 + = 2a Drukuj(x 1,x 2 ) STOP delta > 0 nie tak x = x 1 2 = 2a Drukuj(x 1,x 2 ) delta = 0 nie Drukuj(Brak rozwiązania) STOP STOP
Rok akademicki 2012/2013, Wykład nr 7 21/66 Silnia - schemat lokowy n! = 1 2 3... n 0! = 1 1! = 1 2! = 1 2 3! = 1 2 3... START Wczytaj(n) silnia = 1 n > 0 nie tak silnia=n silnia n = n -1 Drukuj(silnia) STOP
Rok akademicki 2012/2013, Wykład nr 7 22/66 Rekurencja Rekurencja lu rekursja - jest to odwoływanie się funkcji lu definicji do samej sieie Rozwiązanie danego prolemu wyraża się za pomocą rozwiązań tego samego prolemu, ale dla danych o mniejszych rozmiarach W matematyce mechanizm rekurencji stosowany jest do definiowania lu opisywania algorytmów Silnia: 1 n! = n( n 1)! dla dla n = 0 n 1 int silnia(int n) { return n==0? 1 : n*silnia(n-1); }
Rok akademicki 2012/2013, Wykład nr 7 23/66 Rekurencja - ciąg Fionacciego F n = 0 dla n = 0 1 dla n = 1 F n 1 + F n 2 dla n > 1 int F(int n) { if (n==0) return 0; else if (n==1) return 1; else return F(n-1) + F(n-2); }
Rok akademicki 2012/2013, Wykład nr 7 24/66 Rekurencja - algorytm Euklidesa NWD( a, ) = a NWD(, a mod ) dla dla = 0 1 int NWD(int a, int ) { if (==0) return a; else return NWD(,a % ); }
Rok akademicki 2012/2013, Wykład nr 7 25/66 Złożoność oliczeniowa W celu rozwiązania danego prolemu oliczeniowego szukamy algorytmu najardziej efektywnego czyli: najszyszego o możliwie małym zapotrzeowaniu na pamięć Do oceny efektywności programu służy złożoność oliczeniowa (koszt algorytmu) Złożoność oliczeniowa algorytmu: jest ilością zasoów potrzenych do jego działania (czas, pamięć) jest funkcją rozmiaru danych, na których pracuje algorytm
Rok akademicki 2012/2013, Wykład nr 7 26/66 Złożoność oliczeniowa Złożoność czasowa Jej miarą jest licza podstawowych operacji (dominujących) Podstawowe operacje - porównanie, podstawienie, operacja arytmetyczna Złożoność pamięciowa Jest miarą wykorzystania pamięci (licza komórek pamięci) Złożoność pesymistyczna Odpowiada danym najardziej niesprzyjającym dla algorytmu Złożoność średnia Złożoność uśredniona po wszystkich możliwych zestawach danych, występująca dla typowych danych wejściowych
Rok akademicki 2012/2013, Wykład nr 7 27/66 Notacja O ( duże O ) Wyraża złożoność matematyczną algorytmu Po literze O występuje wyrażenie w nawiasach zawierające literę n, która oznacza liczę elementów, na której działa algorytm Do wyznaczenia złożoności ierze się pod uwagę liczę wykonywanych w algorytmie podstawowych operacji Przykład: O(n) - złożoność algorytmu jest prostą funkcją liczy elementów (jeśli sortowanie 10.000 elementów zajmuje 5 s, to sortowanie 20.000 elementów zajmie 10 s) O(n 2 )- czas konieczny do wykonania algorytmu rośnie wraz z kwadratem liczy elementów (przy podwojeniu liczy elementów ich osługa ędzie trwała cztery razy dłużej)
Rok akademicki 2012/2013, Wykład nr 7 28/66 Notacja O ( duże O ) Porównanie najczęściej występujących złożoności: Elementy O(log n) O(n) O(n logn) O(n 2 ) O(2 n ) 10 3 10 33 100 1024 100 7 100 664 10 000 1,27 10 30 1 000 10 1 000 9 966 1 000 000 1,07 10 301 10 000 13 10 000 132 877 100000000 1,99 10 3010 O(log n) - złożoność logarytmiczna O(n) - złożoność liniowa O(n log n) - złożoność liniowo-logarytmiczna (quasi-liniowa) O(n 2 ) - złożoność kwadratowa O(2 n ) - złożoność wykładnicza
Informatyka 2, studia stacjonarne I stopnia Rok akademicki 2012/2013, Wykład nr 7 29/66 Sortowanie sortowanie polega na uporządkowaniu zioru danych względem pewnych cech charakterystycznych każdego elementu tego zioru (wartości każdego elementu) w przypadku licz, sortowanie polega na znalezieniu kolejności licz zgodnej z relacją lu Przykład: talica nieposortowana: talica posortowana zgodnie z relacją (od najmniejszej do największej liczy): talica posortowana zgodnie z relacją (od największej do najmniejszej liczy):
Informatyka 2, studia stacjonarne I stopnia Rok akademicki 2012/2013, Wykład nr 7 30/66 Sortowanie w przypadku słów sortowanie polega na ustawieniu ich w porządku alfaetycznym (leksykograficznym) Przykład: talica nieposortowana: talice posortowane:
Informatyka 2, studia stacjonarne I stopnia Rok akademicki 2012/2013, Wykład nr 7 31/66 Sortowanie w praktyce sortowanie sprowadza się do porządkowanie danych na podstawie porównania - porównywany element to klucz Przykład: talica nieposortowana (imię, nazwisko, wiek): talica posortowana (klucz - nazwisko): talica posortowana (klucz - wiek):
Informatyka 2, studia stacjonarne I stopnia Rok akademicki 2012/2013, Wykład nr 7 32/66 Sortowanie Po co stosować sortowanie? posortowane elementy można szyciej zlokalizować posortowane elementy można przedstawić w czytelniejszy sposó Klasyfikacje algorytmów sortowania złożoność oliczeniowa algorytmu - zależność liczy wykonywanych operacji w stosunku do liczeności sortowanego zioru n złożoność pamięciowa - wielkość zasoów zajmowanych przez algorytm (sortowanie w miejscu - wielkość zioru danych podczas sortowania nie zmienia się lu jest tylko nieco większa) sortowanie wewnętrzne (odywa się w pamięci komputera) i zewnętrzne (nie jest możliwe jednoczesne umieszczenie wszystkich elementów zioru sortowanego w pamięci komputera)
Informatyka 2, studia stacjonarne I stopnia Rok akademicki 2012/2013, Wykład nr 7 33/66 Klasyfikacje algorytmów sortowania Stailność algorytmu: algorytm jest stailny, jeśli podczas sortowania zachowuje kolejność występowania elementów o tym samym kluczu, np. talica nieposortowana (imię, nazwisko, wiek): talica posortowana algorytmem stailnym (klucz - wiek): talica posortowana algorytmem niestailnym (klucz - wiek):
Informatyka 2, studia stacjonarne I stopnia Rok akademicki 2012/2013, Wykład nr 7 34/66 Proste wstawianie (insertion sort) Przykład: Funkcja w języku C: void InsertionSort(int ta[]) { int i,j,tmp; } for (i=1; i<n; i++) { j=i; tmp=ta[i]; while (ta[j-1]>tmp && j>0) { ta[j]=ta[j-1]; j--; } ta[j]=tmp; }
Informatyka 2, studia stacjonarne I stopnia Rok akademicki 2012/2013, Wykład nr 7 35/66 Proste wstawianie (insertion sort) Uwagi: złożoność algorytmu: O(n 2 ) + wydajny dla danych wstępnie posortowanych + wydajny dla ziorów o niewielkiej liczeności + małe zasoy zajmowane podczas pracy (sortowanie w miejscu) + stailny + prosty w implementacji mała efektywność dla normalnej i dużej ilości danych.
Informatyka 2, studia stacjonarne I stopnia Rok akademicki 2012/2013, Wykład nr 7 36/66 Proste wyieranie (selection sort) Przykład: Funkcja w języku C: void SelectionSort(int ta[]) { int i,j,k,tmp; } for (i=0;i<n-1;i++) { k=i; for (j=i+1; j<n; j++) if (ta[k]>=ta[j]) k = j; tmp = ta[i]; ta[i] = ta[k]; ta[k] = tmp; }
Informatyka 2, studia stacjonarne I stopnia Rok akademicki 2012/2013, Wykład nr 7 37/66 Proste wyieranie (selection sort) Uwagi: złożoność algorytmu: O(n 2 ) + szyki w sortowaniu niewielkich talic + małe zasoy zajmowane podczas pracy (sortowanie w miejscu) + prosty w implementacji licza porównań elementów jest niezależna od początkowego rozmieszczenia elementów w talicy w algorytmie może zdarzyć się, że wykonywana jest zamiana tego samego elementu ze soą.
Informatyka 2, studia stacjonarne I stopnia Rok akademicki 2012/2013, Wykład nr 7 38/66 Bąelkowe (ule sort) sortowanie ąelkowe (ang. ule sort), nazywane jest także: sortowaniem pęcherzykowym sortowaniem przez prostą zamianę (ang. straight exchange) metoda ta polega na porównywaniu dwóch kolejnych elementów i zamianie ich kolejności jeśli jest to konieczne nazwa metody wzięła się stąd, że kolejne porównania powodują wypychanie kolejnego największego elementu na koniec ( wypłynięcie największego ąelka )
Informatyka 2, studia stacjonarne I stopnia Rok akademicki 2012/2013, Wykład nr 7 39/66 Bąelkowe (ule sort)
Informatyka 2, studia stacjonarne I stopnia Rok akademicki 2012/2013, Wykład nr 7 40/66 Bąelkowe (ule sort) Funkcja w języku C: void BuleSort(int ta[]) { int i,j,tmp,koniec; } do { koniec=0; for (i=0;i<n-1;i++) if (ta[i]>ta[i+1]) { tmp=ta[i]; ta[i]=ta[i+1]; ta[i+1]=tmp; koniec=1; } } while (koniec);
Informatyka 2, studia stacjonarne I stopnia Rok akademicki 2012/2013, Wykład nr 7 41/66 Bąelkowe (ule sort) Uwagi: złożoność algorytmu: O(n 2 ) + prosta realizacja + wysoka efektywność użycia pamięci (sortowanie w miejscu) + stailny mała efektywność.
Informatyka 2, studia stacjonarne I stopnia Rok akademicki 2012/2013, Wykład nr 7 42/66 Sortowanie szykie (Quick-Sort) Faza dzielenia: w fazie dzielenia talica jest dzielona na dwie części wokół pewnego elementu (nazywanego elementem centralnym) wyieramy jeden element (losowo, choć może to yć element środkowy) i nazywamy go x przeglądamy talicę od lewej strony, aż znajdziemy element a i x, a następnie przeglądamy talicę od prawej strony, aż znajdziemy a j x zamieniamy elementy a i i a j miejscami i kontynuujemy proces przeglądania i zamiany, aż nastąpi gdzieś spotkanie w środku talicy w rezultacie otrzymujemy talicę podzieloną na lewą część z wartościami mniejszymi od x i na prawą część z wartościami większymi od x
Informatyka 2, studia stacjonarne I stopnia Rok akademicki 2012/2013, Wykład nr 7 43/66 Sortowanie szykie (Quick-Sort) Faza sortowania: zawiera dwa rekurencyjne wywołania tej samej funkcji sortowania: dla lewej i dla prawej części posortowanej talicy rekurencja zatrzymuje się, gdy wielkość talicy wynosi 1 Przykład: sortujemy 6-elementową talicę ta: wywołanie funkcji QuickSort() ma postać: QuickSort(ta,0,5);
Informatyka 2, studia stacjonarne I stopnia Rok akademicki 2012/2013, Wykład nr 7 44/66 Sortowanie szykie (Quick-Sort) QuickSort(ta,0,5): element środkowy: (0+5)/2 = 2, x = ta[2] = 5 od lewej szukamy ta[i] x, a od prawej ta[j] x, zamieniamy elementy miejscami poszukiwania kończymy, gdy indeksy mijają się wywołujemy rekurencyjnie funkcję QuickSort() dla elementów z zakresów [l,j] i [i,r]: QuickSort(ta,0,3); QuickSort(ta,4,5);
Informatyka 2, studia stacjonarne I stopnia Rok akademicki 2012/2013, Wykład nr 7 45/66 Sortowanie szykie (Quick-Sort) QuickSort(ta,0,3): element środkowy dla zakresu [0,3]: (0+3)/2 = 1, x = ta[1] = 2 od lewej szukamy ta[i] x, a od prawej ta[j] x, zamieniamy elementy miejscami: 0 1 2 3 1 2 4 3 i j zamiana poszukiwania kończymy, gdy indeksy mijają się: wywołanie QuickSort() tylko dla elementów z zakresu [2,3], gdyż po lewej stronie rozmiar talicy do posortowania wynosi 1: QuickSort(ta,2,3);
Informatyka 2, studia stacjonarne I stopnia Rok akademicki 2012/2013, Wykład nr 7 46/66 Sortowanie szykie (Quick-Sort) QuickSort(ta,2,3): element środkowy dla zakresu [2,3]: (2+3)/2 = 2, x = ta[2] = 3 od lewej szukamy ta[i] x, a od prawej ta[j] x, zamieniamy elementy miejscami: poszukiwania kończymy, gdy indeksy mijają się: rozmiar ou talic do posortowania wynosi 1 więc nie ma nowych wywołań
Informatyka 2, studia stacjonarne I stopnia Rok akademicki 2012/2013, Wykład nr 7 47/66 Sortowanie szykie (Quick-Sort) QuickSort(ta,4,5): element środkowy dla zakresu [4,5]: (4+5)/2 = 4, x = ta[4] = 6 od lewej szukamy ta[i] x, a od prawej ta[j] x, zamieniamy elementy miejscami: poszukiwania kończymy, gdy indeksy mijają się: rozmiar ou talic do posortowania wynosi 1 więc nie ma nowych wywołań
Informatyka 2, studia stacjonarne I stopnia Rok akademicki 2012/2013, Wykład nr 7 48/66 Sortowanie szykie (Quick-Sort) Funkcja w języku C: void QuickSort(int ta[], int l, int r) { int i,j,x,y; } i=l; j=r; x=ta[(l+r)/2]; do { while (ta[i]<x) i++; while (x<ta[j]) j--; if (i<=j) { y=ta[i]; ta[i]=ta[j]; ta[j]=y; i++; j--; } } while (i<=j); if (l<j) QuickSort(ta,l,j); if (i<r) QuickSort(ta,i,r);
Rok akademicki 2012/2013, Wykład nr 7 49/66 Funkcja qsort() w języku C algorytm Quick-Sort został zaimplementowany w języku C w funkcji: QSORT stdli.h void qsort(void *aza, size_t n, size_t size, (*funkcja)(const void *element1, const void *element2)); funkcja qsort() sortuje metodą Quick-Sort talicę wskazywaną przez argument aza i zawierającą n elementów o rozmiarze size funkcja qsort() posługuje się funkcją porównującą funkcja(), której argumentami są wskazania do elementów talicy aza funkcja() powinna zwracać wartości: < 0, gdy *element1 < *element2 == 0, gdy *element1 == *element2 > 0, gdy *element1 > *element2
Rok akademicki 2012/2013, Wykład nr 7 50/66 Funkcja qsort() w języku C - przykład (1/2) #include <stdio.h> #include <stdli.h> #include <time.h> #define N 10 void generuj(int ta[]) { int i; srand(time(null)); for (i=0;i<n;i++) ta[i]=rand()%100; } void drukuj(int ta[]) { int i; for (i=0;i<n;i++) printf("%2d ",ta[i]); printf("\n"); }
Rok akademicki 2012/2013, Wykład nr 7 51/66 Funkcja qsort() w języku C - przykład (2/2) int funkcja(const void *element1, const void *element2) { if (*(int*)element1 < *(int*)element2) return -1; if (*(int*)element1 == *(int*)element2) return 0; if (*(int*)element1 > *(int*)element2) return 1; } int main() { int ta[n]; generuj(ta); drukuj(ta); printf("\nqsort:\n"); qsort((void*)ta,(size_t)n,sizeof(int),funkcja); drukuj(ta); } system("pause"); return (0);
Rok akademicki 2012/2013, Wykład nr 7 52/66 Funkcja qsort() w języku C - przykład (2/2) 6 7 31 22 66 89 22 int funkcja(const void *element1, const void *element2) { if (*(int*)element1 < qsort: *(int*)element2) return -1; if (*(int*)element1 == 6 *(int*)element2) 7 22 22 26return 27 0; 31 if (*(int*)element1 > *(int*)element2) return 1; } 27 52 26 66 52 89 int main() { int ta[n]; generuj(ta); drukuj(ta); printf("\nqsort:\n"); qsort((void*)ta,(size_t)n,sizeof(int),funkcja); drukuj(ta); } system("pause"); return (0);
Rok akademicki 2012/2013, Wykład nr 7 53/66 Mnożenie macierzy przez macierz Operacja: C = A B A[N][M] - macierz N M - elementowa B[M][K] - macierz M K - elementowa C[N][K] - macierz N K - elementowa N c c c 11 21 31 c c c 12 22 32 c c c 13 23 33 = N a a a 11 21 31 a a a 12 22 32 a a a 13 23 33 11 21 31 12 22 32 13 23 33 M K M K c c c 11 21 31 = a = a = a 11 21 31 11 11 11 + a + a + a 12 22 32 21 21 21 + a 13 + a + a 23 33 31 31 31 c c c 12 22 32 = a = a = a 11 21 31 12 12 12 + a + a + a 12 22 32 22 22 22 + a 13 + a + a 23 33 32 32 32 c c c 13 23 33 = a = a = a 11 21 31 13 13 13 + a + a + a 12 22 32 23 23 23 + a 13 + a + a 23 33 33 33 33
Rok akademicki 2012/2013, Wykład nr 7 54/66 Mnożenie macierzy przez macierz Operacja: C = A B (A[N][M],B[M][K],C[N][K]) N (i) c c c 11 c c 12 c c 13 = N (i) a a a 11 21 22 23 21 22 23 21 22 23 31 c 32 c 33 31 a 32 a 33 31 32 33 a a 12 a a 13 11 12 13 M (j) K (k) M (j) K (k) Program 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]; } c ik M = j= i = 1,2, K, N aij jk, 1 k = 1,2, K, K Koszt algorytmu: O( n 3 )
Rok akademicki 2012/2013, Wykład nr 7 55/66 Mnożenie macierzy przez macierz na szykość wykonywania oliczeń wpływa nie tylko licza operacji zmiennoprzecinkowych, ale także sposó poierania danych z pamięci komputera oecne systemy komputerowe mają hierarchiczną udowę pamięci: rejestry procesora pamięć podręczna (cache) pamięć operacyjna pamięć zewnętrzna oliczenia są efektywnie wykonywane, gdy odywają się na zmiennych znajdujących się w jak najszyszej pamięci
Rok akademicki 2012/2013, Wykład nr 7 56/66 Mnożenie macierzy przez macierz rozpatrzmy dwa algorytmy mnożenia macierzy: Algorytm nr 1 for (i=0; i<n; i++) for (k=0; k<n; k++) for (j=0; j<n; j++) C[i][k] += A[i][j]*B[j][k]; Algorytm nr 2 for (i=0; i<n; i++) for (j=0; j<n; j++) for (k=0; k<n; k++) C[i][k] += A[i][j]*B[j][k]; macierze: 2048 2048 procesor: Intel Core i5-2410m 2,30 GHz kompilator: Microsoft Visual C++ 2008 Standard Edition Algorytm nr 1: ez optymalizacji: 268,021 [s] z optymalizacją: 92,053 [s] Algorytm nr 2: ez optymalizacji: 49,409 [s] z optymalizacją: 6,270 [s]
Rok akademicki 2012/2013, Wykład nr 7 57/66 Mnożenie macierzy przez macierz Metoda przechowywania macierzy w pamięci liniowej M [0][0] [0][1] [0][2] [0][3] N [1][0] [1][1] [1][2] [1][3] [2][0] [2][1] [2][2] [2][3] macierz macierz w pamięci liniowej (wektor) Pamięć podręczna (cache memory)
Rok akademicki 2012/2013, Wykład nr 7 58/66 Mnożenie macierzy przez macierz Algorytm nr 1 for (i=0; i<n; i++) for (k=0; k<k; k++) for (j=0; j<m; j++) C[i][k] += A[i][j] * B[j][k]; C A B Algorytm nr 2 for (i=0; i<n; i++) for (j=0; j<m; j++) for (k=0; k<k; k++) C[i][k] += A[i][j] * B[j][k]; C A B [0][0] [0][1] [0][2] [0][3] [1][0] [1][1] [1][2] [1][3] [2][0] [2][1] [2][2] [2][3]
Rok akademicki 2012/2013, Wykład nr 7 59/66 Bilioteka numeryczna BLAS BLAS - Basic Linear Algera Suprograms Ziór procedur służących do wykonywania operacji na podstawowych oiektach algery liniowej: skalarach wektorach macierzach Strona główna: http://www.netli.org/las Rok pulikacji: 1979 Oryginalnie napisana w języku Fortran 77 Osługuje liczy: rzeczywiste pojedynczej i podwójnej precyzji zespolone pojedynczej i podwójnej precyzji
Rok akademicki 2012/2013, Wykład nr 7 60/66 Bilioteka numeryczna BLAS Wyróżnia się 3 poziomy astrakcji algorytmów BLAS BLAS Level 1 operacje typu wektor-wektor (dodawanie wektorów, normy wektora, iloczyn skalarny wektorów) y α x + y BLAS Level 2 operacje typu macierz-wektor (mnożenie macierzy przez wektor) BLAS Level 3 y αax + y operacje typu macierz-macierz (mnożenie macierzy przez macierz) C αa B + C
Rok akademicki 2012/2013, Wykład nr 7 61/66 BLAS - Nazwy procedur DGEMV - mnożenie macierzy przez wektor, macierz i wektor zawierają liczy rzeczywiste podwójnej precyzji y α A x + β y lu y α A x + β y SGEMM - mnożenie macierzy przez macierz, macierze zawierają liczy rzeczywiste pojedynczej precyzji T y α op( A) op( B) + β C op( X) = X, op( X) = X T, op( X) = conjg( X T ) SSWAP - zamiana wektorów zawierających liczy rzeczywiste pojedynczej precyzji x y
Rok akademicki 2012/2013, Wykład nr 7 62/66 BLAS - Implementacje Strona główna: http://www.netli.org/las Strona główna zawiera niezoptymalizowaną iliotekę BLAS MKL (Intel) Intel Math Kernel Lirary (Intel MKL) v11 http://software.intel.com/en-us/intel-mkl ACML (AMD) AMD Core Math Lirary http://developer.amd.com/tools/cpu-development/amd-core-mathlirary-acml/ ATLAS (open source) Automatically Tuned Linear Algera Software http://math-atlas.sourceforge.net/
Rok akademicki 2012/2013, Wykład nr 7 63/66 GPGPU i CUDA GPGPU - General Purpose computing on Graphics Processing Units CUDA (Compute Unified Device Architecture) hardware - równoległa architektura oliczeniowa GPU software - kompilator nvcc, ilioteki i inne narrzędzia NVIDIA Corporation (USA) Pierwsza wersja: luty 2007 Strona WWW: http://www.nvidia.pl/oject/cuda_home_new_pl.html Licencja: freeware
Rok akademicki 2012/2013, Wykład nr 7 64/66 CUDA - Jak używać? Sprawdzić czy karta graficzna w komputerze osługuje CUDA wszystkie nowe karty graficzne NVIDIA są kompatyilne z CUDA Ściągnąć oprogramowanie CUDA The CUDA Driver - zintegrowany ze sterownikiem karty graficznej The CUDA Toolkit - zawiera narzędzia potrzene do kompilowania aplikacji z wykorzystaniem Microsoft Visual Studio (narzędzia, ilioteki, pliki nagłówkowe, inne zasoy) The GPU Computing SDK - przykładowe programy Zainstalować CUDA driver (jeśli jest to konieczne) Zainstalować oprogramowanie CUDA - Toolkit, SDK Użyć szalonu (template project) do stworzenia własnego programu wykorzystującego CUDA
Rok akademicki 2012/2013, Wykład nr 7 65/66 CUBLAS Bilioteka CUBLAS - implementacja BLAS (Basic Linear Algera Suprograms) dla kart graficznych NVIDIA i środowiska CUDA Zastosowanie CUBLAS w programie wymaga: inicjalizacji ilioteki CUBLAS: culasinit() przydzielenia pamięci GPU na macierze i wektory: culasalloc() przesłania macierzy i wektorów do pamięci GPU: culassetmatrix() wywołania odpowiednich funkcji CUBLAS: culassgemm() przesłania wyników oliczeń z pamięci GPU do pamięci RAM komputera: culasgetmatrix() zwolnienia pamięci GPU: culasfree() zakończenia pracy ilioteki CUBLAS: culasshutdown()
Rok akademicki 2012/2013, Wykład nr 7 66/66 Koniec wykładu nr 7 Dziękuję za uwagę!