Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 读取显示奇怪值的时间戳计数器_C_Linux_Rdtsc - Fatal编程技术网

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

C 读取显示奇怪值的时间戳计数器,c,linux,rdtsc,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 lo

我有下面的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;
}
我得到的输出如下所示

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

由于正在进行相同的操作。我当然希望这些值更加统一。我如何解释这些值之间的差异?

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

在多核CPU平台上,“TSC”必须首先同步

您可以使用
QueryPerformanceCounter
QueryPerformanceFrequency


参考

多任务处理。您的进程不是系统上唯一的进程。等等,
X86_64
是在编译32位时定义的?我如何轻松锁定这三条指令以确保不会发生这种情况?@Medinoc-您为什么这么说?据我所知,第一个函数用于64位系统,第二个函数用于32位系统。因为我看到第一个函数通过两个寄存器读取64位值,第二个函数通过一个寄存器读取。我可能读错了,因为我不太清楚
\uu asm\uuu
语法,但在我看来,函数好像被交换了。
ticks 96
ticks 108
ticks 8698
ticks 8613
ticks 108
ticks 84
ticks 96
ticks 108
ticks 96
ticks 96