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

这段代码如何计算经过的CPU周期数?,c,cpu,cpu-cycles,C,Cpu,Cpu Cycles,从中提取,这段代码计算运行代码在//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() { unsigne

从中提取,这段代码计算运行代码在
//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
$
$cat cyc.c
#包括
静态uuu内联uuu无符号长-长rdtsc(无效)
{
无符号长整型x;
__asm_uuuuuuuvolatile(.字节0x0f,0x31):“=A”(x));
返回x;
}
int main(){
无符号长周期=rdtsc();//1
cycles=rdtsc()-cycles;//2
printf(“时间为%d\n”,(无符号)周期);
返回0;
}
$gcc cyc.c-o cyc
美元/循环
时间是73
美元/循环
时间是74
美元/循环
时间是63
美元/循环
时间是73
$

rdtsc()
函数是如何工作的?

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

当然,这只适用于x86进程,其他处理器将需要不同的指令

时间戳计数器是自奔腾以来所有x86处理器上都存在的64位寄存器。它统计自重置后的刻度数。指令RDTSC返回EDX:EAX中的TSC。它的操作码为31。(1)Pentium竞争对手,如CyRix6x86b并不总是具有TSC,并且可以认为RDTSC是非法指令。Cyrix在他们的MII中包括一个时间戳计数器


部分的作用是什么?它在一些molticore AMD处理器上也有问题,因为它们都有自己的不同步计数器,因此,如果您在获取时间戳时碰巧在不同的内核上运行,您可能会感到意外。因此,让操作系统让这个线程在同一个内核上运行是个好主意。@Lazer,这是一个小小的GCC魔术,它说EDX:EAX中的值应该放在C变量x-中。查看“英特尔”部分下的“A”项。