2012-01-27 22 views
8

Używam callgrind do profilowania wielowątkowej aplikacji linuxowej i przede wszystkim działa świetnie. Zaczynam od wyłączenia oprzyrządowania (--instr-atstart = no), a po skonfigurowaniu włączam go z callgrind_control -i na. Jednak gdy zmieniam niektóre konfiguracje, aby spróbować profilować inną część aplikacji, zaczyna działać bardzo wolno, zanim jeszcze włączę oprzyrządowanie. Zasadniczo część kodu, która zajęłaby kilka sekund przy normalnej pracy, zajęłaby ponad godzinę z callgrindiem (oprzyrządowanie wyłączone). Jakieś pomysły na to, dlaczego tak się stało i jak rozwiązywać problemy z usuwaniem/rozwiązywaniem problemów?callgrind powolny z wyłączoną oprzyrządowaniem

+0

Jakie są "określone konfiguracje, aby spróbować profilować inną część aplikacji"? – jpalecek

+0

user779, czy możesz sprawdzić szybkość aplikacji za pomocą ["nul" narzędzia valgrind] (http://valgrind.org/docs/manual/nl-manual.html) oraz z [narzędziem Lackey z valgrind] (http: //valgrind.org/docs/manual/lk-manual.html)? – osgx

+0

@jpalecek: wszystko co mam na myśli to to, że użytkownicy mogą włączać/wyłączać funkcje przez konfigurację i poprzez włączanie niektórych funkcji (rekursywnie będzie to wykonywać więcej szczegółów na zestawie obiektów i spowoduje to dużo więcej obliczeń) zacznie się czołgać . – naumcho

Odpowiedz

10

Callgrind to narzędzie zbudowane na valgrinie. Valgrind jest po prostu dynamicznym tłumaczem binarnym (libVEX, część valgrind). Odszyfruje każdą instrukcję i JIT-kompiluje je do strumienia niektórych instrukcji tego samego procesora.

Jak wiem, nie ma sposobu, aby włączyć to tłumaczenie (w wersji valgrind) dla już uruchomionego procesu, więc dynamiczne tłumaczenie jest włączone cały czas, od początku programu. Nie można go również wyłączyć.

Narzędzia są budowane na valgrind przez dodanie kodu oprzyrządowania. Narzędzie "Nul" (nulgrind) to narzędzie, które nie dodaje oprzyrządowania. Ale każde narzędzie wykorzystuje valgrind i dynamiczne tłumaczenie jest aktywne cały czas. Włączanie i wyłączanie w callgrind polega na włączaniu i wyłączaniu dodatkowego oprzyrządowania.

Wirtualny procesor wdrożony przez Valgrind jest ograniczony, istnieje (niepełna) lista ograniczeń. http://valgrind.org/docs/manual/manual-core.html#manual-core.limits Większość ograniczeń dotyczy operacji zmiennoprzecinkowych i mogą być one emulowane źle.

Czy zmiana dotyczy operacji zmiennoprzecinkowych? Lub z innymi wymienionymi ograniczeniami?

Powinieneś również wiedzieć, że "Valgrind serializuje wykonanie tak, że tylko jeden wątek działa w czasie". (z tej samej strony manual-core.html)

+0

PS: obciążenie ogólne nulgrind (libVEX basic instrumentation) jest ogromne. Nulgrind jest szacowany na 2-10 razy wolniej niż kod natywny (na przykład w http://os.inf.tu-dresden.de/papers_ps/vee08-pohle.pdf); każde inne narzędzie na vlagrind jest wolniejsze niż nulgrind. Callgrind z wyłączonym trybem będzie działał z prędkością nulgrind; callgrind włączony będzie działać kilka razy wolniej. – osgx