#include <stdio.h>
#include <unistd.h>
static unsigned cyc_hi = 0, cyc_lo = 0;
static void access_counter(unsigned *hi, unsigned *lo) {
asm("rdtsc; movl %%edx,%0; movl %%eax,%1"
: "=r" (*hi), "=r" (*lo)
: /* No input */
: "%edx", "%eax");
}
void start_counter() {
access_counter(&cyc_hi, &cyc_lo);
}
double get_counter() {
unsigned ncyc_hi, ncyc_lo, hi, lo, borrow;
double result;
access_counter(&ncyc_hi, &ncyc_lo);
lo = ncyc_lo - cyc_lo;
borrow = lo > ncyc_lo;
hi = ncyc_hi - cyc_hi - borrow;
result = (double) hi * (1 << 30) * 4 + lo;
return result;
}
然而,我需要这段代码能够在不同CPU频率的机器上移植运行。为此,我正在尝试像这样计算运行代码的机器的CPU频率:
int main(void)
{
double c1, c2;
start_counter();
c1 = get_counter();
sleep(1);
c2 = get_counter();
printf("CPU Frequency: %.1f MHz\n", (c2-c1)/1E6);
printf("CPU Frequency: %.1f GHz\n", (c2-c1)/1E9);
return 0;
}
问题在于结果总是为0,我不明白为什么。我作为虚拟机的客户端在VMware上运行Linux(Arch)。
在朋友的电脑上(MacBook),它在某种程度上工作;我的意思是,结果大于0,但它是可变的,因为CPU频率不固定(我们尝试修复它,但由于某些原因我们无法做到)。他有一台不同的机器,主机运行Linux(Ubuntu),也报告为0。这排除了问题出现在虚拟机上的可能性,这是我最初认为的问题所在。
你们有什么想法,为什么会发生这种情况,我该如何解决?
CPUID
),它会产生几乎毫无意义的结果。 - Jerry Coffingettimeofday()
或clock_gettime()
,其中包括CLOCK_MONOTONIC
或CLOCK_PROCESS_CPUTIME_ID
)。 - caf