Question

Extrait de ce fil SO , ce morceau de code calcule le nombre de cycles de processeur écoulé entre les lignes de code en cours d'exécution et //1 //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 fonctionne la fonction rdtsc()?

Était-ce utile?

La solution

La fonction exécute l'instruction x86 RTDSC, ce qui arrive d'avoir un opcode de 0x0f, 0x31. Le processeur assure le suivi des cycles d'horloge interne, et ce lit ce nombre.

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

  

Le Time Stamp Counter est un cadeau de registre 64 bits sur tous les processeurs x86 depuis le Pentium. Il compte le nombre de tiques depuis la réinitialisation. Instruction RDTSC retourne le TSC dans EDX: EAX. Son opcode est 0F 31. [1] concurrents Pentium comme le Cyrix 6x86 ne sont pas toujours TSC et peuvent envisager une RDTSC d'instruction illégale. Cyrix inclus un timbre compteur de temps dans leur PPFI.

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top