2013-08-19 2 views
1

C (Linux)에서 rdtsc를 이해하기 위해 매우 간단한 C 프로그램을 작성했습니다.이 프로그램은 아래에 나와 있습니다.이상한 결과를주는 rdtsc()

#include <stdio.h> 

static inline unsigned long long tick() 
{ 
     unsigned long long d; 
     __asm__ __volatile__ ("rdtsc" : "=A" (d)); 
     return d; 
} 

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

내 프로세서 구성은 다음과 같습니다. 이 프로세서 같다 출력으로부터

Architecture:   x86_64 
CPU op-mode(s):  32-bit, 64-bit 
Byte Order:   Little Endian 
CPU(s):    8 
On-line CPU(s) list: 0-7 
Thread(s) per core: 2 
Core(s) per socket: 4 
Socket(s):    1 
NUMA node(s):   1 
Vendor ID:    GenuineIntel 
CPU family:   6 
Model:     30 
Stepping:    5 
CPU MHz:    1197.000 
BogoMIPS:    5862.24 
Virtualization:  VT-x 
L1d cache:    32K 
L1i cache:    32K 
L2 cache:    256K 
L3 cache:    8192K 
NUMA node0 CPU(s):  0-7 

내 이해 초당 1,200 X 10^6 진드기가 1.2GHz의 것을 의미한다.

내 컴퓨터에서 실행할 때 위 프로그램의 결과가 88입니다. 놀랍지 만 'c = (a + b) * 11000;' 두 눈금 사이에서 여전히 출력이 88

1) 왜 출력이 증가되지 않고있다가. (그것은 약간 높은 문 위에 자신을 실행하는 데 걸리는 사이클에 따라 표시되어야합니다.)

2) 중 하나를합니까 위의 cpuinfo에 나열된 다른 매개 변수는 CPU MHz 이외의 다른 매개 변수에 영향을줍니다.

+2

표현식에 대한 코드를 방출하지'C = (A + B) * 11000;'때문에 그것을 볼 수 있습니다 결과는 어디에서도 사용되지 않습니다. 컴파일러에서 생성 한 어셈블리를 살펴 보았습니까? – Blastfurnace

+2

a, b 및 c를 휘발성으로 선언하십시오. –

답변

2

X86_64에서 rdtsc를 사용할 때 버그가 있습니다. http://gcc.gnu.org/bugzilla/show_bug.cgi?id=21249

틱()는 다음과 같이 correctd해야합니다 나는 당신의 최적화 컴파일러를 추측하고있어

static inline unsigned long long tick() 
{ 

    unsigned long low, high; 
    __asm__ __volatile__("rdtsc" : "=a" (low), "=d" (high)); 
    return ((unsigned long long)high << 32) | low); 


} 
관련 문제