【问题标题】:Measure CPU frequency with turboboost in code在代码中使用 turboboost 测量 CPU 频率
【发布时间】:2013-04-13 06:25:33
【问题描述】:

我正在以三种不同的频率在三台不同的计算机上分析一些代码。我需要频率来测量 GFLOPs/s。我有一些代码可以做到这一点,但它不考虑 Turboboost。例如,在我的 2600k CPU 上,它报告为 3.4 GHz,但当我运行 CPUz 时,我可以看到我的 CPU 以 4.3 GHz(超频)运行,因为我的代码使用了所有内核。

#include "stdint.h"
#include "stdio.h"
#include "omp.h"
int main() {
    int64_t cycles = rdtsc(); double dtime = omp_get_wtime();
    //run some code which uses all cores for a while (few ms)   
    dtime = omp_get_wtime() - dtime;
    cycles = rdtsc() - cycles;
    double freq = (double)cycles/dtime*1E-9;
    printf("freq %.2f GHz\n", freq);
}
__int64 rdtsc() {
#ifdef _WIN32
    return __rdtsc();
#else
  uint64_t t;
  asm volatile ("rdtsc" : "=A"(t));
  return t;
#endif
}  

我知道这个问题已经被问过很多次了,有不同的答案,但我仍然不清楚这是否可以做到。我不在乎黑客试图更改计时器。此代码仅供我自己使用。是否有可能在代码中获得实际频率?这是如何在 Linux 上完成的?我在 linux 上找到的每个示例都给出了基本频率(或者可能是最大值),但没有像 CPUz 那样给出负载下的工作频率。

编辑: 我找到了一个用于 Linux 的程序 Powertop,它似乎显示了实际的运行频率。由于源代码可用,也许可以弄清楚如何在我自己的代码中获取实际频率。

【问题讨论】:

  • 说起来容易做起来难:stackoverflow.com/questions/8351944/…
  • 谢谢,我已经阅读了该主题(以及其他内容)。我想我找不到简单答案的事实解释了为什么没有简单的解决方案。每次切换计算机时都必须更改代码中的值,这很烦人。
  • @Mysticial,你知道Powertop是如何得到实际频率的吗?
  • 我从未听说过 Powertop。大声笑
  • 直到今天我都没有 :-) 无论如何,它是我在 Linux 上找到的唯一一个报告实际涡轮增压速度的程序,如 CPUz。代码开源en.wikipedia.org/wiki/PowerTOP

标签: c linux performance cpu intel


【解决方案1】:

我终于解决了这个问题。无需设备驱动程序或读取特殊计数器即可在代码中测量实际工作频率。

基本上,您为具有携带循环依赖项的操作计时循环,该依赖项总是需要相同的延迟。例如

for(int i=0; i<spinCount; i++) {
    x = _mm_add_ps(x,_mm_set1_ps(1.0f));
}

您在绑定到每个物理内核(非逻辑)内核的线程中运行此循环。要求系统中没有其他线程然后这些线程占用任何大量的 CPU 时间,因此这种方法并不总是给出正确的答案,但在我的情况下它工作得很好。在单插槽系统和多插槽系统上,我得到的结果与 Nahalem、Ivy Bridge 和 Haswell 上的一个线程和多个线程的正确涡轮频率偏差小于 0.5%。我在how-can-i-programmatically-find-the-cpu-frequency-with-c描述了这个细节,所以我不会在这里重复所有细节。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多