我正在寻找某种类型的库,它可以在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频率,即使其他工具显示动态频率变化。
我搜索了这样的库,但大多数结果都带有小工具等,但没用。
答案 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(读取时间戳)直接从处理器产生时钟计数。