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()
?
¿Qué significa el ' "= A"' parte hacer? – Lazer
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
@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