【发布时间】:2013-10-16 09:11:43
【问题描述】:
__inline__ uint64_t rdtsc() {
uint32_t low, high;
__asm__ __volatile__ (
"xorl %%eax,%%eax \n cpuid"
::: "%rax", "%rbx", "%rcx", "%rdx" );
__asm__ __volatile__ (
"rdtsc" : "=a" (low), "=d" (high));
return (uint64_t)high << 32 | low;
}
我在我的程序中使用了上述 rdtsc 函数作为计时器: 以下代码产生 312-344 个时钟周期:
start = rdtsc();
stop = rdtsc();
elapsed_ticks = (unsigned)((stop-start));
printf("\n%u ticks\n",elapsed_ticks);
每次运行上述代码时,我都会得到不同的值。这是为什么?
我在 Visual C++ 中运行了相同的代码,它在“intrin.h”中使用了 rdtsc 函数。我得到了 18 个时钟的恒定值。是的,每次运行都是恒定的!有人可以解释一下吗?谢谢!
【问题讨论】:
-
你不需要内联汇编。 Get CPU cycle count? 有内在函数,以及一些关于警告的细节。