该代码如何计算经过的CPU周期数?

时间:2010-10-09 22:22:36

标签: c cpu cpu-cycles

this SO thread获取,这段代码计算在行//1//2之间运行代码所经过的CPU周期数。

$ 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 个答案:

答案 0 :(得分:11)

该函数执行x86指令RTDSC,其恰好具有0x0f, 0x31的操作码。处理器在内部跟踪时钟周期,并读取该数字。

当然,这只适用于x86触发器,其他处理器需要不同的指令。

  

自Pentium以来,时间戳计数器是所有x86处理器上的64位寄存器。它计算自重置以来的滴答数。指令RDTSC在EDX:EAX中返回TSC。它的操作码是0F 31. [1]诸如Cyrix 6x86之类的奔腾竞争对手并不总是拥有TSC,并且可能认为RDTSC是非法指令。 Cyrix在其信息产业部中包括一个时间戳计数器。

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