Как этот код вычисляет количество прошедших циклов ЦП? - PullRequest
10 голосов
/ 10 октября 2010

Взято из этого потока 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 Ответ

11 голосов
/ 10 октября 2010

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

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

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

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

...