Frage

Entnommen dieser SO Faden dieses Stück Code berechnet die Anzahl der CPU-Zyklen verstrichene Laufcode zwischen den Linien //1 und //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
$

Wie funktioniert die rdtsc() Funktion Arbeit?

War es hilfreich?

Lösung

Die Funktion führt den x86-Befehl RTDSC, die einen Opcode von 0x0f, 0x31 haben passiert. Der Prozessor verfolgt Taktzyklen intern, und dies liest diese Nummer.

Natürlich funktioniert dies nur auf x86-Procs, andere Prozessoren werden verschiedene Anweisungen benötigen.

  

Der Time Stamp Counter ist ein 64-Bit-Register auf allen x86-Prozessoren seit dem Pentium. Es zählt die Anzahl der Ticks seit zurückgesetzt. Instruction RDTSC gibt die TSC in EDX: EAX. Sein Opcode ist 0F 31 [1] Pentium Konkurrenten wie der Cyrix 6x86 haben nicht immer eine TSC und können RDTSC eine illegale Anweisung betrachten. Cyrix enthalten einen Time Stamp Counter in ihrer MII.

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top