MN06LAB: Różnice pomiędzy wersjami
m MN Ćwiczenia 6 moved to MN06LAB |
mNie podano opisu zmian |
||
Linia 1: | Linia 1: | ||
<!-- | <!-- | ||
Konwertowane z pliku LaTeX przez latex2mediawiki, zob. http://www.ii.uj.edu.pl/ pawlik1/latex2mediawiki.php | Konwertowane z pliku LaTeX przez latex2mediawiki, zob. http://www.ii.uj.edu.pl/ pawlik1/latex2mediawiki.php. | ||
Niezb�dne rozszerzenia i modyfikacje oryginalnego latex2mediawiki | |||
wprowadzi� przykry@mimuw.edu.pl | |||
--> | --> | ||
= | =BLAS, LAPACK, pamięć podręczna= | ||
{{powrot |Metody numeryczne | do strony głównej | |||
przedmiotu <strong>Metody numeryczne</strong>}} | |||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
Oglądaj wskazówki i rozwiązania __SHOWALL__<br> | |||
Ukryj wskazówki i rozwiązania __HIDEALL__ | |||
</div> | |||
Warto w tym momencie wrócić także do zadań z poprzedniego wykładu, wymagających wykorzystania BLASów i LAPACKa. | |||
<div style="margin-top:1em; padding-top,padding-bottom:1em;"> | |||
<span style="display: block; background-color:#fefeee; border-bottom: 1px solid #E5E5E5; line-height: 1.1em; padding-bottom: 0.2em; font-variant:small-caps; color:#1A6ABF;">Ćwiczenie: Nie tylko ATLAS</span> | |||
<div class="exercise"> | |||
Jeśli korzystasz z komputera z procesorem Intela lub AMD, masz możliwość sięgnięcia po procedury matematyczne zoptymalizowane właśnie na te architektury, zgromadzone w bibliotekach, odpowiednio, MKL i ACML. Spróbuj przeprowadzić testy wydajnościowe procedury mnożenia dwóch macierzy za pomocą takiej biblioteki w porównaniu do ATLASa dla Twojej architektury. | |||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka </span><div class="mw-collapsible-content" style="display:none"> | |||
<div style="font-size:smaller; background-color:#f9fff9; padding: 1em"> Dokładnie przeczytaj manual i sprawdź, jakiego ułożenia macierzy w pamięci żądają te biblioteki! </div> | |||
</div></div> | |||
</div></div> | |||
<div style="margin-top:1em; padding-top,padding-bottom:1em;"> | |||
<span style="display: block; background-color:#fefeee; border-bottom: 1px solid #E5E5E5; line-height: 1.1em; padding-bottom: 0.2em; font-variant:small-caps; color:#1A6ABF;">Ćwiczenie: Szybkie mnożenie macierzy przez wektor</span> | |||
<div class="exercise"> | |||
Zaimplementuj samodzielnie algorytm mnożenia macierzy kwadratowej przez wektor: | |||
<center><math>\displaystyle | |||
y_i = \sum_{j=1}^N a_{ij}x_j | |||
</math></center> | |||
i zbadaj czas jego działania. Następnie wykonaj to samo przy użyciu procedury BLAS (jakiej?). Sprawdź, na losowym wektorze i losowej macierzy, że w obu przypadkach dostajesz ten sam wynik. Jeśli jest taka potrzeba, spróbuj wprowadzić kilka optymalizacji do swojego kodu. | |||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka </span><div class="mw-collapsible-content" style="display:none"> | |||
<div style="font-size:smaller; background-color:#f9fff9; padding: 1em"> Procedura BLAS, której potrzebujesz, to <code style="color: #903">DGEMV</code>. </div> | |||
</div></div> | |||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka </span><div class="mw-collapsible-content" style="display:none"> | |||
<div style="font-size:smaller; background-color:#f9fff9; padding: 1em"> Pamiętaj, fortranowski BLAS oczekuje, że macierz będzie zadana kolumnami! </div> | |||
</div></div> | |||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka </span><div class="mw-collapsible-content" style="display:none"> | |||
<div style="font-size:smaller; background-color:#f9fff9; padding: 1em"> Na pewno masz bardzo szybki komputer... Będziesz musiał mierzyć czasy dla macierzy dostatecznie dużego wymiaru! </div> | |||
</div></div> | |||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka </span><div class="mw-collapsible-content" style="display:none"> | |||
<div style="font-size:smaller; background-color:#f9fff9; padding: 1em"> Sam kompilator może znacznie wspomóc szybkość twojego programu, dokonując samodzielnie pewnych optymalizacji. Jedną z nich może być opcja powodująca automatyczne rozwijanie pętli, <code>gcc -funroll-loops test.c</code>. Warto więc chyba zbadać dokładniej odpowiedni rozdział manuala twojego kompilatora, dotyczący | |||
* opcji optymalizacyjnych dla obliczeń zmiennoprzecinkowych, | |||
* opcji optymalizacyjnych specyficznych dla architektury twojego komputera (np. automatyczna wektoryzacja pętli). | |||
</div> | |||
</div></div> | |||
</div></div> | |||
<div style="margin-top:1em; padding-top,padding-bottom:1em;"> | |||
<span style="display: block; background-color:#fefeee; border-bottom: 1px solid #E5E5E5; line-height: 1.1em; padding-bottom: 0.2em; font-variant:small-caps; color:#1A6ABF;">Ćwiczenie: Strassen kontra <code style="color: #903">DGEMM</code></span> | |||
<div class="exercise"> | |||
Zaimplementuj algorytm Strassena mnożenia dwóch macierzy i porównaj czas jego działania z czasem działania procedury <code style="color: #903">DGEMM</code>, najlepiej zoptymalizowanej na Twoją architekturę. | |||
testuj dla macierzy wymiaru <math>\displaystyle 2^k</math>, gdzie <math>\displaystyle k=0,\ldots,11</math>. | |||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka </span><div class="mw-collapsible-content" style="display:none"> | |||
<div style="font-size:smaller; background-color:#f9fff9; padding: 1em"> Może warto spróbować wariant hybrydowy metody Strassena, gdzie dostatecznie małe bloki macierzy mnożone są już procedurą <code style="color: #903">DGEMM</code> </div> | |||
</div></div> | |||
Opis algorytmu Strassena znajdziesz np. w rozdziale 28 klasycznego podręcznika | |||
* <span style="font-variant:small-caps">T. H. Cormen, C. E. Leiserson, R. L. Rivest, C. Stein</span>, <cite>Wprowadzenie do algorytmów</cite>, Wydawnictwa Naukowo-Techniczne, Warszawa, 2005, ISBN 83-204-3149-2. | |||
</div></div> | |||
<div style="margin-top:1em; padding-top,padding-bottom:1em;"> | |||
<span style="display: block; background-color:#fefeee; border-bottom: 1px solid #E5E5E5; line-height: 1.1em; padding-bottom: 0.2em; font-variant:small-caps; color:#1A6ABF;">Ćwiczenie: Czy Twoje programy działają <strong>naprawdę</strong> szybko?</span> | |||
<div class="exercise"> | |||
Rozwiąż układ równań liniowych <math>\displaystyle Ax=b</math> programując, niczym [http://www.gajdaw.pl/wiersze/julian_tuwim/zosia_samosia.html Zosia-Samosia], wszystko od początku do końca w czystym C (a może wolałbyś w Pythonie?!). Porównaj czasy działania twojego programu i programu wywołującego po prostu procedurę biblioteczną LAPACKa | |||
<code style="color: #903">DGESV</code>, najlepiej wspartą dobrze podrasowanymi BLASami. | |||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka </span><div class="mw-collapsible-content" style="display:none"> | |||
<div style="font-size:smaller; background-color:#f9fff9; padding: 1em"> To zadanie to wyzwanie! </div> | |||
</div></div> | |||
</div></div> | |||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie </span><div class="mw-collapsible-content" style="display:none"><div style="margin-left:1em"> | |||
No tak, namawiamy cię do zmierzenia się z LAPACKiem i ATLASem.... | |||
Prościutki program --- po prostu tłumaczący [[MN05#Rozkład LU metodą eliminacji Gaussa|algorytm z wykładu]] bezpośrednio | |||
na C --- u nas spisał | |||
się (dla macierzy wymiaru <math>\displaystyle N=1\ldots 1024</math>) następująco: | |||
[[Image:MNdegsvtiming.png|thumb|550px|center|Prosty solver w C kontra LAPACK i LAPACK z ATLASem. Zwróć uwagę na piki zwykłego kodu dla <math>\displaystyle N</math> będących potęgami dwójki]] | |||
[[Image:MNdegsvtiminglogscale.png|thumb|550px|center|Skala logarytmiczna pozwala lepiej ocenić różnice pomiędzy czasami wykonania. Prosty program w C jest około dziesięć razy wolniejszy od kodu korzystającego z LAPACKa i około <strong>50 razy wolniejszy</strong> od kodu korzystającego z LAPACKa i ATLASa.]] | |||
</div></div></div> |
Wersja z 21:13, 29 wrz 2006
BLAS, LAPACK, pamięć podręczna
<<< Powrót do strony głównej przedmiotu Metody numeryczne
Oglądaj wskazówki i rozwiązania __SHOWALL__
Ukryj wskazówki i rozwiązania __HIDEALL__
Warto w tym momencie wrócić także do zadań z poprzedniego wykładu, wymagających wykorzystania BLASów i LAPACKa.
Ćwiczenie: Nie tylko ATLAS
Jeśli korzystasz z komputera z procesorem Intela lub AMD, masz możliwość sięgnięcia po procedury matematyczne zoptymalizowane właśnie na te architektury, zgromadzone w bibliotekach, odpowiednio, MKL i ACML. Spróbuj przeprowadzić testy wydajnościowe procedury mnożenia dwóch macierzy za pomocą takiej biblioteki w porównaniu do ATLASa dla Twojej architektury.
Ćwiczenie: Szybkie mnożenie macierzy przez wektor
Zaimplementuj samodzielnie algorytm mnożenia macierzy kwadratowej przez wektor:
i zbadaj czas jego działania. Następnie wykonaj to samo przy użyciu procedury BLAS (jakiej?). Sprawdź, na losowym wektorze i losowej macierzy, że w obu przypadkach dostajesz ten sam wynik. Jeśli jest taka potrzeba, spróbuj wprowadzić kilka optymalizacji do swojego kodu.
Ćwiczenie: Strassen kontra DGEMM
Zaimplementuj algorytm Strassena mnożenia dwóch macierzy i porównaj czas jego działania z czasem działania procedury DGEMM
, najlepiej zoptymalizowanej na Twoją architekturę.
testuj dla macierzy wymiaru , gdzie .
Opis algorytmu Strassena znajdziesz np. w rozdziale 28 klasycznego podręcznika
- T. H. Cormen, C. E. Leiserson, R. L. Rivest, C. Stein, Wprowadzenie do algorytmów, Wydawnictwa Naukowo-Techniczne, Warszawa, 2005, ISBN 83-204-3149-2.
Ćwiczenie: Czy Twoje programy działają naprawdę szybko?
Rozwiąż układ równań liniowych programując, niczym Zosia-Samosia, wszystko od początku do końca w czystym C (a może wolałbyś w Pythonie?!). Porównaj czasy działania twojego programu i programu wywołującego po prostu procedurę biblioteczną LAPACKa
DGESV
, najlepiej wspartą dobrze podrasowanymi BLASami.