读取时间戳计数器显示奇怪的值

时间:2013-08-19 07:22:55

标签: c linux rdtsc

我有以下C文件rdtsc.c,它演示了在C.中使用rdtsc()我对64位版本和32位版本都进行了条件编译。

#include <stdio.h>


#ifdef X86_64
static inline unsigned long long tick()
{

    unsigned long low, high;
    __asm__ __volatile__("rdtsc" : "=a" (low), "=d" (high));
    return ((unsigned long long)high << 32) | low);
}
#else
static inline unsigned long long tick()
{
     unsigned long long d;
     __asm__ __volatile__ ("rdtsc" : "=A" (d) );
     return d;
}
#endif

int main()
{
        long long res;
        volatile int a = 1;
        volatile int b = 3;
        volatile int c = 0;
        res=tick();
        c = (a + b)*11000;
        res=tick()-res;
        printf("ticks %lld",res);
        return 0;
}

我在shell中循环运行上面的程序,如下所示。

for i in {1..10} ; do { ./a.out ; printf "\n"; } ; done

我得到的输出如下。

ticks 96
ticks 108
ticks 8698
ticks 8613
ticks 108
ticks 84
ticks 96
ticks 108
ticks 96
ticks 96

由于正在进行同样的操作。我当然希望这些值更加美观。我如何解释这些值的差异?

2 个答案:

答案 0 :(得分:1)

多任务确实应该是答案。 当您获得更高的值(~9000)时,您的进程将被抢占。考虑到这些价值,他们看起来是统一的。

答案 1 :(得分:1)

在多核CPU平台上,'TSC'必须首先同步。

您可以使用QueryPerformanceCounterQueryPerformanceFrequency

参考http://lwn.net/Articles/211051