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 이외의 다른 매개 변수에 영향을줍니다.
표현식에 대한 코드를 방출하지'C = (A + B) * 11000;'때문에 그것을 볼 수 있습니다 결과는 어디에서도 사용되지 않습니다. 컴파일러에서 생성 한 어셈블리를 살펴 보았습니까? – Blastfurnace
a, b 및 c를 휘발성으로 선언하십시오. –