10 votes

Comment ce code calcule-t-il le nombre de cycles CPU écoulés ?

Tiré de ce fil de SO ce morceau de code calcule le nombre de cycles CPU écoulés en exécutant le code entre les lignes //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
$

Comment le rdtsc() fonctionne ?

11voto

dsolimano Points 5065

La fonction exécute l'instruction x86 RTDSC, qui se trouve avoir un opcode de 0x0f, 0x31 . Le processeur garde la trace des cycles d'horloge en interne, et ceci lit ce nombre.

Bien sûr, cela ne fonctionne que sur les processeurs x86, les autres processeurs auront besoin d'instructions différentes.

Le Time Stamp Counter est un registre 64 bits présent sur tous les processeurs x86 depuis le Pentium. Il compte le nombre de ticks depuis la réinitialisation. L'instruction RDTSC retourne le TSC dans EDX:EAX. Son opcode est 0F 31.[1] Les concurrents du Pentium tels que le Cyrix 6x86 n'ont pas toujours eu un TSC et peuvent considérer RDTSC comme une instruction illégale. Cyrix a inclus un Time Stamp Counter dans son MII.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X