Optymalizacja programów Open-Source

Slides:



Advertisements
Podobne prezentacje
Programowanie w PMC.
Advertisements

Język C/C++ Funkcje.
PL/SQL kompilacja warunkowa
Wzorce.
Kamil Smitkiewicz Bezpieczeństwo w PHP.
PROGRAMOWANIE STRUKTURALNE
Informatyka Stosowana
Wydajne aplikacje na platformie .NET
CPU.
1 RISC – nasze założenia Podstawowe cechy: Wszystkie operacje są realizowane na rejestrach, Tylko operacje typu load i store wymagają dostępu do pamięci,
Wydział Zastosowań Informatyki i Matematyki SGGW
Materiały do zajęć z przedmiotu: Narzędzia i języki programowania Programowanie w języku PASCAL Część 1: Wprowadzenie do programowania.
Jakub Jurkiewicz Mirosław Ochodek Sponsorzy: Debug Jak szukać błędów w Eclipsie?
Podstawy informatyki Informatyka stosowana Prowadzący: Grzegorz Smyk
Systemy operacyjne.
Oprogramowanie rejestratora pikosekundowych przebiegów elektrycznych
Opcje kompilatora g77 g77 [opcje] pliki_źródłowe Opcje: -c tylko kompilacja bez linkowania -S kompilacja do kodu assemblera -E tylko pre-processing -o.
Zachodniopomorskie Centrum Edukacyjne Zadanie domowe.
Wstęp do interpretacji algorytmów
Wprowadzenie do programowania w języku Turbo Pascal
Wieloprocesowy system operacyjny dla komputerów ATARI XL/XE
Temat 3: Co to znaczy, że komputer ma pamięć? Czy można ją zmierzyć?
TBD - P ERFORMANCE W BAZACH M ICROSOFT SQL S ERVER, CZYLI O CO W TYM W OGÓLE CHODZI Michał Grodzicki MCTS SQL SERVER lipca 2012.
Podstawy programowania
Architektura komputerów
przykładowy 8-bitowy mikroprocesor uniwersalny CISC
© A. Jędryczkowski – 2006 r. © A. Jędryczkowski – 2006 r.
Algorytmy i struktury danych
Kompilator SDCC i Pakiet STRC52 Mgr inż. Aleksander Pruszkowski
PHP: warunki, pętle, switch, break, continue
Etapy pracy biosu.
Mikroprocesory.
JAVA c.d.. Instrukcji wyboru SWITCH używamy, jeśli chcemy w zależności od wartości pewnego wyrażenia wykonać jeden z kilku fragmentów kodu. Jest to w.
5 Etapów Pracy Kompilatora
Maszyna wirtualna ang. virtual machine, VM.
Podstawy informatyki 2013/2014
Analiza wizualna – co to jest i czym to się je
Testowanie płyty głównej. Sygnały dźwiękowe BIOS
W ą t e k (lekki proces) thread.
Kurs języka C++ – wykład 9 ( )
Projektowanie stron WWW
Podstawy programowania
Metody numeryczne metody rozwiązywania problemów matematycznych za pomocą operacji na liczbach. Otrzymywane tą drogą wyniki są na ogół przybliżone, jednak.
Procesor – charakterystyka elementów systemu. Parametry procesora.
Diagram aktywności (czynności)
Derekursywacja i optymalizacja kodu
Procesor, pamięć, przerwania, WE/WY, …
Podstawy języka skryptów
Procesy, wątki Program a proces Proces: Przestrzeń adresowa, kod, dane, stos (część pamięci do przechowania zmiennych lokalnych i niektórych adresów) Otwarte.
Wprowadzenie do programowania w Pascalu mgr inż. Agata Pacek.
Optymalna konfiguracja Microsoft SQL Server 2014
Struktura systemu operacyjnego
Temat: Jak działa antywirus? _________________________________________________________________________________________________________________ [ Przedmiot:
Instrukcje warunkowe w php. Pętla FOR Czasem zachodzi potrzeba wykonania jakiejś czynności określoną ilość razy. Z pomocą przychodzi jedna z najczęściej.
Temat 3: Podstawy programowania Algorytmy – 2 z 2 _________________________________________________________________________________________________________________.
Tryby adresowania i formaty rozkazów mikroprocesora
Aktualizowanie systemów operacyjnych Przedmiot: Systemy operacyjne Klasa: 1TI Opracował: Marek Kwiatkowski.
C++ WYKŁAD 12 ( ) Własne biblioteki. S PIS TREŚCI Kompilacja i łączenie Moduły Biblioteki Biblioteka statyczna Biblioteka współdzielona Biblioteka.
Dominik Benduski Michał Mandecki Podstawy Visual Basic w Excelu.
Programowanie strukturalne i obiektowe Klasa I. Podstawowe pojęcia dotyczące programowania 1. Problem 2. Algorytm 3. Komputer 4. Program komputerowy 5.
Optymalizacja programów Open-Source Krzysztof Lichota
Optymalizacja programów Open- Source Inne zagadnienia Krzysztof Lichota
Kompilacja iteracyjna Piotr Błaszyński. Szybkie programy Prawa ograniczające:  prawo Moore'a (jego granice),  prawo Gatesa,  prawo Amdahla,  prawo.
Optymalizacja programów Open- Source Profilery niskiego poziomu część 2 Krzysztof Lichota
Kompilatory optymalizujące Piotr Błaszyński. Generowanie kodu, wstęp : - Kod generowany jest dla różnych maszyn, trzeba pamiętać, że ten sam program źródłowy.
Optymalizacja programów Open- Source Dostęp do dysku Krzysztof Lichota
Optymalizacja programów Open-Source Profilery wysokiego poziomu część 1 Krzysztof Lichota
Optymalizacja programów Open-Source
Optymalizacja programów Open-Source
Podział mikroprocesorów
Zapis prezentacji:

Optymalizacja programów Open-Source Profilery niskiego poziomu część 1 Krzysztof Lichota lichota@mimuw.edu.pl

Profiling niskiego poziomu

Profiling niskiego poziomu Profiling wysokiego poziomu pozwala wykryć, które funkcje zabierają dużo czasu Ale co dalej?

Sposoby profilowania niskiego poziomu Analiza kodu źródłowego (!) Skupienie się od razu na kodzie maszynowym może spowodować przeoczenie możliwych optymalizacji w algorytmie Profiling per linia kodu źródłowego/funkcja/adres – za pomocą poznanych już narzędzi Narzędzia profilujące za pomocą próbkowania mają dość małą dokładność Narzędzia do analizy niskopoziomowej na poziomie procesora

Valgrind

Valgrind Narzędzie do dynamicznej translacji i instrumentacji kodu maszynowego na różne sposoby Możliwe różne instrumentacje: memcheck – sprawdza użycie niezainicjalizowanych zmiennych, wycieki pamięci, błędy alokacji pamięci cachegrind/callgrind – analizuje zużycie cache CPU i drzewo wywołań massif – analiza zużycia pamięci helgrind – błędy w programach współbieżnych

Valgrind Bardzo duży narzut – program działa 20x do 100x wolniej (zależnie od instrumentacji) Ale pozwala na wykrywanie bardzo trudnych błędów i bardzo skomplikowaną analizę Niektóre programy działają z problemami pod Valgrindem

cachegrind/callgrind

cachegrind Symuluje użycie cache CPU poziomu 1 i 2 Nie symuluje kosztu instrukcji, branch prediction, itp. Przydatny do optymalizacji kodu, który intensywnie korzysta z pamięci

cachegrind - wywołanie Sposób wywołania: valgrind --tool=cachegrind <polecenie> Przydatne opcje: Wyłączenie symulacji cache: --cache-sim=no Wyłączenie branch prediction: --branch-sim=no Opcje określające wielkość i rodzaje cache

callgrind Sposób wywołania: valgrind --tool=callgrind --dump-instr=yes --trace-jump=yes --simulate-cache=yes <polecenie> Przydatne opcje: Włączenie pełnej symulacji cache, a nie tylko odczytów: --simulate-cache=yes Zbieranie informacji o skokach warunkowych: --collect-jumps=yes

Przydatne opcje callgrind Włączenie od określonego miejsca: Uruchomić z opcją: --instr-atstart=no W odpowiednim momencie włączyć za pomocą: callgrind_control -i on (w tym samym katalogu, co uruchomiony program) Profilowanie tylko określonej funkcji: --toggle‑collect=<funkcja>

Wynik działania callgrind Surowy wynik działania callgrind nie daje się czytać Istnieje narzędzie do przetworzenia wyników na postać tekstową: callgrind_annotate Ale istnieje też dużo lepsze narzędzie graficzne: kcachegrind :)

kcachegrind

kcachegrind/callgrind Narzędzie do wizualizacji wyników callgrind/cachegrind (ale można też wizualizować wyniki innych profilerów za pomocą skryptów konwertujących) Pokazuje bardzo szczegółowo co się dzieje instrukcja po instrukcji (np. pojedyncze wywołania dynamicznego linkera) Pokazuje ścieżki wykonania w kodzie i która gałąź była wybrana ile razy Pokazuje drzewo wywołań (podobnie jak Google Profiler)

kcachegrind/callgrind Pokazuje obrazowo drzewo wywołań z obszarem proporcjonalnym do kosztu (treemap) Może pokazywać oszacowanie liczby cykli procesora, liczbę nietrafień w cache a nawet własną funkcję kosztu

Jak optymalizować

Jak optymalizować? Zamienić funkcję na inline Wymusić użycie rejestrów przez kompilator Zmienić konstrukcje pętli na efektywniejszą (np. nie wyliczać indeksu jako mnożenia tylko dodawanie) Zamienić mnożenia na przesunięcia bitowe Operować na większych blokach danych naraz (w szczególności operacje wektorowe: MMX, SSE oraz operacje na ciągach: SCAS, STOS) Użyć specyficznych instrukcji procesora (np. XLAT) Czasem trzeba zrobić kilka wariantów funkcji na różne procesory (np. RAID5 w Linuksie) i sprawdzać, która jest najlepsza na żywo.

Jak optymalizować? (2) Optymalizować użycie cache (procesor jest kilkakrotnie szybszy od pamięci!) Wyrównać struktury danych w pamięci Robić ręczny prefetching Unikać cache pollution Optymalizować skoki (branch prediction) ... Ogólnie: trzeba bardzo dobrze znać budowę kompilatorów, architekturę komputera, używanego procesora, itd.

Bibliografia http://valgrind.org/ http://rac.uits.iu.edu/rats/research/docs/valgrind/cg_techdocs.html http://kcachegrind.sourceforge.net/ http://kcachegrind.sourceforge.net/docs/slides-akademy.pdf