我们的教员向我们提供了以下法典,这样我们就可以衡量一些算法的业绩:
#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;
}
然而,我需要该守则能够携带到具有不同邮联频率的机器。 为此,我试图计算该编码所运行的机体的频率:
int main(void)
{
double c1, c2;
start_counter();
c1 = get_counter();
sleep(1);
c2 = get_counter();
printf("CPU Frequency: %.1f MHz
", (c2-c1)/1E6);
printf("CPU Frequency: %.1f GHz
", (c2-c1)/1E9);
return 0;
}
问题是,结果总是零,我无法理解原因。 I mît(Arch)作为国际电离层光器的客人。
在一个朋友的机器(MacBook)上,它在某种程度上发挥了作用;我说,结果大于0,但因CPU的频率没有固定(我们试图固定,但出于某种原因,我们无法这样做)。 他拥有一台不同的机器,作为东道方,运行Lino(Ubuntu),还报告。 0. 这些规则排除了虚拟机器上的问题,我认为这是第一个问题。
为什么会发生这种情况,我如何确定?