2014-10-11 14 views
5

mi sono imbattuto perf analisi sul seguente programma vuoto,perf stat dà numero diverso di istruzione per ogni corsa

#include <stdio.h> 
int main() { 
} 

Dopo la compilazione e l'esecuzione stat perf ./a.out ho ricevuto il seguente output dicendo (insieme a altri dati come il numero di cicli, task-orologio, ecc):

418,869 instructions # 0.87 insns per cycle 

il numero di istruzioni modifiche nel corso di ogni 'perf' analisi sullo stesso elfo.

La mia vera necessità è trovare il numero di istruzioni in una particolare funzione che ho scritto. Quindi sto sottraendo il numero sopra dal numero di istruzioni nel nuovo programma (potrei contare il numero di riga in program.s creato usando il tag -S in gcc ma sono confuso dopo aver osservato il comportamento perf)

Perché il numero di istruzioni non è coerente, per essere esatti?

Aggiornamento ho seguito l'esempio dato in man page per usare perf_event_open() in C

risposta

4

per misurare il numero di istruzioni eseguite dalla funzione, suggerisco di avviare e interrompere gli eventi che contano con perf_event_open() al momento dell'ingresso della funzione e uscire piuttosto che eseguire il doppio del programma con e senza la funzione.

Per quanto riguarda il non determinismo del numero di istruzioni eseguite dal programma vuoto, è possibile che si contino gli eventi sia nei campi utente che kernel. Penso che il conteggio degli utenti dovrebbe rimanere lo stesso tra due esecuzioni, ma per la parte del kernel, molte cose stanno accadendo dietro la scena per eseguire questo programma, quindi immagino che il non determinismo derivi da ciò che sta accadendo nel codice del kernel. Per contare solo le istruzioni dello spazio utente puoi utilizzare:

perf stat -e instructions:u a.out 

Puoi fornire maggiori dettagli sulle differenze?

+0

perf_event_open() mi ha fornito un conteggio esatto pari al numero di istruzioni nel file .s. perf stat -e instructions: u a.out dà anche un numero di conteggio diverso ogni volta, ma la variazione non è grande come nello scenario spiegato nella domanda. – Vignesh

+0

utilizzando perf_event_open hai esattamente nkwo quello che misuri. Per la (piccola) variazione rimanente anche dopo aver aggiunto: u Immagino che molte cose siano ancora fatte nello spazio utente prima che venga chiamata la funzione principale nel tuo programma, e qui c'è forse qualche variazione. –

Problemi correlati