我正在以三种不同的频率在三台不同的计算机上分析一些代码。我需要频率来测量 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,它似乎显示了实际的运行频率。由于源代码可用,也许可以弄清楚如何在我自己的代码中获得实际频率。