Как этот код вычисляет количество пройденных циклов ЦП?
Взятый из этот поток 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