Pregunta

Tomado de este SO hilo , esta pieza de código calcula el número de ciclos de la CPU transcurrido la ejecución de código entre las líneas //1 y //2.

$ 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()?

¿Fue útil?

Solución

La función ejecuta la RTDSC de instrucciones x86, que pasa a tener un código de operación de 0x0f, 0x31. El procesador mantiene un registro de ciclos de reloj internamente, y esto se lee ese número.

Por supuesto, esto sólo funciona en x86 procsos, otros procesadores necesitarán diferentes instrucciones.

  

El Time Stamp Counter es un registro de 64 bits presente en todos los procesadores x86 desde el Pentium. Se cuenta el número de garrapatas desde la restauración. RDTSC instrucción devuelve el TSC en EDX: EAX. Su código de operación es 0F 31. [1] Pentium competidores tales como el Cyrix 6x86 no siempre tienen un CET y pueden considerar RDTSC una instrucción ilegal. Cyrix incluye una marca de tiempo del contador en su MII.

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top