Domanda

Tratto da questa SO filo , questo pezzo di codice calcola il numero di cicli di CPU trascorso dall'inizio esecuzione codice tra righe e //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
$

Come funziona la funzione di rdtsc()?

È stato utile?

Soluzione

La funzione esegue l'istruzione RTDSC 86, nel quale sono contenuti un opcode di 0x0f, 0x31. Il processore registra cicli di clock interno, e questo si legge quel numero.

Naturalmente, questo funziona solo su x86 procs, altri processori avranno bisogno di istruzioni differenti.

  

Il Time Stamp Counter è un registro a 64 bit presente su tutti i processori x86 in quanto il Pentium. Conta il numero di zecche dal reset. Istruzione RDTSC restituisce il TSC in EDX: EAX. Il suo codice operativo è 0F 31. [1] concorrenti Pentium come il Cyrix 6x86 non sempre hanno un TSC e possono prendere in considerazione RDTSC un'istruzione non valida. Cyrix incluso un timestamp contatore nella loro MII.

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top