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