2013-08-19 3 views
0

다음 C 파일에서 rdtsc()를 사용하여 C에서 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; 
} 

난 껍질에서 루프에서 상기 프로그램을 실행.

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 

이후 같은 작업입니다은 아무 말 확실히 내가 값이 차이를 설명 할 urniform.How 값이 더 많은 것으로 예상되는?

+1

멀티 태스킹. 귀하의 프로세스가 시스템상의 유일한 프로세스는 아닙니다. –

+0

잠깐, 32 비트를 컴파일 할 때'X86_64'가 정의 되었습니까? – Medinoc

+0

어떻게 이러한 3 가지 지침을 쉽게 잠 그어 이것이 일어나지 않는지 확인하십시오. – liv2hak

답변

1

실제로 멀티 태스킹이 해답이어야합니다. 높은 값 (~ 9000)을 얻으면 프로세스가 선점됩니다. 이 점을 염두에두고 값을 보면 유니폼처럼 보일 것입니다.

1

멀티 코어 CPU 플랫폼에서 'TSC'는 먼저 동기화되어야합니다.

당신은 QueryPerformanceCounter을 사용할 수 있습니다

QueryPerformanceFrequency 참조 http://lwn.net/Articles/211051

관련 문제