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?
Che cosa significa il ' "= A"' parte fare? – Lazer
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
@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