Używam Valgrind + Callgrind do profilowania napisanego przeze mnie solwera. Jak stwierdza instrukcja obsługi Valgrind, skompilowałem swój kod z opcjami debugowania dla kompilatora:
„Bez informacji o debugowaniu najlepsze narzędzia Valgrind, które można zrobić, to odgadnięcie, do której funkcji należy dany fragment kodu, co sprawia, że zarówno komunikaty o błędach, jak i wyniki profilowania są prawie bezużyteczne. Dzięki opcji -g otrzymasz wiadomości wskazujące bezpośrednio na odpowiednie wiersze kodu źródłowego. ”
Po skompilowaniu z opcją debugowania kody działają znacznie wolniej. Kod CFD staje się NAPRAWDĘ powolny, nawet w małych przypadkach po skompilowaniu z flagami debugowania. Valgrind sprawia, że jest 40 razy wolniejszy (patrz instrukcja 1 ).
Jakich narzędzi używasz do profilowania kodu (profilowanie, a nie benchmarking)?
Jak długo pozwalasz na działanie kodu (statystyki: ile kroków czasowych)?
Jak duże są przypadki (jeśli sprawa mieści się w pamięci podręcznej, solver jest o rząd wielkości szybszy, ale wtedy przegapię procesy związane z pamięcią)?
callgrind
,cachegrind
lubmassif
. Wiele osób kojarzy Valgrind tylko z domyślnym narzędziem (memcheck
). Jako system profilowania oparty na emulacji (a nie na przerwie) nie trzeba długo uruchamiać.Odpowiedzi:
Oto przykład tego, jak to robię.
Oddzielam testy porównawcze (sprawdzanie, jak długo to potrwa) od profilowania (identyfikowanie, jak przyspieszyć). Nie jest ważne, aby profiler był szybki. Ważne jest, aby informował o tym, co naprawić.
Nie podoba mi się nawet słowo „profilowanie”, ponieważ wyczarowuje obraz coś w rodzaju histogramu, w którym dla każdej procedury istnieje pasek kosztów, lub „wąskie gardło”, ponieważ oznacza, że w kodzie jest tylko trochę miejsca, które musi być naprawiony. Obie te rzeczy oznaczają pewien czas i statystyki, dla których, jak zakładasz, ważna jest dokładność. Nie warto rezygnować z wglądu w dokładność pomiaru czasu.
Zastosowanie metody I jest przypadkowe zatrzymywanie, a tam pełne studium przypadku i pokaz slajdów tutaj . Częścią światopoglądu wąskiego gardła profilera jest to, że jeśli niczego nie znajdziesz, nic nie można znaleźć, a jeśli coś znajdziesz i uzyskasz określony procent przyspieszenia, ogłaszasz zwycięstwo i rezygnujesz. Fani Profiler prawie nigdy nie mówią, ile przyspieszają, a reklamy pokazują tylko sztucznie wymyślone problemy, które można łatwo znaleźć. Losowe wstrzymywanie powoduje znalezienie problemów, czy są one łatwe, czy trudne. Następnie naprawienie jednego problemu ujawnia inne, dzięki czemu proces można powtórzyć, aby uzyskać złożone przyspieszenie.
Z mojego doświadczenia wynikającego z wielu przykładów, oto jak to wygląda: mogę znaleźć jeden problem (przez losowe wstrzymanie) i naprawić go, uzyskując przyspieszenie o pewien procent, powiedzmy 30% lub 1,3x. Następnie mogę to zrobić ponownie, znaleźć inny problem i rozwiązać go, otrzymując kolejne przyspieszenie, może mniej niż 30%, może więcej. Potem mogę to zrobić wiele razy, dopóki naprawdę nie znajdę nic innego do naprawienia. Ostateczny współczynnik przyspieszenia jest działającym iloczynem poszczególnych czynników i może być niesamowicie duży - w niektórych przypadkach rzędu wielkości.
WSTAWIONO: Aby zilustrować ten ostatni punkt. Jest to szczegółowy przykład tutaj , z pokazu slajdów i wszystkich plików, pokazując, jak przyspieszenie od 730X został osiągnięty w serii problemowych przeprowadzek. Pierwsza wersja zajęła 2700 mikrosekund na jednostkę pracy. Problem A został usunięty, co skróciło czas do 1800 i zwiększyło odsetek pozostałych problemów o 1,5x (2700/1800). Następnie B został usunięty. Proces ten trwał przez sześć iteracji, co spowodowało przyspieszenie prawie 3 rzędów wielkości. Ale technika profilowania musi być naprawdę skuteczna, ponieważ jeśli którykolwiek z tych problemów nie zostanie znaleziony, tj. Jeśli dojdziesz do punktu, w którym błędnie myślisz, że nic więcej nie można zrobić, proces zatrzymuje się.
WSTAWIONO: Innymi słowy, oto wykres współczynnika całkowitego przyspieszenia po usunięciu kolejnych problemów:
Tak więc w pierwszym kwartale do przeprowadzenia testu porównawczego wystarczy prosty licznik czasu. Do „profilowania” używam losowego wstrzymywania.
Q2: Daję mu wystarczającą ilość pracy (lub po prostu owinąć pętlę), aby działał wystarczająco długo, aby zatrzymać.
P3: Zapewnij realistycznie duże obciążenie pracą, aby nie przegapić problemów z pamięcią podręczną. Będą one wyświetlane jako próbki w kodzie wykonującym pobieranie pamięci.
źródło
pstack
ilsstack
, ale naprawdę uważam, że jest to proces bardziej podobny do debugowania. Więc nawet jeśli najlepszym debugerem, jaki mogę przynieść, jestgdb
to zadanie. Za pomocą debugera możesz badać dane, co może mieć znaczenie, gdy sam stos nie powie ci wystarczająco dużo.W profiler biedaka jest w zasadzie
gdb
skrypt próbek stos wywołań. Nadal musisz mieć symbole debugowania. Nadal jest wolny, ale ponieważ nie implementuje maszyny wirtualnej do uruchomienia kodu, jest często szybszycallgrind
i adekwatny do zadania.Wpadłem na analizatory fizyki cząstek ze skromnym sukcesem (tj. Pokazałem, że kod nie ma żadnych strasznych punktów krytycznych, a optymalizacja wymagałaby lepszego algorytmu).
źródło
Aby dodać do dostępnych świetnych odpowiedzi, w Rice opracowano narzędzie, które automatyzuje próbkowanie stosu, a zatem ma bardzo mały narzut:
http://hpctoolkit.org/
źródło
exp
ilog
powtarzanie tych samych argumentów lub operacje matrycy spędzające cały czas na opcjach dekodowania. Stroję tak daleko, jak to możliwe, a następnie włączam -O3.Allinea MAP to komercyjnie opracowany i obsługiwany profiler próbkowania, a zatem - jak sugeruje wcześniejsza wersja HPC Toolkit - może działać na zleceniach o wielkości produkcyjnej, jeśli chcesz.
Tego rodzaju narzędzie wskazuje na wąskie gardła procesora lub słabą komunikację MPI, ale cały nadzór nad profilowaniem całego zadania może być bezcenny w poszukiwaniu niespodzianek.
Często pojawiają się nisko zawieszające się owoce, które znajdują się poza rdzeniem jądra kodu CFD, w obszarach, których nie oczekiwano. Losowe próbkowanie stosu jest - czy to ręcznie przy pomocy GDB, czy przy pomocy narzędzi takich jak HPC Toolkit i Allinea MAP - najlepszy sposób na ich znalezienie. Jeśli coś jest ważne dla wydajności, pojawi się.
źródło