2011-10-13 15 views
5

Chciałbym wiedzieć, czy istnieją narzędzia, które mogąNarzędzia do wizualizacji wielowątkowego wykresu wywołania aplikacji C++, wielowątkowy zasięg kodu?

  • Pomoc visualize wykres wywołanie dużego zastosowania wielowątkowe.
  • W szczególności chcę zobaczyć, jak wiele wątków przeplata się na jednym rdzeniu/wykonuje jednocześnie na wielu rdzeniach.
  • Narzędzie idealnie identyfikuje możliwe warunki oczekiwania/zakleszczenia/wyścigu.
  • Ostatecznie chcę wykonać kodowanie w kategoriach wzajemnego oddziaływania wątków w czasie wykonywania programu (narzędzie do obsługi wielu wątków), aby znaleźć potencjalne błędy wielowątkowe.

    Przepraszam, jeśli nie wyjaśniłem wyraźnie mojego pytania i chciałbym podać wszelkie szczegóły.

+0

Powodzenia, będę czekał na rozsądną odpowiedź. Myślę, że musisz dokładnie zrozumieć wątek wykonawczy, który dzielisz na multi. Istnieje wiele narzędzi do profilowania i tworzenia wykresów wykonania (fav to profiler wydajności Redgate, drogi, ale niesamowity), ale bez szczegółów, które kręcisz w ciemności. – Justin

+0

@Justin Ah Zapomniałem wspomnieć, że aplikacja, nad którą pracuję jest w C++. – fantasticsid

+0

@fantasticid: Zmieniłem twój tytuł, by odzwierciedlić twoje zainteresowanie. –

Odpowiedz

1

Urządzenie VTune Profiler firmy Intel może wykonać pewne czynności. Z witryny VTune:

Locks i czeka: Użyj narzędzia profilowania wydajności Intel® szybko znaleźć wspólną przyczyną niskiej wydajności w programach równoległych: zbyt długie oczekiwanie na blokadę zaś rdzenie są w pełni wykorzystany podczas czekania.

Oś czasu wizualizuje zachowanie się nici: Sprawdź, kiedy wątki są uruchomione i oczekują oraz kiedy występują przejścia.

Jeśli szukałeś czegoś, co jest open source/free, to Valgrind ma eksperymentalne narzędzie o nazwie Helgrind, które rzekomo znajduje wyścigi w programach wielowątkowych. Nie mogę tego komentować, nie wykorzystałem tego.

Należy zauważyć, że nie udało mi się wykorzystać tych lub innych profilerów do wielowątkowego debugowania i optymalizacji, a zamiast tego opracowałem własne techniki.

Aby zidentyfikować rywalizację o blokadę, moją preferowaną techniką jest użycie rozszerzonej klasy Mutex, która rejestruje wszystkie operacje wykonywane w każdej instancji. Robię to w bardzo lekki sposób, dzięki czemu wydajność aplikacji nie zmienia się w wielkim stylu.

Aby zidentyfikować warunki wyścigu, uważam, że podejście typu brute force jest najlepsze. Właśnie zaprojektowałem test, który można uruchomić przez dłuższy czas, czasami to godziny, lub dni, w zależności od przypadku. I zawsze przeprowadzam mój test na co najmniej dwóch różnych platformach (więcej, jeśli mogę), ponieważ różne systemy operacyjne korzystają z różnych harmonogramów i zapewniają lepszy zasięg.

1

Chociaż nie mogę pomóc (jeszcze!) W większości twoich problemów, myślę, że nasze narzędzie C++ Test Coverage może dość łatwo dostarczyć dane pokrycia testowego wielowątkowego.

To narzędzie służy do instrumentowania kodu źródłowego; kompilujesz i uruchamiasz to. Kończysz z (tanimi) sondami pomiarowymi w kodzie reprezentującym różne bloki. Instrumentacja rejestruje, które części twojego programu wykonują, nominalnie jako wektor bitowy z jednym bitem na sondę oprzyrządowania. Pod koniec wykonywania (lub kiedy chcesz), ten wektor bitowy jest odrzucany, a widz wyświetli go nałożony na kod.

Podstępem do uzyskania pokrycia testowego multihread jest świadomość, że zapewniamy pełną kontrolę nad tym, jak działają sondy pomiarowe; są to makra. Więc zamiast użyciu domyślnego makro zasadniczo

probe[n]=true; 

na tablicy logicznej, można zamiast realizować

probe[n]|=1<<threadid; 

na tablicy int (lub coś sprytnie tańsze o precomputing tę wartość). To prawdopodobnie zajmuje tylko kilka linii kodu do zaimplementowania.

Ludzie mogą zauważyć, że technicznie występują problemy z synchronizacją. To prawda, ale co najwyżej traci ona trochę danych dotyczących zasięgu, a szanse na to są dość wysokie. Większość ludzi jest zadowolona z danych "całkiem dobrych", a nie idealnych. Jeśli nalegasz na doskonałą jakość, zapłacisz wysoką cenę synchonizacji za pomocą instrukcji aktualizacji atomowej .

Zapewniamy również kontrolę nad logiką wyrzucania sondy; możesz go poprawić, aby zapisać dane pokrycia specyficzne dla wątku (w dziesiątkach linii niestandardowego zakresu kodów). Przeglądarka danych pokrycia testowego pozwoli Ci zobaczyć pokrycie specyficzne dla wątku (wystarczy wybrać odpowiedni wektor pokrycia); ma również wbudowany obiekt dla z łatwością obliczający/wyświetlający skrzyżowanie/połączenie/diff na wektorach pokrycia, co daje dokładnie twoją relację zasięgu dla wątku.

Powiązane problemy