在代码中使用turboboost测量CPU频率

在代码中使用turboboost测量CPU频率,c,linux,performance,cpu,intel,C,Linux,Performance,Cpu,Intel,我在三台不同频率的计算机上分析一些代码。我需要频率来测量GFLOPs/s。我有一些代码可以做到这一点,但它没有考虑涡轮增压。例如,在我的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 dt

我在三台不同频率的计算机上分析一些代码。我需要频率来测量GFLOPs/s。我有一些代码可以做到这一点,但它没有考虑涡轮增压。例如,在我的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那样给出了负载下的工作频率

编辑:
我发现了一个程序,Powertop,用于Linux,它似乎显示了实际的操作频率。由于源代码是可用的,也许可以找出如何在我自己的代码中获得实际频率。

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

基本上,您可以为一个带有携带的循环依赖项的操作计时一个循环,该依赖项始终具有相同的延迟。比如说

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

for(inti=0;这说起来容易做起来难:谢谢,我已经读过那篇文章了(还有其他)。我想,我找不到简单的答案这一事实解释了为什么没有简单的解决方案。每次我切换计算机时都要更改代码中的值,这很烦人。@Mystical,你知道Powertop是如何获得实际频率的吗?我甚至从来没有听说过Powertop。Lol直到今天我也没有:-)总之,这是我在Linux上发现的唯一一个报告实际涡轮增压速度(如CPUz)的程序。代码是开源的