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

StackOverflow https://stackoverflow.com/questions/3898107

  •  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.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top