Autor Wątek: AMD CodeAnalyst  (Przeczytany 3918 razy)

therealremi

  • Gość
# Listopad 27, 2009, 12:55:06
Mam sprzęt AMD i niestety VTune Intela nie chce działać. Czy ktoś tu więc rozumie AMD CodeAnalyst? Czy w VTune wygląda to lepiej?
Otóż spodziewałbym się, że jako wynik profilowania dostanę coś w stylu:
-main:   100%
--wywołanie funkcji A w main:   40%
---wywołanie konstruktora obiektu C w A:   55%
---inne rzeczy w A:   45%
--wywołanie funkcji B w main:   60%
itd.
Niestety to co dostaje w CodeAnalyst napawa mnie nieufnością.
W podstawowej konfiguracji "time-based profile" dostaje po prostu listę rożnych funkcji z liczbą sampli na nie przypadających. No ale problem w tym, że te funkcje są na chybił trafił powyciągane z call stacka: na pierwszym miejscu pod względem liczby sampli jest jakaś funkcja X wywoływana tylko przez konstruktor obiektu Y, podczas gdy ten konstruktor jest parę miejsc niżej (podobnie jak main). No i wychodziłoby z tego, że np. funkcje obsługujące tekstury DDS zajmują mi 10% sampli co jest oczywiście nieprawdą, bo zmierzyłem timerem czas ich ładowania.
Można też włączyć Call Stack Sampling, ale wyniki też wydają się dziwnie. main() również znajduje się gdzieś w środku tabeli. Wiem np. że funkcja X wywoływana jest kilkanaście razy w każdym wywołaniu funkcji Y, ale to na Y przypada więcej sampli. Jest to dziwne tym bardziej bo tutaj te sample powinny być proporcjonalne do liczby wywołań danej funkcji - np. tutaj malloc jest bardzo wysoko (często wywoływany), a w time-based profile nisko (wywołania kosztują mało milisekund).
Piszę tutaj bo na forum CodeAnalyst panuje pustka.

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Esidar

  • Użytkownik

# Listopad 27, 2009, 13:35:59
A jakie jest pytanie ? Bo jeśli "czy w VTune to działa lepiej?" to tak. W VTune działa lepiej :) Pokazuje tak jak napisałeś + dodatkowo, jeśli foo() ma 100% i wywołuje jedynie funkcję A która zajmuje 40%, to VTune pokazuje też "foo()-self Time-60%" dzięki czemu też widać czy te 100% to jest suma wszystkich wywoływanych funkcji czy też tylko 20% to funkcje a resztę czasu spędza w jakiejś pętli foo().


Offline Limal

  • Użytkownik
    • http://wolnik.co.uk

# Listopad 27, 2009, 14:16:59
(...) main() również znajduje się gdzieś w środku tabeli. Wiem np. że funkcja X wywoływana jest kilkanaście razy w każdym wywołaniu funkcji Y, ale to na Y przypada więcej sampli. Jest to dziwne tym bardziej bo tutaj te sample powinny być proporcjonalne do liczby wywołań danej funkcji
CodeAnalyst podaje dokładnie to co mierzysz - liczbę sampli dla poszczególnych instrukcji wewnątrz danej funkcji. Wywołanie innej funkcji jest mało kosztowne, stąd sama funkcja X zabiera mało czasu procesora.

Nie miałem potrzeby wgryzać się w samego CodeAnalysta. Po prostu dostałem listę funkcję najczęściej wywoływanych i to mi wystarczyło. Na Twoim miejscu poszukałbym w dokumentacji czy można te czasy dodawać, tak jak to robi VTune.

therealremi

  • Gość
# Listopad 27, 2009, 14:24:03
Esidar:
No na jedno pytanie już odpowiedziałeś. Drugie brzmiałoby tak: Czy jest jakiś ukryty sens w sposobie prezentacji wyników przez CodeAnalyst? Bo jak na razie to wydaje mi się, że on po prostu wyświetla średni czas spędzony w każdej funkcji: od main do wewnętrznych funkcji STLa. I to wszystko razem wymieszane. Żeby było zabawniej to wygląda na to, że te czasy są obliczane po odjęciu czasów wszystkich innych funkcji wywoływanych wewnątrz. Przynajmniej tak to wygląda.
Limal:
Nie żadnej opcji.

Offline Limal

  • Użytkownik
    • http://wolnik.co.uk

# Listopad 27, 2009, 14:44:51
Sens jest taki, że pokazuje "hot spoty", miejsca w których procesor spędza najwięcej czasu. Czego więcej oczekujesz od programu? Po prostu prezentuje dane inaczej, niż VTune. Ale nie ma to żadnego znaczenia, bo dostajesz, to czego chciałeś.

Co z tego, że metoda Render wywołuje kosztowną operację. Samo wywołanie to tylko 10 ms w 20 s czasie działania. Ważne, żeby dowiedzieć się jakie to są operacje. I to CodeAnalyst pokazuje właśnie w tej wymieszanej liście.

therealremi

  • Gość
# Listopad 27, 2009, 18:50:02
Nie dostaje tego czego chciałem. CodeAnalyst pokazuje mi, że hotspotem są funkcje ładujące dds (ponad 10% sampli na całą aplikację) podczas gdy w rzeczywistości na 5 minut działania aplikacji (i 5 minut profilowania) ich wykonywanie trwa 2 sekundy.

Offline yarpen

  • Użytkownik

# Listopad 27, 2009, 18:51:24
Mozesz sprobowac VerySleepy. Nie jest to w zadnym wypadku porownywalne narzedzie z profesjonalnymi pakietami, ale do szybkiego profilingu nadaje sie niezle (http://www.codersnotes.com/sleepy)

Offline Limal

  • Użytkownik
    • http://wolnik.co.uk

# Listopad 27, 2009, 19:43:54
Therealremi, nie wiem co mam Ci odpowiedzieć. U mnie CodeAnalyst działa bez zarzutu. Może zarzuć screenem.

Offline Reg

  • Administrator
    • Adam Sawicki - Home Page

# Listopad 27, 2009, 20:01:21
Mnie też brakuje w AMD CodeAnalyst jakiegoś inteligentniejszego zbierania danych i prezentowania wyników z uwzględnieniem stosu wywołań, zamiast tylko informacji w której funkcji znajduje się kod na szczycie stosu. Kupiłem ostatnio procesor firmy AMD - Phenom II. Czy na takim procesorze CodeAnalyst ma jakieś dodatkowe, przydatne możliwości?

Offline Limal

  • Użytkownik
    • http://wolnik.co.uk

# Listopad 27, 2009, 20:12:53
CodeAnalyst udostępnia opcję Call Stack Sampling [1]. Na obrazku widać, która funkcja zajmuje najwięcej czasu: codeanalyst-callstack.png.

Offline yarpen

  • Użytkownik

# Listopad 28, 2009, 00:03:49
CodeAnalyst udostępnia opcję Call Stack Sampling [1]. Na obrazku widać, która funkcja zajmuje najwięcej czasu: codeanalyst-callstack.png.
Czemu WinMain zajmuje mniej niz Graphics::Render? Renderujesz na innym watku?

Offline Limal

  • Użytkownik
    • http://wolnik.co.uk

# Listopad 28, 2009, 01:59:20
Całość leci na jednym wątku. Na poprzednim zrzucie ustawiłem odwijanie stosu wywołań do defaultowego 10. poziomu wstecz. Teraz dałem bezpieczne 64 poziomy. I wygląda na to, że teraz jest OK: codeanalyst4.png.

Na obrazku jest złapanych 2678 próbek z odwijaniem stosu wywołań, z czego 2673 należą do potomków WinMaina (5 się nie odwinęło). Z tego screena już widać, że 617/2678 (23,0%) czasu procesora idzie na renderowanie tekstu, a 2022/2678 (75,5%) na pozostałe funkcje.

Zamieszałem poprzednim screenem, ale chciałem jak najszybciej ogłosić dobrą nowinę, że jest taka opcja w CA :)

EDIT: generalnie poprzedni screen prezentuje dobre dane, tylko nie wszystkie wywołania wewnątrz Graphics::Render wiązane są z funkcją WinMain. Powróciłem do tej sesji i podobnie jak na obrazku wyżej rozwinąłem wywołania WinMain: codeanalyst5.png. I teraz jest OK, tylko trochę mało próbek :)
« Ostatnia zmiana: Listopad 28, 2009, 02:16:15 wysłana przez Limal »

Offline yarpen

  • Użytkownik

# Listopad 28, 2009, 12:03:17
Szczerze to troche nie rozumiem jak to dziala, VTune jest chyba bardziej logiczny. Na tym screenie mam WinMain, ktorego dzieci podobno zajmuja 567 czegos (us?), a zaraz pod nim dziecko, ktore zajmuje 761, troche sie to kupy nie trzyma. Pomagaja nieco te okienka na dole, ktore wygladaja na sensowniejsze, ale glowne jakies dziwne.

Offline Limal

  • Użytkownik
    • http://wolnik.co.uk

# Listopad 28, 2009, 12:20:15
W przypadku codeanalyst5.png, 567 oznacza 5670 ms (próbkowanie co 10 ms).  Dziecko ma więcej, bo odwijanie stosu było bardzo płytkie (10 adresów w górę).

Na obrazku codeanalyst4.png już jest OK, bo zrobiłem głębokie odwijanie (64 adresy w górę), czyli wszystkie dzieci dochodziły już do funkcji WinMain. Zwiększyłem też częstotliwość próbkowania (co 5 ms), dlatego na pomiar załapały się funkcje, które wykonują się w ułamku sekundu (np. Graphics::IsDeviceLost). Cały pomiar trwał 2673 * 5 ms ~= 13,4 s.

Offline msieradzki

  • Użytkownik

# Listopad 28, 2009, 12:23:02
CodeAnalyst udostępnia opcję Call Stack Sampling [1]. Na obrazku widać, która funkcja zajmuje najwięcej czasu: codeanalyst-callstack.png.
Czemu WinMain zajmuje mniej niz Graphics::Render? Renderujesz na innym watku?

To idzie według IP procesora. WinMain jak się domyślam bardzo szybko przechodzi do innej funkcji.

Jak używałem CodeAnalysta to najpierw brałem się za wyniki ze zwykłego testu. Później za pomocą CSS sprawdzałem co wywołuje daną funkcję, która zajmuje np. 1% czasu procesora. Jak wyniki są spaczone przez ładowanie czegoś, odrocz profilowanie o ileś sekund.

Bardzo przydatne są czasy wywołania wewnątrz danej funkcji - dla każdej instrukcji. x86 jest out-of-order, więc nie wiem jak to jest mapowane, ale mniej więcej działa.

Jedyna rzecz, ktorej nie lubię w CodeAnalyst, to że analizowanie wyników z 1h sesji trwa kilkanaście minut i po przeanalizowaniu CodeAnalyst lubi się wywalić przez co muszę spędzić te kilkanaście minut od nowa.