多核CPU频率

时间:2016-07-11 15:50:35

标签: c multicore

下面是代码我使用rdtsc测试我的计算机的CPU频率和计时功能。

/* Code only works on x86 machine compiling with GCC */

/* Keep track of most recent reading of cycle counter */
static unsigned cyc_hi = 0;
static unsigned cyc_lo = 0;

void access_counter(unsigned *hi, unsigned *lo)
{
  /* Get cycle counter */
  asm("rdtsc; movl %%edx,%0; movl %%eax,%1" 
      : "=r" (*hi), "=r" (*lo)
      : /* No input */ 
      : "%edx", "%eax");
}

double get_counter()
{
  unsigned ncyc_hi, ncyc_lo;
  unsigned hi, lo, borrow;
  double result;
  /* Get cycle counter */
  access_counter(&ncyc_hi, &ncyc_lo);
  /* Do double precision subtraction */
  lo = ncyc_lo - cyc_lo;
  borrow = lo > ncyc_lo;
  hi = ncyc_hi - cyc_hi - borrow;
  return (double) hi * (1 << 30) * 4 + lo;
}

void start_counter()
{
  access_counter(&cyc_hi, &cyc_lo);
}

void p()
{
  sleep(1);
}

int main(int argc, char const *argv[])
{
    /* Determine Clock Rate of Processor */
    double MHZ;
    int sleep_time = 10;
    start_counter();
    sleep(sleep_time);
    MHZ = get_counter() / (sleep_time * 1e6);
    printf("Processor Clock Rate ~= %.1f MHz\n", MHZ);
    /* cat /proc/cpuinfo */

    /* Time Function P */
    double tsecs;
    start_counter();
    p();
    tsecs = get_counter() / (MHZ * 1e6);
  printf("%.1f seconds\n", tsecs);
    return 0;
}

运行此程序后,它打印处理器时钟频率约为3591.8MHz,然后我运行cat /proc/cpuinfo,它显示有8个处理器(0~7),以及一些处理器&#39; cpu MHz不同,但没有人是3591.8Mhz。我想知道如何解释这个值,3591.8MHz?非常感谢。

2 个答案:

答案 0 :(得分:1)

CPU每秒可以重现数千次。它们旨在实现这一目标。您的程序可能正常工作并显示当前频率的快照,当您手动执行该猫之后未观察到该快照?此外,您的程序会创建一些工作负载,因此它可能会使一个CPU突然出现在一些深层次的hybernation状态,以便快速完成工作然后再回到睡眠状态。这是新的intel core i处理器的行为。你的CPU是什么?如果多次cat /proc/cpuinfo,您会得到相同的结果吗?

答案 1 :(得分:0)

如果您使用/proc/cpuinfo,则bogomips字段是稳定的,是CPU频率的2倍。

如果您有最近的处理器,它将具有TSC的固定[最大]时钟速率,在constant_tsc的{​​{1}}字段中由flags表示。这意味着即使处理器具有速度步长,它也不会发生变化。

所以,你想要的是最大CPU频率,你可以通过阅读:

/proc/cpuinfo

有关详情,请参阅我的回答:Getting TSC rate in x86 kernel