5.3.2. Come usare Cachegrind per una analisi sull'uso della memoria
Cachegrind simula l'interazione del programma con una gerarchia cache della macchina e (facoltativamente) il branch predictor. Controlla l'uso dell'istruzione simulata del primo-livello e le cache dei dati, per il rilevamento di una interazione del codice insufficiente con questo livello di cache; e la cache dell'ultimo livello, se risulta essere una cache di secondo o terzo livello, per un controllo dell'accesso per la gestione della memoria. Per questo i programmi eseguiti con Cachegrind avranno una velocità di esecuzione dai venti ai cento volte minore rispetto ad una loro esecuzione normale.
Per eseguire Cachegrind usare il seguente comando sostituendo program con il programma da usare con Cachegrind:
# valgrind --tool=cachegrind program
Cachegrind è in grado di ottenere le seguenti informazioni per l'intero programma e per ogni funzione presente al suo interno:
- Richieste di lettura non eseguite (read misses) e lettura (o istruzioni eseguite) delle istruzioni per cache del primo livello, e richieste di lettura non eseguite per l'istruzione della cache dell'ultimo livello;
- Lettura dati della cache (o lettura della memoria), richieste di lettura non eseguite e richieste di lettura non eseguite dei dati della cache dell'ultimo livello;
- Scrittura dati della cache (o scrittura della memoria), richieste di scrittura non eseguite e richieste di scrittura non eseguite dei dati della cache dell'ultimo livello;
- branch condizionali eseguiti e previsti incorrettamente; e
- branch indiritti eseguiti e previsti incorrettamente.
Per impostazione predefinita Cachegrind stampa un sommario delle informazioni relative alle statistiche sopra riportate, e scrive in modo più dettagliato le informazioni sul profiling su un file (
cachegrind.out.pid
, dove pid è l'ID del processo del programma sul quale è stato eseguito Cachegrind). È possibile processare maggiormente questo file usando cg_annotate nel modo seguente:
# cg_annotate cachegrind.out.pid
Nota
cg_annotate è in grado di riportare righe più lunghe di 120 caratteri in base alla lunghezza del percorso. Per rendere l'output più chiaro e facile da consultare, è consigliato aumentare la grandezza della finestra del terminale prima di eseguire il suddetto comando.
È possibile altresì confrontare i file del profilo creato da Cachegrind in modo da facilitare l'implementazione di un grafico delle prestazioni del programma prima e dopo una modifica. Per fare questo usare il comando cg_diff, sostituendo first con il file dell'output del profilo iniziale, e second con il file dell'output del profilo seguente:
# cg_diff first second
Questo comando produce un file dell'output combinato visualizzabile in modo dettagliato con cg_annotate.
Cachegrind supporta un numero di opzioni per il suo output. Alcune delle opzioni sono:
--I1
- Specifica la dimensione, l'associazione e la dimensione della riga per la cache dell'istruzione di primo-livello, separati da virgole:
--I1=size,associativity,line size
. --D1
- Specifica la dimensione, l'associazione e la dimensione della riga per la cache dei dati di primo-livello, separati da virgole:
--D1=size,associativity,line size
. --LL
- Specifica la dimensione, l'associazione e la dimensione della riga della cache dell'ultimo-livello, separati da virgole:
--LL=size,associativity,line size
. --cache-sim
- Abilita o disabilita la raccolta dei conteggi relativi al mancato accesso e dell'accesso della cache. Il valore predefinito è
yes
(abilitato).Da notare che disabilitando entrambe le opzioni sopra indicate e--branch-sim
, non permetterete a Cachegrind di ottenere alcuna informazione. --branch-sim
- Abilita o disabilita la raccolta delle informazioni relative ai conteggi previsti incorrettamente e sulle istruzioni del branch. Per impostazione predefinita questa opzione è impostata su
no
(disabilitato), poichè rallenterà Cachegrind di circa il 25 per-cento.Da notare che disabilitando entrambe le opzioni sopra indicate e--cache-sim
, non permetterete a Cachegrind di ottenere alcuna informazione.
Per un elenco di opzioni completo consultare la documentazione inclusa in
/usr/share/doc/valgrind-version/valgrind_manual.pdf
.