Informtyk 1, studi stjonrne I stopni Rok kdemiki 20/2014, Wykłd nr 7 2/27 Pln wykłdu nr 7 Informtyk 1 Politehnik Biłostok - Wydził Elektryzny Elektrotehnik, semestr II, studi stjonrne I stopni Rok kdemiki 20/2014 Sortownie Quik Sort nożenie mierzy iliotek BLAS środowisko CUDA Wykłd nr 7 (09.06.2014) Informtyk 1, studi stjonrne I stopni Rok kdemiki 20/2014, Wykłd nr 7 3/27 Informtyk 1, studi stjonrne I stopni Rok kdemiki 20/2014, Wykłd nr 7 4/27 Sortownie szykie (Quik-Sort) - fz dzieleni Tli jest dzielon n dwie zęśi wokół pewnego elementu x (nzywnego elementem entrlnym) Jko element entrlny x njzęśiej wyierny jest element środkowy (hoć może to yć tkże element losowy) Przeglądmy tlię od lewej strony, ż znjdziemy element i x, nstępnie przeglądmy tlię od prwej strony, ż znjdziemy element j x Zmienimy elementy i i j miejsmi i kontynuujemy proes przeglądni i zminy, ż nstąpi spotknie w środku tliy W ten sposó otrzymujemy tlię podzieloną n lewą zęść z wrtośimi mniejszymi lu równymi x i n prwą zęść z wrtośimi większymi lu równymi x Sortownie szykie (Quik-Sort) - fz sortowni Zwier dw rekurenyjne wywołni tej smej funkji sortowni: dl lewej i dl prwej zęśi posortownej tliy Rekurenj ztrzymuje się, gdy wielkość tliy wynosi 1 Przykłd: Sortujemy 6-elementową tlię t: Wywołnie funkji QS() m postć: QS(t,0,5);
Informtyk 1, studi stjonrne I stopni Rok kdemiki 20/2014, Wykłd nr 7 5/27 Informtyk 1, studi stjonrne I stopni Rok kdemiki 20/2014, Wykłd nr 7 6/27 Sortownie szykie (Quik-Sort) - QS(t,0,5) Element środkowy: (0+5)/2 = 2, x = t[2] = 5 Sortownie szykie (Quik-Sort) - QS(t,0,3) Element środkowy: (0+3)/2 = 1, x = t[1] = 2 Od lewej szukmy t[i] x, od prwej szukmy t[j] x, zmienimy elementy miejsmi Od lewej szukmy t[i] x, od prwej szukmy t[j] x, zmienimy elementy miejsmi 0 1 2 3 1 2 4 3 i j zmin Poszukiwni końzymy, gdy indeksy i, j mijją się Poszukiwni końzymy, gdy indeksy i, j mijją się Wywołujemy rekurenyjnie funkję QS() dl elementów z zkresów [l,j] i [i,r]: Wywołnie QS() tylko dl elementów z zkresu [2,3], gdyż po lewej stronie rozmir tliy do posortowni wynosi 1: QS(t,0,3); QS(t,4,5); QS(t,2,3); Informtyk 1, studi stjonrne I stopni Rok kdemiki 20/2014, Wykłd nr 7 7/27 Informtyk 1, studi stjonrne I stopni Rok kdemiki 20/2014, Wykłd nr 7 8/27 Sortownie szykie (Quik-Sort) - QS(t,2,3) Element środkowy: (2+3)/2 = 2, x = t[2] = 3 Od lewej szukmy t[i] x, od prwej szukmy t[j] x, zmienimy elementy miejsmi Sortownie szykie (Quik-Sort) - QS(t,4,5) Element środkowy: (4+5)/2 = 4, x = t[4] = 6 Od lewej szukmy t[i] x, od prwej szukmy t[j] x, zmienimy elementy miejsmi Poszukiwni końzymy, gdy indeksy i, j mijją się Poszukiwni końzymy, gdy indeksy i, j mijją się Rozmir ou tli do posortowni wynosi 1 wię nie m nowyh wywołń funkji QS() Rozmir ou tli do posortowni wynosi 1 wię nie m nowyh wywołń funkji QS()
Informtyk 1, studi stjonrne I stopni Rok kdemiki 20/2014, Wykłd nr 7 9/27 Informtyk 1, studi stjonrne I stopni Rok kdemiki 20/2014, Wykłd nr 7 10/27 Sortownie szykie (Quik-Sort) Funkj qsort() w języku C Funkj w języku C: Quik-Sort zostł zimplementowny w języku C w funkji: void QuikSort(int t[], int l, int r) int i,j,x,y; i=l; j=r; x=t[(l+r)/2]; do while (t[i]<x) i++; while (x<t[j]) j--; if (i<=j) y=t[i]; t[i]=t[j]; t[j]=y; i++; j--; while (i<=j); if (l<j) QuikSort(t,l,j); if (i<r) QuikSort(t,i,r); QSORT stdli.h void qsort(void *z, size_t n, size_t size, (*funkj)(onst void *element1, onst void *element2)); funkj qsort() sortuje metodą Quik-Sort tlię wskzywną przez rgument z i zwierjąą n elementów o rozmirze size funkj qsort() posługuje się funkją porównująą funkj(), której rgumentmi są wskzni do elementów tliy z funkj() powinn zwrć wrtośi: < 0, gdy *element1 < *element2 == 0, gdy *element1 == *element2 > 0, gdy *element1 > *element2 Informtyk 1, studi stjonrne I stopni Rok kdemiki 20/2014, Wykłd nr 7 /27 Informtyk 1, studi stjonrne I stopni Rok kdemiki 20/2014, Wykłd nr 7 /27 Funkj qsort() w języku C - przykłd (1/2) Funkj qsort() w języku C - przykłd (2/2) #inlude <stdio.h> #inlude <stdli.h> #inlude <time.h> #define 10 void generuj(int t[]) int i; srnd(time(ull)); for (i=0;i<;i++) t[i]=rnd()%100; void drukuj(int t[]) int i; for (i=0;i<;i++) printf("%2d ",t[i]); printf("\n"); int funkj(onst void *element1, onst void *element2) if (*(int*)element1 < *(int*)element2) return -1; if (*(int*)element1 == *(int*)element2) return 0; if (*(int*)element1 > *(int*)element2) return 1; int min() int t[]; generuj(t); drukuj(t); printf("\nqsort:\n"); qsort((void*)t,(size_t),sizeof(int),funkj); drukuj(t); system("pause"); return (0);
Informtyk 1, studi stjonrne I stopni Rok kdemiki 20/2014, Wykłd nr 7 /27 Informtyk 1, studi stjonrne I stopni Rok kdemiki 20/2014, Wykłd nr 7 14/27 Funkj qsort() w języku C - przykłd (2/2) 6 7 66 89 27 26 52 int funkj(onst void *element1, onst void *element2) if (*(int*)element1 qsort: < *(int*)element2) return -1; if (*(int*)element16== *(int*)element2) 7 26 27 return 0; 52 66 89 if (*(int*)element1 > *(int*)element2) return 1; int min() int t[]; generuj(t); drukuj(t); printf("\nqsort:\n"); qsort((void*)t,(size_t),sizeof(int),funkj); drukuj(t); system("pause"); return (0); nożenie mierzy przez mierz = = = Operj: C = A B A[][] - mierz - elementow B[][K] - mierz K - elementow C[][K] - mierz K - elementow K 23 33 23 33 = = = = 23 33 23 33 23 33 K = = = 23 33 23 23 23 33 23 33 33 33 Informtyk 1, studi stjonrne I stopni Rok kdemiki 20/2014, Wykłd nr 7 15/27 Informtyk 1, studi stjonrne I stopni Rok kdemiki 20/2014, Wykłd nr 7 16/27 nożenie mierzy przez mierz nożenie mierzy przez mierz (i) Operj: C = A B (A[][],B[][K],C[][K]) = (i) 23 23 23 33 33 33 K (k) Progrm w języku C: for (k=0; k<k; k++) C[i][k] = 0.0; for (j=0; j<; j++) C[i][k] += A[i][j] * B[j][k]; (j) ik = j= K (k) (j) i = 1,2, K, ij jk, 1 k = 1,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
Informtyk 1, studi stjonrne I stopni Rok kdemiki 20/2014, Wykłd nr 7 17/27 Informtyk 1, studi stjonrne I stopni Rok kdemiki 20/2014, Wykłd nr 7 18/27 nożenie mierzy przez mierz nożenie mierzy przez mierz rozptrzmy dw lgorytmy mnożeni mierzy: Algorytm nr 1 for (k=0; k<; k++) for (j=0; j<; j++) C[i][k] += A[i][j]*B[j][k]; Algorytm nr 2 for (j=0; j<; j++) for (k=0; k<; k++) C[i][k] += A[i][j]*B[j][k]; mierze: 2048 2048 proesor: Intel Core i5-2410 2,30 GHz kompiltor: irosoft Visul C++ 2008 Stndrd Edition Algorytm nr 1: ez optymlizji: 268,0 [s] z optymlizją: 92,053 [s] Algorytm nr 2: ez optymlizji: 49,409 [s] z optymlizją: 6,270 [s] etod przehowywni mierzy w pmięi liniowej [0][0] [0][1] [0][2] [0][3] [1][0] [1][1] [1][2] [1][3] [2][0] [2][1] [2][2] [2][3] mierz w pmięi liniowej (wektor) mierz Pmięć podręzn (he memory) Informtyk 1, studi stjonrne I stopni Rok kdemiki 20/2014, Wykłd nr 7 19/27 Informtyk 1, studi stjonrne I stopni Rok kdemiki 20/2014, Wykłd nr 7 20/27 nożenie mierzy przez mierz Biliotek numeryzn BLAS Algorytm nr 1 for (k=0; k<k; k++) for (j=0; j<; j++) C[i][k] += A[i][j] * B[j][k]; Algorytm nr 2 for (j=0; j<; 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] C A B C A B 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: 1979 Oryginlnie npisn w języku Fortrn 77 Osługuje lizy: rzezywiste pojedynzej i podwójnej preyzji zespolone pojedynzej i podwójnej preyzji
Informtyk 1, studi stjonrne I stopni Rok kdemiki 20/2014, Wykłd nr 7 /27 Informtyk 1, studi stjonrne I stopni Rok kdemiki 20/2014, Wykłd nr 7 /27 Biliotek numeryzn BLAS BLAS - zwy proedur Wyróżni się 3 poziomy strkji lgorytmów BLAS BLAS Level 1 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 DGEV - mnożenie mierzy przez wektor, mierz i wektor zwierją lizy rzezywiste podwójnej preyzji y α A x + β y lu y α A x + β y SGE - 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 T ) Informtyk 1, studi stjonrne I stopni Rok kdemiki 20/2014, Wykłd nr 7 23/27 Informtyk 1, studi stjonrne I stopni Rok kdemiki 20/2014, Wykłd nr 7 24/27 BLAS - Implementje GPGPU i CUDA Stron główn: http://www.netli.org/ls Stron główn zwier niezoptymlizowną iliotekę BLAS KL (Intel) Intel th Kernel Lirry (Intel KL) v http://softwre.intel.om/en-us/intel-mkl ACL (AD) AD Core th Lirry http://developer.md.om/tools-nd-sdks/pu-development/ pu-lirries/md-ore-mth-lirry-ml/ ATLAS (open soure) Automtilly Tuned Liner Alger Softwre http://mth-tls.soureforge.net/ 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 VIDIA Corportion (USA) Pierwsz wersj: luty 2007 Stron WWW: http://www.nvidi.pl/ojet/ud_home_new_pl.html Lienj: freewre
Informtyk 1, studi stjonrne I stopni Rok kdemiki 20/2014, Wykłd nr 7 25/27 Informtyk 1, studi stjonrne I stopni Rok kdemiki 20/2014, Wykłd nr 7 26/27 CUDA - Jk używć? CUBLAS Wymgni: krt grfizn firmy VIDIA osługują CUDA system operyjny: Windows XP, Vist, 7, 8, Server 2003 lu 2008 oprogrmownie VIDIA CUDA Toolkit irosoft Visul Studio 2008, 2010 lu 20 Biliotek CUBLAS - implementj BLAS (Bsi Liner Alger Suprogrms) dl krt grfiznyh VIDIA i środowisk CUDA Zstosownie CUBLAS w progrmie wymg: inijlizji ilioteki CUBLAS: ulscrete() przydzieleni pmięi GPU n mierze i wektory: udllo() Instlj: sprwdzić zy krt grfizn w komputerze osługuje CUDA - wszystkie nowe krty grfizne VIDIA są komptyilne z CUDA śiągnąć oprogrmownie The VIDIA CUDA Toolkit zinstlowć The VIDIA CUDA Toolkit przesłni mierzy i wektorów do pmięi GPU: ulssettrix() wywołni odpowiednih funkji CUBLAS: ulssgemm() przesłni wyników olizeń z pmięi GPU do pmięi RA komputer: ulsgettrix() zwolnieni pmięi GPU: udfree() Pisnie włsnyh progrmów: zkońzeni pry ilioteki CUBLAS: ulsdestroy() zstosowć w Visul Studio projekt: ew Projet VIDIA CUDA 5.5 CUDA 5.5 Runtime Informtyk 1, studi stjonrne I stopni Rok kdemiki 20/2014, Wykłd nr 7 27/27 Konie wykłdu nr 7 Dziękuję z uwgę!