Как этот код рассчитывает количество циклов ЦП истекло?
-
29-09-2019 - |
Вопрос
Взято из это так нить, Этот кусок кода рассчитывает количество циклов CPU, прошедшим запущенным кодом между линиями //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()
функциональная работа?
Решение
Функция выполняет инструкцию X86 RTDSC, что происходит, чтобы иметь OPCode 0x0f, 0x31
. Анкет Процессор отслеживает циклы тактовых циклов внутри, и это гласит это число.
Конечно, это работает только на x86 Procs, другим процессорам понадобятся разные инструкции.
Счетчик Time Time - это 64-битный регистр, присутствующий на всех процессорах X86, так как Pentium. Это считает количество клещей с момента сброса. Инструкция RDTSC возвращает TSC в EDX: EAX. Его операционный код 0F 31. [1] У конкурентов Pentium, такие как Cyrix 6x86, не всегда имели TSC и могут рассмотреть RDTSC незаконной инструкции. Cyrix включал счетчик метки времени в их MII.