这段代码如何计算经过的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”项。