2013-08-19 88 views
0

我有以下C文件rdtsc.c演示在C.I中使用rdtsc()有64位版本和32位版本的條件編譯。閱讀timestampcounter顯示奇怪的值

#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 

由於相同的操作是done.I肯定會期待值更urniform.How我考慮這種懸殊的價值?

+1

多任務處理。你的過程不是系統中唯一的過程。 –

+0

等待,編譯32位時定義'X86_64'? – Medinoc

+0

如何輕鬆鎖定這三條指令以確保不會發生? – liv2hak

回答

1

多任務處理的確應該是答案。 當您獲得更高的值(〜9000)時,您的進程將被搶佔。考慮到這一點,他們會看起來統一。

1

在多核CPU平臺上,'TSC'必須先同步。

您可以使用QueryPerformanceCounterQueryPerformanceFrequency

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