测量CPU频率(x86 / x64)

时间:2012-05-08 19:00:40

标签: c windows x86 64-bit cpu-speed

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

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

我正在尝试查看是否有可用于检测CPU频率变化的库​​(非常类似于Throttlestop / CPU-Z甚至Resource Monitor的概述标签在Windows 7中),以便我可以查询并保存此信息以及我的其他测量。性能计数器似乎没有返回可靠的信息,因为我的计算机总是返回100%的CPU频率,即使其他工具显示动态频率变化。

我搜索了这样的库,但大多数结果都带有小工具等,但没用。

3 个答案:

答案 0 :(得分:6)

您可以将高分辨率计时器与时钟周期计数器结合使用,以计算当前时钟频率。在现代CPU上,可以使用此功能读取循环计数器:

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

请注意,这是每个CPU,因此如果您的程序在CPU周围移动,则会遇到麻烦。如果您了解平台上的CPU钉扎技术,您可能希望尝试这些技术。

对于高分辨率时间测量,您可以使用<chrono>中的工具;这是关于该主题的半有用的post of mine

答案 1 :(得分:1)

尝试专注于你想要做的事情,而不是如何去做。

你的最终目标是什么?

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

也可以看到这个答案:

How to determine CPU and memory consumption from inside a process?

答案 2 :(得分:1)

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

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