C 读取显示奇怪值的时间戳计数器
我有下面的C文件rdtsc.C,它演示了在C中使用rdtsc()。我有64位版本和32位版本的条件编译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
#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