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

Взятый из этого 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 ответ

Решение

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

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

Счетчик меток времени - это 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

Другие вопросы по тегам