6

我正在寻找某种库,它可以在 Intel 和 AMD 处理器、32 位和 64 位 Windows 上定期为我提供准确的 CPU 频率值。

这样做的目的是准确测量给定计算机上的 CPU 负载。问题是调用QueryPerformanceCounter()返回时钟滴答(用于测量活动的持续时间),但由于 SpeedStep 或 TurboBoost,底层 CPU 频率不是恒定的。我发现有几台计算机在 BIOS 中关闭 SpeedStep / TurboBoost 并且不会阻止基于负载的 CPU 频率缩放。

我正在尝试查看是否有任何可用的库可用于检测 CPU 频率变化(很像Windows 7ThrottlestopCPU-Z的“概览”选项卡Resource Monitor),以便我可以查询并保存这些信息以及我的其他测量值. 性能计数器似乎没有返回可靠的信息,因为我的计算机总是返回 100% CPU 频率,即使其他工具显示动态频率变化也是如此。

我搜索了此类库,但大多数结果都带有无用的小工具等。

4

3 回答 3

7

您可以将高分辨率计时器与时钟周期计数器结合起来计算当前时钟速率。在现代 CPU 上,可以使用以下函数读取周期计数器:

static inline uint64_t get_cycles()
{
  uint64_t t;
  asm volatile ("rdtsc" : "=A"(t));
  return t;
}

请注意,这是每个 CPU 的,因此如果您的程序在 CPU 周围移动,您就有麻烦了。如果您了解平台上的 CPU 固定技术,您可能想尝试一下。

对于高分辨率时间测量,您可以使用中的工具<chrono>这是我关于该主题的半有用的帖子。

于 2012-05-08T19:09:02.687 回答
1

试着专注于你正在尝试做的事情,而不是如何去做。

你的最终目标是什么?

如果,如您所说,您正在尝试“测量给定计算机上的 CPU 负载”,那么在 Windows 上,使用“PdhOpenQuery”和“Pdh*”系列函数可能是一个好习惯。

另请参阅此 SO 答案:

如何从进程内部确定 CPU 和内存消耗?

于 2012-05-08T19:23:45.030 回答
1

考虑查看 __rdtsc 内在函数(Visual Studio 中的#include "intrin.h")。

这会通过 x86/x64 函数 RDTSC(读取时间戳)直接从处理器产生时钟计数。

于 2012-05-10T08:47:01.670 回答