我有以下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我考慮這種懸殊的價值?
多任務處理。你的過程不是系統中唯一的過程。 –
等待,編譯32位時定義'X86_64'? – Medinoc
如何輕鬆鎖定這三條指令以確保不會發生? – liv2hak