Как этот код вычисляет количество пройденных циклов ЦП?

Взятый из этот поток SO, этот фрагмент кода вычисляет количество циклов процессора, прошедших текущий код между строками //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
$

Как работает функция rdtsc()?

Ответ 1

Функция выполняет инструкцию RTDSC x86, которая имеет код операции 0x0f, 0x31. Процессор отслеживает тактовые циклы внутри, и это считывает это число.

Конечно, это работает только на процессорах x86, другим процессорам понадобятся разные инструкции.

Счетчик временных меток - это 64-разрядный регистр, присутствующий на всех процессорах x86 с Pentium. Он подсчитывает количество тиков с reset. Инструкция RDTSC возвращает TSC в EDX: EAX. Его код операции равен 0F 31. [1] Конкуренты Pentium, такие как Cyrix 6x86, не всегда имели TSC и могут считать RDTSC незаконной инструкцией. Cyrix включил счетчик временных меток в их MII.

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