2010-07-15 12 views
6

Voglio scrivere una serie di ottimizzazioni per gcc utilizzando algoritmi genetici. Ho bisogno di misurare il tempo di esecuzione di una funzione di assemblaggio per alcune statistiche e funzioni di adattamento. Non è possibile utilizzare la normale misurazione del tempo, perché è influenzata dalle dimensioni della cache.
Quindi ho bisogno di un tavolo dove possa vedere qualcosa di simile.Come misurare il tempo di esecuzione dei comandi di assemblaggio x86 e x86-64 nei cicli del processore?

command | operands | operands sizes | execution cycles 

Sono forse un qualcosa di incomprensibile? Ci scusiamo per il cattivo inglese.

+0

Il tuo inglese va bene. Ho solo una lagnanza: non so se il giorno arriverà mai quando le persone che cercano di accelerare di qualche percentuale tramite la micro-ottimizzazione comprenderanno anche il valore di ottenere molti fattori di accelerazione tramite l'ottimizzazione macro, cosa che i compilatori non possono fare. –

+0

Possibile duplicato di [Quanti cicli di CPU sono necessari per ogni istruzione di assemblaggio?] (Http://stackoverflow.com/questions/692718/how-many-cpu-cycles-are-needed-for-each-assembly-instruction) –

risposta

2

Con moderna CPU, non ci sono semplici tabelle per cercare quanto tempo un'istruzione ci vorrà per completare (anche se esistono tali tabelle per alcuni vecchi processori, ad esempio 486). Le tue migliori informazioni su ciò che ciascuna istruzione fa e quanto tempo potrebbe richiedere viene dal produttore del chip. Per esempio. Intel's documentation manuals sono abbastanza buoni (c'è anche un manuale di ottimizzazione su quella pagina).

Su praticamente tutte le CPU moderne è presente anche l'istruzione RDTSC che legge il contatore di data/ora per il processore su cui è in esecuzione il codice in EDX:EAX. Ci sono anche dei problemi, ma essenzialmente se il codice che si sta profilando è rappresentativo di una situazione di utilizzo reale, la sua esecuzione non viene interrotta o spostata su un altro core della CPU, quindi è possibile utilizzare questa istruzione per ottenere i tempi desiderati. Cioè racchiudi il codice che stai ottimizzando con due istruzioni RDTSC e prendi la differenza in TSC come tempistica. (Gli scostamenti sui tempi in diversi test/situazioni possono essere grandi, le statistiche sono i tuoi amici.)

1

Puoi instrumentare il codice usando assembly (rdtsc e amici) o usando una API di strumentazione come PAPI. La misurazione accurata dei cicli di clock che sono stati spesi durante l'esecuzione di un'istruzione non è possibile, tuttavia è possibile fare riferimento ai manuali dello sviluppatore dell'architettura per le migliori stime.

In entrambi i casi, è necessario prestare attenzione quando si prendono in considerazione gli effetti dovuti all'esecuzione su un ambiente SMP.

Problemi correlati