2010-10-09 14 views
10

Scattato da this SO thread, questo pezzo di codice calcola il numero di cicli in esecuzione del ciclo trascorso tra le righe //1 e //2.In che modo questo codice calcola il numero di cicli della CPU trascorsi?

$ cat cyc.c 
#include<stdio.h> 

static __inline__ unsigned long long rdtsc(void) 
{ 
    unsigned long long int x; 
    __asm__ volatile (".byte 0x0f, 0x31" : "=A" (x)); 
    return x; 
} 

int main() { 
    unsigned long long cycles = rdtsc(); //1 
    cycles = rdtsc() - cycles;   //2 
    printf("Time is %d\n", (unsigned)cycles); 
    return 0; 
} 

$ gcc cyc.c -o cyc 
$ ./cyc 
Time is 73 
$ ./cyc 
Time is 74 
$ ./cyc 
Time is 63 
$ ./cyc 
Time is 73 
$ 

Come funziona il rdtsc() funzione?

risposta

11

La funzione esegue l'istruzione RTDSC 86, nel quale sono contenuti un opcode di 0x0f, 0x31. Il processore tiene traccia dei cicli di clock interni, e questo legge quel numero.

Naturalmente, questo funziona solo su process x86, altri processori avranno bisogno di istruzioni diverse.

Il contatore di timbri è un registro a 64 bit presente su tutti i processori x86 dal Pentium. Conta il numero di tick dal reset. Istruzione RDTSC restituisce il TSC in EDX: EAX. Il suo codice operativo è 0F 31. [1] I concorrenti Pentium come Cyrix 6x86 non hanno sempre un TSC e possono considerare RDTSC un'istruzione illegale. Cyrix includeva un contatore di timestamp nel loro MII.

http://en.wikipedia.org/wiki/Time_Stamp_Counter

+0

Che cosa significa il ' "= A"' parte fare? – Lazer

+2

Ha anche problemi con alcuni processori AMD molticore, perché ognuno di essi ha un proprio contatore che non è sincronizzato, quindi se si esegue su diversi core quando si prendono i timestamp, si potrebbero avere sorprese. Quindi, chiedere al sistema operativo per questo thread di girare sullo stesso core sarebbe una buona idea. – ruslik

+0

@Lazer, è una piccola magia GCC che dice che i valori in EDX: EAX devono essere inseriti nella variabile C x - http://gcc.gnu.org/onlinedocs/gcc/Machine-Constraints.html#Machine-Constraints . Guarda la voce "A" sotto la sezione Intel. – dsolimano

Problemi correlati