2012-01-27 14 views
8

Sto usando callgrind per creare il profilo di un'app multi-threaded di Linux e soprattutto funziona benissimo. Lo avvio con la strumentazione disattivata (--instr-atstart = no) e quindi una volta eseguita l'installazione, accendo lo strumento con callgrind_control -i su. Tuttavia, quando modifico determinate configurazioni per provare a profilare una parte diversa dell'app, inizia a funzionare estremamente lentamente anche prima di attivare la strumentazione. Fondamentalmente parte del codice che impiega alcuni secondi con il normale funzionamento impiega più di un'ora con callgrind (strumentazione disattivata). Qualche idea sul perché potrebbe essere e su come procedere nel debugging/risoluzione della lentezza?callgrind lento con strumentazione disattivata

+0

Quali sono le "determinate configurazioni per provare a profilare una parte diversa dell'app"? – jpalecek

+0

user779, puoi controllare una velocità di applicazione con lo strumento ["nul" di valgrind] (http://valgrind.org/docs/manual/nl-manual.html) e con [lo strumento Lackey di valgrind] (http: //valgrind.org/docs/manual/lk-manual.html)? – osgx

+0

@jpalecek: tutto quello che voglio dire è che gli utenti possono abilitare/disabilitare le funzionalità di config e abilitando alcune delle funzionalità (in modo approfondito si approfondirà per avere maggiori dettagli su un insieme di oggetti e che si traducono in molti più calcoli) inizia a strisciare . – naumcho

risposta

10

Callgrind è uno strumento, costruito su valgrind. Valgrind è fondamentalmente un traduttore binario dinamico (libVEX, parte di valgrind). Decodificherà ogni istruzione e JIT-compili in flusso di alcune istruzioni della stessa CPU.

Come noto, non è possibile abilitare questa traduzione (nell'implementazione di valgrind) per il processo già in esecuzione, quindi la conversione dinamica è abilitata per tutto il tempo, dall'inizio del programma. Non può essere disattivato anche.

Gli strumenti sono costruiti su valgrind aggiungendo un codice di strumentazione. Lo strumento "Nul" (nulgrind) è lo strumento che non aggiunge strumentazione. Ma ogni strumento usa valgrind e la traduzione dinamica è attiva sempre. L'accensione e lo spegnimento di callgrind è solo l'accensione e lo spegnimento della strumentazione aggiuntiva.

CPU virtuale, implementata da Valgrind è limitata, c'è un elenco (incompleto) di limitazioni http://valgrind.org/docs/manual/manual-core.html#manual-core.limits La maggior parte delle limitazioni riguardano operazioni in virgola mobile e possono essere emulate in modo errato.

La modifica è collegata alle operazioni in virgola mobile? O con altre limitazioni elencate?

Inoltre, è necessario sapere che "Valgrind serializza l'esecuzione in modo che sia in esecuzione un solo thread alla volta". (dalla stessa pagina manual-core.html)

+0

PS: overhead nulgrind (strumentazione base libVEX) è enorme. Nulgrind è stimato essere 2-10 volte più lento del codice nativo (ad esempio in http://os.inf.tu-dresden.de/papers_ps/vee08-pohle.pdf); qualsiasi altro strumento su vlagrind è più lento di nulgrind. Callgrind con la modalità spenta funzionerà alla velocità di zero; callgrind attivato verrà eseguito più volte più lentamente. – osgx

Problemi correlati