2010-10-09 8 views
10

Tomado de this SO thread, este fragmento de código calcula la cantidad de ciclos de CPU transcurridos en el código de ejecución entre las líneas //1 y .¿Cómo calcula este código el número de ciclos de CPU transcurridos?

$ 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 
$ 

¿Cómo funciona la función rdtsc()?

Respuesta

11

La función ejecuta la instrucción x86 RTDSC, que pasa a tener un código de operación de 0x0f, 0x31. El procesador realiza un seguimiento interno de los ciclos del reloj, y este lee ese número.

Por supuesto, esto solo funciona con los procesadores x86, otros procesadores necesitarán instrucciones diferentes.

El contador de marca de tiempo es un registro de 64 bits presente en todos los procesadores x86 desde el Pentium. Cuenta el número de tics desde el reinicio. Instrucción RDTSC devuelve el TSC en EDX: EAX. Su código de operación es 0F 31. [1] Los competidores de Pentium como el Cyrix 6x86 no siempre tienen un TSC y pueden considerar que RDTSC es una instrucción ilegal. Cyrix incluyó un contador de sellos de tiempo en su MII.

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

+0

¿Qué significa el ' "= A"' parte hacer? – Lazer

+2

También tiene problemas en algunos procesadores AMD de tipo molticore, porque cada uno de ellos tiene su propio contador que no está sincronizado, por lo que si se ejecuta en diferentes núcleos cuando toma las marcas de tiempo, puede tener sorpresas. Por lo tanto, pedirle al SO que este subproceso se ejecute en el mismo núcleo sería una buena idea. – ruslik

+0

@Lazer, es un poco de magia GCC que dice que los valores en EDX: EAX deben colocarse en la variable C x - http://gcc.gnu.org/onlinedocs/gcc/Machine-Constraints.html#Machine-Constraints . Mire la entrada "A" en la sección de Intel. – dsolimano

Cuestiones relacionadas