Informatyka 1 - PB Wydział Elektryczny

Transkrypt

Informatyka 1 - PB Wydział Elektryczny
Informatyka 1, studia niestacjonarne I stopnia
Rok akademicki 2014/2015, Wykład nr 9
dr inż. Jarosław Forenc
2/60
Plan wykładu nr 9
Algorytmy komputerowe
Informatyka 1
sposoby opisu - przykłady
Rekurencja
Złożoność obliczeniowa
Sortowanie
Politechnika Białostocka - Wydział Elektryczny
proste wstawianie
Elektrotechnika, semestr II, studia niestacjonarne I stopnia
proste wybieranie
Rok akademicki 2014/2015
bąbelkowe
Quick-Sort
Mnożenie macierzy
Wykład nr 9 (12.06.2015)
dr inż. Jarosław Forenc
Informatyka 1, studia niestacjonarne I stopnia
Rok akademicki 2014/2015, Wykład nr 9
dr inż. Jarosław Forenc
3/60
Algorytm Euklidesa - lista kroków
Algorytm Euklidesa - największy wspólny dzielnik dwóch liczb
Dane wejściowe: niezerowe liczby naturalne a i b
Informatyka 1, studia niestacjonarne I stopnia
Rok akademicki 2014/2015, Wykład nr 9
dr inż. Jarosław Forenc
4/60
Algorytm Euklidesa - przykład
NWD(1675,3752) = ?
a
b
Dane wyjściowe: NWD(a,b)
1675
3752
b/a = 3752/1675 = 2 reszta 402
b = 402
Kolejne kroki:
1675
402
a/b = 1675/402 = 4 reszta 67
a = 67
1. Czytaj liczby a i b
67
402
b/a = 402/67 = 6 reszta 0
b=0
2. Dopóki a i b są większe od zera, powtarzaj krok 3, a następnie
przejdź do kroku 4
67
0
3. Jeśli a jest większe od b, to weź za a resztę z dzielenia a przez b,
w przeciwnym razie weź za b resztę z dzielenia b przez a
4. Przyjmij jako największy wspólny dzielnik tę z liczb a i b,
która pozostała większa od zera
5. Drukuj NWD(a,b)
Dzielenie większej liczby przez mniejszą
KONIEC
NWD(1675,3752) = 67
Zamiana
Informatyka 1, studia niestacjonarne I stopnia
Rok akademicki 2014/2015, Wykład nr 9
dr inż. Jarosław Forenc
5/60
Algorytm Euklidesa - schemat blokowy
Informatyka 1, studia niestacjonarne I stopnia
Rok akademicki 2014/2015, Wykład nr 9
dr inż. Jarosław Forenc
6/60
Algorytm Euklidesa - pseudokod
NWD(a,b)
while a>0 i b>0
do if a>b
then a ← a mod b
else b ← b mod a
if a>0
then return a
else return b
Informatyka 1, studia niestacjonarne I stopnia
Rok akademicki 2014/2015, Wykład nr 9
dr inż. Jarosław Forenc
Algorytm Euklidesa - język programowania (C)
7/60
Informatyka 1, studia niestacjonarne I stopnia
Rok akademicki 2014/2015, Wykład nr 9
dr inż. Jarosław Forenc
8/60
Metoda CG - schemat blokowy
START
int NWD(int a, int b)
{
while (a>0 && b>0)
if (a>b)
a = a % b;
else
b = b % a;
if (a>0)
return a;
else
return b;
}
p ( 0) = r( 0 ) = b − A ⋅ x ( 0)
α(k ) =
r ⋅ r( k )
p
x ( k +1) = x ( k ) + α ( k ) ⋅ p ( k )
T
(k )
T
(k )
⋅ A ⋅ p(k )
r( k +1) = r( k ) − α ( k ) ⋅ A ⋅ p ( k )
r( k +1) < ε
TAK
KONIEC
NIE
β ( k +1) =
T
( k +1)
T
(k )
r
⋅ r( k +1)
r ⋅ r( k )
p ( k +1) = r( k +1) + β( k +1) ⋅ p ( k )
Informatyka 1, studia niestacjonarne I stopnia
Rok akademicki 2014/2015, Wykład nr 9
dr inż. Jarosław Forenc
9/60
Metoda CG - pseudokod + program ((Matlab
Matlab))
Informatyka 1, studia niestacjonarne I stopnia
Rok akademicki 2014/2015, Wykład nr 9
dr inż. Jarosław Forenc
10/60
Wartość bezwzględna liczby - schemat blokowy
function [xk]=CGM(A,b,xk,eps)
 x dla x ≥ 0
x =
− x dla x < 0
pk = rk = b - A*xk;
dotrk = rk'*rk;
k = 0;
while (1)
k = k + 1;
Ap = A*pk;
alfa = dotrk/(pk'*Ap);
xk = xk + alfa*pk;
rk = rk - alfa*Ap;
dotrk1 = rk'*rk;
tak
if norm(rk,inf)<eps
break
end
pk = rk + (dotrk1/dotrk)*pk;
dotrk = dotrk1;
end
Informatyka 1, studia niestacjonarne I stopnia
Rok akademicki 2014/2015, Wykład nr 9
dr inż. Jarosław Forenc
11/60
Parzystość liczby - schemat blokowy
START
Wczytaj(x)
Wczytaj(x)
x
tak
nie
0
Drukuj(x)
Drukuj(-x)
STOP
STOP
x
0
Drukuj(x)
nie
Drukuj(-x)
STOP
Informatyka 1, studia niestacjonarne I stopnia
Rok akademicki 2014/2015, Wykład nr 9
dr inż. Jarosław Forenc
12/60
Równanie kwadratowe - schemat blokowy
START
START
START
START
ax 2 + bx + c = 0
Wczytaj(x)
Wczytaj(a,b,c)
∆ = b 2 − 4ac
Wczytaj(x)
x<0
delta=b2-4ac
tak
∆ > 0:
nie
x = -x
nie
x mod 2 = 0
x>1
Drukuj
(x - nieparzyste)
tak
−b− ∆
−b+ ∆
x1 =
, x2 =
2a
2a
tak
Drukuj
(x - parzyste)
nie
tak
nie
x=0
tak
x=x-2
STOP
Drukuj
(x - nieparzyste)
Drukuj
(x - parzyste)
STOP
∆ = 0:
x1 = x2 =
−b− ∆
2a
−b+ ∆
x2 =
2a
x1 =
delta > 0
nie
tak
x1 = x2 =
−b
2a
−b
2a
delta = 0
nie
Drukuj(Brak
rozwiązania)
Drukuj(x1,x2)
Drukuj(x1,x2)
STOP
STOP
STOP
Informatyka 1, studia niestacjonarne I stopnia
Rok akademicki 2014/2015, Wykład nr 9
dr inż. Jarosław Forenc
13/60
Silnia - schemat blokowy
n!= 1⋅ 2 ⋅ 3 ⋅ ... ⋅ n
Rozwiązanie danego problemu wyraża się za pomocą rozwiązań
tego samego problemu, ale dla danych o mniejszych rozmiarach
Wczytaj(n)
W matematyce mechanizm rekurencji stosowany
jest do definiowania lub opisywania algorytmów
silnia = 1
Silnia:
...
n>0
14/60
Rekurencja lub rekursja - jest to odwoływanie się funkcji lub
definicji do samej siebie
START
2!= 1⋅ 2
3!= 1⋅ 2 ⋅ 3
dr inż. Jarosław Forenc
Rekurencja
0!= 1
1!= 1
Informatyka 1, studia niestacjonarne I stopnia
Rok akademicki 2014/2015, Wykład nr 9
nie
dla n = 0
1
n!= 
n(n − 1)! dla n ≥ 1
tak
Drukuj(silnia)
silnia = n · silnia
n=n-1
int silnia(int n)
{
return n==0 ? 1 : n*silnia(n-1);
}
STOP
Informatyka 1, studia niestacjonarne I stopnia
Rok akademicki 2014/2015, Wykład nr 9
Rekurencja - ciąg Fibonacciego
0

Fn = 1
F + F
n−2
 n −1
dla n = 0
dla n = 1
dr inż. Jarosław Forenc
15/60
Informatyka 1, studia niestacjonarne I stopnia
Rok akademicki 2014/2015, Wykład nr 9
Rekurencja - algorytm Euklidesa
dla b = 0
a
NWD(a, b) = 
 NWD (b, a mod b) dla b ≥ 1
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);
}
int NWD(int a, int b)
{
if (b==0)
return a;
else
return NWD(b,a % b);
}
dr inż. Jarosław Forenc
16/60
Informatyka 1, studia niestacjonarne I stopnia
Rok akademicki 2014/2015, Wykład nr 9
dr inż. Jarosław Forenc
17/60
Złożoność obliczeniowa
Informatyka 1, studia niestacjonarne I stopnia
Rok akademicki 2014/2015, Wykład nr 9
dr inż. Jarosław Forenc
18/60
Złożoność obliczeniowa
W celu rozwiązania danego problemu obliczeniowego szukamy
algorytmu najbardziej efektywnego czyli:
najszybszego
Złożoność czasowa
Jej miarą jest liczba podstawowych operacji (dominujących)
Podstawowe operacje - porównanie, podstawienie, operacja
arytmetyczna
o możliwie małym zapotrzebowaniu na pamięć
Do oceny efektywności programu służy złożoność obliczeniowa
(koszt algorytmu)
Złożoność pamięciowa
Jest miarą wykorzystania pamięci (liczba komórek pamięci)
Złożoność obliczeniowa algorytmu:
jest ilością zasobów potrzebnych do jego działania (czas, pamięć)
jest funkcją rozmiaru danych, na których pracuje algorytm
Złożoność pesymistyczna
Odpowiada danym najbardziej 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
Informatyka 1, studia niestacjonarne I stopnia
Rok akademicki 2014/2015, Wykład nr 9
dr inż. Jarosław Forenc
19/60
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 liczbę elementów, na której działa algorytm
Do wyznaczenia złożoności bierze się pod uwagę liczbę
wykonywanych w algorytmie podstawowych operacji
Przykład:
O(n) - złożoność algorytmu jest prostą funkcją liczby elementów
(jeśli sortowanie 10.000 elementów zajmuje 5 s,
to sortowanie 20.000 elementów zajmie 10 s)
O(n2) - czas konieczny do wykonania algorytmu rośnie wraz
z kwadratem liczby elementów (przy podwojeniu liczby
elementów ich obsługa będzie trwała cztery razy dłużej)
Informatyka 1, studia niestacjonarne I stopnia
Rok akademicki 2014/2015, Wykład nr 9
dr inż. Jarosław Forenc
20/60
Notacja O („duże O”)
Porównanie najczęściej występujących złożoności:
Elementy
O(log n)
O(n)
O(n log n)
O(n2)
O(2n)
10
3
10
33
100
1024
100
7
100
664
10 000
1,27⋅1030
1 000
10
1 000
9 966
1 000 000
1,07⋅10301
10 000
13
10 000
132 877
100 000 000
1,99⋅103010
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(n2)
- złożoność kwadratowa
O(2n)
- złożoność wykładnicza
Informatyka 1, studia niestacjonarne I stopnia
Rok akademicki 2014/2015, Wykład nr 9
dr inż. Jarosław Forenc
21/60
Sortowanie
Informatyka 1, studia niestacjonarne I stopnia
Rok akademicki 2014/2015, Wykład nr 9
dr inż. Jarosław Forenc
22/60
Sortowanie
Sortowanie polega na uporządkowaniu zbioru danych względem
pewnych cech charakterystycznych każdego elementu tego zbioru
(wartości każdego elementu)
W przypadku liczb, sortowanie polega na znalezieniu kolejności
liczb zgodnej z relacją ≤ lub ≥
W przypadku słów sortowanie polega na ustawieniu ich
w porządku alfabetycznym (leksykograficznym)
Przykład:
Tablica nieposortowana:
Przykład:
Tablica nieposortowana:
Tablice posortowane:
Tablica posortowana zgodnie z relacją ≤
(od najmniejszej do największej liczby):
Tablica posortowana zgodnie z relacją ≥
(od największej do najmniejszej liczby):
Informatyka 1, studia niestacjonarne I stopnia
Rok akademicki 2014/2015, Wykład nr 9
dr inż. Jarosław Forenc
23/60
Sortowanie
W praktyce sortowanie sprowadza się do porządkowanie danych
na podstawie porównania - porównywany element to klucz
Przykład:
Tablica nieposortowana (imię, nazwisko, wiek):
Tablica posortowana (klucz - nazwisko):
Tablica posortowana (klucz - wiek):
Informatyka 1, studia niestacjonarne I stopnia
Rok akademicki 2014/2015, Wykład nr 9
dr inż. Jarosław Forenc
24/60
Sortowanie
Po co stosować sortowanie?
Posortowane elementy można szybciej zlokalizować
Posortowane elementy można przedstawić w czytelniejszy sposób
Klasyfikacje algorytmów sortowania
Złożoność obliczeniowa algorytmu - zależność liczby
wykonywanych operacji od liczebności sortowanego zbioru n
Złożoność pamięciowa - wielkość zasobów zajmowanych przez
algorytm (sortowanie w miejscu - wielkość zbioru danych podczas
sortowania nie zmienia się lub jest tylko nieco większa)
Sortowanie wewnętrzne (odbywa się w pamięci komputera)
i zewnętrzne (nie jest możliwe jednoczesne umieszczenie
wszystkich elementów zbioru sortowanego w pamięci komputera)
Informatyka 1, studia niestacjonarne I stopnia
Rok akademicki 2014/2015, Wykład nr 9
dr inż. Jarosław Forenc
25/60
Klasyfikacje algorytmów sortowania
Informatyka 1, studia niestacjonarne I stopnia
Rok akademicki 2014/2015, Wykład nr 9
dr inż. Jarosław Forenc
26/60
Proste wstawianie (insertion
(insertion sort)
Algorytm jest stabilny, jeśli podczas sortowania zachowuje
kolejność występowania elementów o tym samym kluczu
Przykład:
Funkcja w języku C:
void InsertionSort(int tab[])
{
int i,j,tmp;
Przykład:
Tablica nieposortowana (imię, nazwisko, wiek):
for (i=1; i<N; i++)
{
j=i;
tmp=tab[i];
while (tab[j-1]>tmp && j>0)
{
tab[j]=tab[j-1];
j--;
}
tab[j]=tmp;
}
Tablica posortowana algorytmem stabilnym (klucz - wiek):
Tablica posortowana algorytmem niestabilnym (klucz - wiek):
}
Informatyka 1, studia niestacjonarne I stopnia
Rok akademicki 2014/2015, Wykład nr 9
dr inż. Jarosław Forenc
27/60
Proste wstawianie (insertion
(insertion sort)
Złożoność algorytmu: O(n2)
+
+
+
+
+
wydajny dla danych wstępnie posortowanych
–
mała efektywność dla normalnej i dużej ilości danych.
wydajny dla zbiorów o niewielkiej liczebności
małe zasoby zajmowane podczas pracy (sortowanie w miejscu)
Informatyka 1, studia niestacjonarne I stopnia
Rok akademicki 2014/2015, Wykład nr 9
dr inż. Jarosław Forenc
28/60
Proste wybieranie (selection
(selection sort)
Przykład:
Funkcja w języku C:
void SelectionSort(int tab[])
{
int i,j,k,tmp;
for (i=0;i<N-1;i++)
{
k=i;
for (j=i+1; j<N; j++)
if (tab[k]>=tab[j])
k = j;
tmp = tab[i];
tab[i] = tab[k];
tab[k] = tmp;
}
stabilny
prosty w implementacji
}
Informatyka 1, studia niestacjonarne I stopnia
Rok akademicki 2014/2015, Wykład nr 9
dr inż. Jarosław Forenc
29/60
Proste wybieranie (selection
(selection sort)
Informatyka 1, studia niestacjonarne I stopnia
Rok akademicki 2014/2015, Wykład nr 9
dr inż. Jarosław Forenc
30/60
Bąbelkowe (bubble
(bubble sort)
Złożoność algorytmu: O(n2)
Sortowanie bąbelkowe (ang. bubble sort), nazywane jest także:
+
+
+
szybki w sortowaniu niewielkich tablic
sortowaniem pęcherzykowym
małe zasoby zajmowane podczas pracy (sortowanie w miejscu)
sortowaniem przez prostą zamianę (ang. straight exchange)
–
liczba porównań elementów jest niezależna od początkowego
rozmieszczenia elementów w tablicy
–
w algorytmie może zdarzyć się, że wykonywana jest zamiana
tego samego elementu ze sobą.
prosty w implementacji
Informatyka 1, studia niestacjonarne I stopnia
Rok akademicki 2014/2015, Wykład nr 9
Bąbelkowe (bubble
(bubble sort)
Metoda ta polega na porównywaniu dwóch kolejnych elementów
i zamianie ich kolejności jeśli jest to konieczne
dr inż. Jarosław Forenc
31/60
Nazwa metody wzięła się stąd, że kolejne porównania powodują
„wypychanie” kolejnego największego elementu na koniec
(„wypłynięcie największego bąbelka”)
Informatyka 1, studia niestacjonarne I stopnia
Rok akademicki 2014/2015, Wykład nr 9
Bąbelkowe (bubble
(bubble sort)
Funkcja w języku C:
void BubbleSort(int tab[])
{
int i,j,tmp,koniec;
do
{
koniec=0;
for (i=0;i<N-1;i++)
if (tab[i]>tab[i+1])
{
tmp=tab[i];
tab[i]=tab[i+1];
tab[i+1]=tmp;
koniec=1;
}
}
while (koniec);
}
dr inż. Jarosław Forenc
32/60
Informatyka 1, studia niestacjonarne I stopnia
Rok akademicki 2014/2015, Wykład nr 9
dr inż. Jarosław Forenc
33/60
Bąbelkowe (bubble
(bubble sort)
prosta realizacja
–
mała efektywność.
dr inż. Jarosław Forenc
34/60
Sortowanie szybkie (Quick
(Quick--Sort
Sort)) - faza dzielenia
Złożoność algorytmu: O(n2)
+
+
+
Informatyka 1, studia niestacjonarne I stopnia
Rok akademicki 2014/2015, Wykład nr 9
Tablica jest dzielona na dwie części wokół pewnego elementu x
(nazywanego elementem centralnym)
wysoka efektywność użycia pamięci (sortowanie w miejscu)
stabilny
Jako element centralny x najczęściej wybierany jest element
środkowy (choć może to być także element losowy)
Przeglądamy tablicę od lewej strony, aż znajdziemy element ai ≥ x,
a następnie przeglądamy tablicę od prawej strony, aż znajdziemy
element aj ≤ x
Zamieniamy elementy ai i aj miejscami i kontynuujemy proces
przeglądania i zamiany, aż nastąpi spotkanie w środku tablicy
W ten sposób otrzymujemy tablicę podzieloną na lewą część
z wartościami mniejszymi lub równymi x i na prawą część
z wartościami większymi lub równymi x
Informatyka 1, studia niestacjonarne I stopnia
Rok akademicki 2014/2015, Wykład nr 9
dr inż. Jarosław Forenc
35/60
Sortowanie szybkie (Quick
(Quick--Sort
Sort)) - faza sortowania
Zawiera dwa rekurencyjne wywołania tej samej funkcji sortowania:
dla lewej i dla prawej części posortowanej tablicy
Rekurencja zatrzymuje się, gdy wielkość tablicy wynosi 1
Przykład:
Sortujemy 6-elementową tablicę tab:
Wywołanie funkcji QS() ma postać:
QS(tab,0,5);
Informatyka 1, studia niestacjonarne I stopnia
Rok akademicki 2014/2015, Wykład nr 9
dr inż. Jarosław Forenc
36/60
Sortowanie szybkie (Quick
(Quick--Sort
Sort)) - QS(tab,0,5)
Element środkowy: (0+5)/2 = 2,
x = tab[2] = 5
Od lewej szukamy tab[i] ≥ x,
a od prawej szukamy tab[j] ≤ x,
zamieniamy elementy miejscami
Poszukiwania kończymy,
gdy indeksy i, j mijają się
Wywołujemy rekurencyjnie funkcję QS() dla elementów
z zakresów [l,j] i [i,r]:
QS(tab,0,3);
QS(tab,4,5);
Informatyka 1, studia niestacjonarne I stopnia
Rok akademicki 2014/2015, Wykład nr 9
dr inż. Jarosław Forenc
Informatyka 1, studia niestacjonarne I stopnia
Rok akademicki 2014/2015, Wykład nr 9
37/60
Sortowanie szybkie (Quick
(Quick--Sort
Sort)) - QS(tab,0,3)
Element środkowy: (0+3)/2 = 1,
Element środkowy: (2+3)/2 = 2,
0
1
2
3
1
2
4
3
i
38/60
Sortowanie szybkie (Quick
(Quick--Sort
Sort)) - QS(tab,2,3)
x = tab[1] = 2
Od lewej szukamy tab[i] ≥ x,
a od prawej szukamy tab[j] ≤ x,
zamieniamy elementy miejscami
dr inż. Jarosław Forenc
x = tab[2] = 3
Od lewej szukamy tab[i] ≥ x,
a od prawej szukamy tab[j] ≤ x,
zamieniamy elementy miejscami
j
zamiana
Poszukiwania kończymy,
gdy indeksy i, j mijają się
Poszukiwania kończymy,
gdy indeksy i, j mijają się
Wywołanie QS() tylko dla elementów z zakresu [2,3], gdyż
po lewej stronie rozmiar tablicy do posortowania wynosi 1:
Rozmiar obu tablic do posortowania wynosi 1 więc nie ma
nowych wywołań funkcji QS()
QS(tab,2,3);
Informatyka 1, studia niestacjonarne I stopnia
Rok akademicki 2014/2015, Wykład nr 9
dr inż. Jarosław Forenc
39/60
Sortowanie szybkie (Quick
(Quick--Sort
Sort)) - QS(tab,4,5)
Element środkowy: (4+5)/2 = 4,
x = tab[4] = 6
Od lewej szukamy tab[i] ≥ x,
a od prawej szukamy tab[j] ≤ x,
zamieniamy elementy miejscami
Informatyka 1, studia niestacjonarne I stopnia
Rok akademicki 2014/2015, Wykład nr 9
Sortowanie szybkie (Quick(Quick-Sort)
Funkcja w języku C:
void QuickSort(int tab[], int l, int r)
{
int i,j,x,y;
i=l;
j=r;
x=tab[(l+r)/2];
do
{
while (tab[i]<x) i++;
while (x<tab[j]) j--;
if (i<=j)
{
y=tab[i];
tab[i]=tab[j];
tab[j]=y;
i++; j--;
}
} while (i<=j);
if (l<j) QuickSort(tab,l,j);
if (i<r) QuickSort(tab,i,r);
Poszukiwania kończymy,
gdy indeksy i, j mijają się
Rozmiar obu tablic do posortowania wynosi 1 więc nie ma
nowych wywołań funkcji QS()
}
dr inż. Jarosław Forenc
40/60
Informatyka 1, studia niestacjonarne I stopnia
Rok akademicki 2014/2015, Wykład nr 9
dr inż. Jarosław Forenc
41/60
Funkcja qsort
qsort()
() w języku C
dr inż. Jarosław Forenc
42/60
Funkcja qsort() w języku C - przykład (1/2)
Quick-Sort został zaimplementowany w języku C w funkcji:
QSORT
stdlib.h
void qsort(void *baza, size_t n, size_t size,
(*funkcja)(const void *element1, const void *element2));
funkcja qsort() sortuje metodą Quick-Sort tablicę wskazywaną
przez argument baza 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 tablicy baza
funkcja() powinna zwracać wartości:
< 0,
gdy
*element1 < *element2
== 0, gdy
*element1 == *element2
> 0,
gdy
*element1 > *element2
Informatyka 1, studia niestacjonarne I stopnia
Rok akademicki 2014/2015, Wykład nr 9
Informatyka 1, studia niestacjonarne I stopnia
Rok akademicki 2014/2015, Wykład nr 9
dr inż. Jarosław Forenc
Funkcja qsort
qsort()
() w języku C - przykład (2/
(2/2
2)
43/60
#include
#include
#include
#define
<stdio.h>
<stdlib.h>
<time.h>
N 10
void generuj(int tab[])
{
int i;
srand(time(NULL));
for (i=0;i<N;i++)
tab[i]=rand()%100;
}
void drukuj(int tab[])
{
int i;
for (i=0;i<N;i++)
printf("%2d ",tab[i]);
printf("\n");
}
Informatyka 1, studia niestacjonarne I stopnia
Rok akademicki 2014/2015, Wykład nr 9
dr inż. Jarosław Forenc
44/60
Funkcja qsort
qsort()
() w języku C - przykład (2/
(2/2
2)
6
7
31
22
66
89
22
27
26
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 funkcja(const void *element1, const void *element2)
{
if (*(int*)element1 qsort:
< *(int*)element2) return -1;
7 22 22 26 27
31 0;
52 66
if (*(int*)element1 6== *(int*)element2)
return
if (*(int*)element1 > *(int*)element2) return 1;
}
int main()
{
int tab[N];
int main()
{
int tab[N];
}
generuj(tab);
drukuj(tab);
generuj(tab);
drukuj(tab);
printf("\nqsort:\n");
qsort((void*)tab,(size_t)N,sizeof(int),funkcja);
drukuj(tab);
printf("\nqsort:\n");
qsort((void*)tab,(size_t)N,sizeof(int),funkcja);
drukuj(tab);
system("PAUSE");
return (0);
system("PAUSE");
return (0);
}
52
89
Informatyka 1, studia niestacjonarne I stopnia
Rok akademicki 2014/2015, Wykład nr 9
dr inż. Jarosław Forenc
45/60
Mnożenie macierzy
c13 
c23  = N
c33 
N
(i)
 a11 a12
a
 21 a22
 a31 a32
a13  b11 b12
a23  ⋅ b21 b22
a33  b31 b32
M
K
K
c11 = a11b11 + a12b21 + a13b31
b13 
b23 
b33 
M
c13 = a11b13 + a12b23 + a13b33
c21 = a21b11 + a22b21 + a23b31
c22 = a21b12 + a22b22 + a23b32
c23 = a21b13 + a22b23 + a23b33
c31 = a31b11 + a32b21 + a33b31
c32 = a31b12 + a32b22 + a33b32
c33 = a31b13 + a32b23 + a33b33
Informatyka 1, studia niestacjonarne I stopnia
Rok akademicki 2014/2015, Wykład nr 9
dr inż. Jarosław Forenc
47/60
Mnożenie macierzy - metoda Strassena
załóżmy, że macierze są kwadratowe n × n i n jest potęgą liczby 2
dzielimy każdą macierz A, B, C na cztery podmacierze o rozmiarach
n/2 × n/2
B12 
Β
B =  11
,
 B 21 B 22 
C12 
C
C =  11

 C21 C22 
obliczamy niezależnie każdą z podmacierzy Cij korzystając ze wzoru:
Cij = A i1 ⋅ B1 j + A i 2 ⋅ B 2 j , i, j = 1,2
jedno mnożenie macierzy A ⋅ B zastępowane jest zatem ośmioma
mnożeniami macierzy Aij ⋅ Bij
koszt obliczeniowy powyższego algorytmu
jest taki sam jak algorytmu standardowego:
 c11 c12
c
 21 c22
 c31 c32
c13 
c23  = N
(i)
c33 
 a11 a12
a
 21 a22
 a31 a32
K (k)
a13  b11 b12
a23  ⋅ b21 b22
a33  b31 b32
b13 
b23 
b33 
M
(j)
K (k)
M (j)
Program w języku C:
c12 = a11b12 + a12b22 + a13b32
A12 
A
A =  11
,
 A 21 A 22 
46/60
Operacja: C = A ⋅ B (A[N][M], B[M][K], C[N][K])
A[N][M] - macierz N×M - elementowa
B[M][K] - macierz M×K - elementowa
C[N][K] - macierz N×K - elementowa
N
dr inż. Jarosław Forenc
Mnożenie macierzy
Operacja: C = A ⋅ B
 c11 c12
c
 21 c22
 c31 c32
Informatyka 1, studia niestacjonarne I stopnia
Rok akademicki 2014/2015, Wykład nr 9
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
cik = ∑ aij ⋅ b jk ,
j =1
i = 1,2, K, N
k = 1,2,K, K
Koszt algorytmu: O (n 3 )
Informatyka 1, studia niestacjonarne I stopnia
Rok akademicki 2014/2015, Wykład nr 9
dr inż. Jarosław Forenc
48/60
Mnożenie macierzy - metoda Strassena
pomysłem na przyspieszenie algorytmu jest zmniejszenie liczby mnożeń
podmacierzy z ośmiu do siedmiu
obliczamy 7 pomocniczych macierzy mi o rozmiarze n/2 × n/2:
m1 = ( A12 − A 22 ) ⋅ (B 21 + B 22 )
m 2 = ( A11 + A 22 ) ⋅ (B11 + B 22 )
m 3 = ( A11 − A 21 ) ⋅ (B11 + B12 )
m 4 = ( A11 + A12 ) ⋅ B 22
m 5 = A11 ⋅ (B12 − B 22 )
m 6 = A 22 ⋅ (B 21 − B11 )
m 7 = ( A 21 + A 22 ) ⋅ B11
obliczamy składowe Cij macierzy wynikowej C:
C11 = m1 + m 2 − m 4 + m 6
C12 = m 4 + m 5
O(n3 )
koszt powyższego algorytmu wynosi:
C21 = m 6 + m 7
C22 = m 2 − m 3 + m 5 − m 7
O (n log 2 7 ) = O (n 2,808 )
Informatyka 1, studia niestacjonarne I stopnia
Rok akademicki 2014/2015, Wykład nr 9
dr inż. Jarosław Forenc
49/60
Mnożenie macierzy
Informatyka 1, studia niestacjonarne I stopnia
Rok akademicki 2014/2015, Wykład nr 9
dr inż. Jarosław Forenc
50/60
Mnożenie macierzy
na szybkość wykonywania obliczeń wpływa nie tylko liczba operacji
zmiennoprzecinkowych, ale także sposób pobierania danych z pamięci
komputera
rozpatrzmy dwa algorytmy mnożenia macierzy:
Algorytm nr 1
obecne systemy komputerowe mają hierarchiczną budowę pamięci:
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];
rejestry procesora
pamięć podręczna (cache)
pamięć operacyjna
pamięć zewnętrzna
2048 × 2048
procesor:
Intel Core i5-2410M
2,30 GHz
kompilator: Microsoft Visual C++
2008 Standard Edition
Algorytm nr 1:
Algorytm nr 2
obliczenia są efektywnie wykonywane, gdy odbywają się
na zmiennych znajdujących się w jak najszybszej pamięci
macierze:
bez optymalizacji: 268,021 [s]
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];
z optymalizacją:
Algorytm nr 2:
bez optymalizacji:
z optymalizacją:
Informatyka 1, studia niestacjonarne I stopnia
Rok akademicki 2014/2015, Wykład nr 9
dr inż. Jarosław Forenc
51/60
Mnożenie macierzy
Informatyka 1, studia niestacjonarne I stopnia
Rok akademicki 2014/2015, Wykład nr 9
49,409 [s]
6,270 [s]
dr inż. Jarosław Forenc
52/60
Mnożenie macierzy
Metoda przechowywania macierzy w pamięci liniowej
Algorytm nr 1
M
C
A
B
C
A
B
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];
[0][0] [0][1] [0][2] [0][3]
N
92,053 [s]
[1][0] [1][1] [1][2] [1][3]
[2][0] [2][1] [2][2] [2][3]
macierz w pamięci liniowej (wektor)
Algorytm nr 2
macierz
Pamięć podręczna (cache memory)
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];
[0][0] [0][1] [0][2] [0][3]
[1][0] [1][1] [1][2] [1][3]
[2][0] [2][1] [2][2] [2][3]
Informatyka 1, studia niestacjonarne I stopnia
Rok akademicki 2014/2015, Wykład nr 9
dr inż. Jarosław Forenc
53/60
Biblioteka numeryczna BLAS
Informatyka 1, studia niestacjonarne I stopnia
Rok akademicki 2014/2015, Wykład nr 9
dr inż. Jarosław Forenc
54/60
Biblioteka numeryczna BLAS
BLAS - Basic Linear Algebra Subprograms
Wyróżnia się 3 poziomy abstrakcji algorytmów BLAS
Zbiór procedur służących do wykonywania operacji
na podstawowych obiektach algebry liniowej:
BLAS Level 1
skalarach
operacje typu wektor-wektor (dodawanie wektorów,
normy wektora, iloczyn skalarny wektorów)
wektorach
y ← αx + y
macierzach
BLAS Level 2
Strona główna: http://www.netlib.org/blas
operacje typu macierz-wektor (mnożenie macierzy przez wektor)
Rok publikacji: 1979
y ← αAx + y
Oryginalnie napisana w języku Fortran 77
BLAS Level 3
Obsługuje liczby:
rzeczywiste pojedynczej i podwójnej precyzji
operacje typu macierz-macierz (mnożenie macierzy przez macierz)
zespolone pojedynczej i podwójnej precyzji
C ← αA ⋅ B + C
Informatyka 1, studia niestacjonarne I stopnia
Rok akademicki 2014/2015, Wykład nr 9
dr inż. Jarosław Forenc
55/60
BLAS - Nazwy procedur
DGEMV - mnożenie macierzy przez wektor, macierz i wektor
zawierają liczby rzeczywiste podwójnej precyzji
y ← α ⋅ A ⋅ x + β ⋅ y lub y ← α ⋅ AT ⋅ x + β ⋅ y
SGEMM - mnożenie macierzy przez macierz, macierze zawierają
liczby rzeczywiste pojedynczej precyzji
y ← α ⋅ op( A) ⋅ op(B) + β ⋅ C
op( X) = X, op( X) = XT , op( X) = conjg ( XT )
SSWAP - zamiana wektorów zawierających liczby rzeczywiste
pojedynczej precyzji
x↔y
Informatyka 1, studia niestacjonarne I stopnia
Rok akademicki 2014/2015, Wykład nr 9
dr inż. Jarosław Forenc
56/60
BLAS - Implementacje
Strona główna: http://www.netlib.org/blas
Strona główna zawiera niezoptymalizowaną bibliotekę BLAS
MKL (Intel)
Intel Math Kernel Library (Intel MKL) v11
https://software.intel.com/en-us/intel-mkl
ACML (AMD)
AMD Core Math Library
http://developer.amd.com/tools-and-sdks/cpu-development/amd-coremath-library-acml/
ATLAS (open source)
Automatically Tuned Linear Algebra Software
http://math-atlas.sourceforge.net/
Informatyka 1, studia niestacjonarne I stopnia
Rok akademicki 2014/2015, Wykład nr 9
dr inż. Jarosław Forenc
57/60
GPGPU i CUDA
Informatyka 1, studia niestacjonarne I stopnia
Rok akademicki 2014/2015, Wykład nr 9
dr inż. Jarosław Forenc
58/60
CUDA - Jak używać
używać??
GPGPU - General Purpose computing on Graphics Processing Units
Sprawdzić czy karta graficzna w komputerze obsługuje CUDA
wszystkie nowe karty graficzne NVIDIA są kompatybilne z CUDA
CUDA (Compute Unified Device Architecture)
Ściągnąć oprogramowanie CUDA (CUDA 7.0)
hardware - równoległa architektura obliczeniowa GPU
software - kompilator nvcc, biblioteki i inne narrzędzia
Network Installer - 8 MB
Local Installer - 939 MB
NVIDIA Corporation (USA)
Pierwsza wersja: luty 2007
Zainstalować oprogramowanie CUDA
Strona: http://www.nvidia.pl/object/cuda-parallel-computing-pl.html
Użyć szablonu (template project) do stworzenia własnego
programu wykorzystującego CUDA
Strona: https://developer.nvidia.com/cuda-zone
Licencja: freeware
Informatyka 1, studia niestacjonarne I stopnia
Rok akademicki 2014/2015, Wykład nr 9
dr inż. Jarosław Forenc
59/60
CUBLAS
Informatyka 1, studia niestacjonarne I stopnia
Rok akademicki 2014/2015, Wykład nr 9
dr inż. Jarosław Forenc
Koniec wykładu nr 9
Biblioteka CUBLAS - implementacja BLAS (Basic Linear Algebra
Subprograms) dla kart graficznych NVIDIA i środowiska CUDA
Zastosowanie CUBLAS (wersja 5.5) w programie wymaga:
inicjalizacji biblioteki CUBLAS: cublasCreate()
przydzielenia pamięci GPU na macierze: cudaMalloc ()
przesłania macierzy o pamięci GPU: cublasSetMatrix()
wywołania odpowiednich funkcji CUBLAS: cublasSgemm()
przesłania wyników obliczeń z pamięci GPU do pamięci RAM
komputera: cublasGetMatrix()
zwolnienia pamięci GPU: cudaFree()
zakończenia pracy biblioteki CUBLAS: cublasDestroy()
Dziękuję za uwagę!
60/60