测量CPU频率(x86 / x64)

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

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

我试图查看是否有任何可用于检测CPU频率变化的库​​(很像Throttlestop / CPU-Z ,甚至是Windows 7 Resource Monitor的“概述”选项卡),以便查询和保存信息以及我的其他测量。 性能计数器似乎不会返回可靠的信息,因为即使其他工具显示dynamic频率变化,我的计算机始终会返回100%的CPU频率。

我search了这样的图书馆,但大多数结果回来了小工具等,这是没有用的。

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

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

请注意,这是每个CPU,所以如果你的程序移动CPU周围,你有麻烦。 如果你知道你的平台上的CPU固定技术,你可能想尝试一下。

对于高分辨率时间测量,您可以使用<chrono>的工具; 这里是关于这个话题的一个半实用的帖子 。

试着把重点放在你正在做的事上,而不是如何去做。

你的最终目标是什么?

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

看到这个答案以及:

如何确定一个进程内部的CPU和内存消耗?

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

这通过x86 / x64函数RDTSC(Read Timestamp)直接从处理器获得时钟计数。