Windows硬件性能计数器API

12

我想使用硬件性能计数器,具体来说是x86 CPU,以获取缓存未命中或分支预测失败。性能计数器在高级分析工具(如Intel VTune)中广泛使用,请不要将Windows操作系统上的性能计数器与之混淆。

为了在C/C++程序中使用这些计数器,可以使用PAPI:http://icl.cs.utk.edu/papi/

这使您可以轻松使用性能计数器,但仅限于Linux。 PAPI曾经支持Windows,但现在不再支持。

最近有人尝试过PAPI或其他API在Windows上使用硬件性能计数器吗?


不介意我问一下吗:你写的是真正高效的代码吗?大多数 Windows 应用程序的代码都远远达不到那个水平。 - Mike Dunlavey
我本来想建议使用VTune,但你已经提到了它。那么它有什么问题吗? - Mahmoud Al-Qudsi
不,我正在编写一些性能分析代码。因此,我需要编程的API。Linux可以使用PAPI,但是在Windows上,我仍在寻找最新的API以使用硬件性能计数器。 - Nullptr
3
似乎没有通用的API可供使用。需要使用时,您必须构建并使用自己的驱动程序。由于开源项目无法签名驱动程序,这些项目逐渐消失。当您启用测试签名时,可以使用自签名的驱动程序。 - Christopher
PSAPI似乎在最新版本中仍包含其旧的Windows代码,最好更新并提交补丁(因为我非常怀疑你能找到一个跨平台的最新API)。 - Necrolis
2个回答

8
您可以使用RDPMC指令或__readpmc MSVC编译器内置函数,它们是相同的内容。
然而,Windows通过将CR4.PCE设置为0来禁止用户模式应用程序执行此指令。据推测,这是因为每个计数器的含义由MSR寄存器确定,只有内核模式才能访问这些寄存器。换句话说,除非您是内核模式模块(例如设备驱动程序),否则如果您试图执行此指令,您将会得到“特权指令”陷阱。
如果您正在编写用户模式应用程序,则唯一的选择是(如@Christopher在评论中提到的)编写一个内核模块,该模块将为您执行此指令(您将会遭受用户->内核调用惩罚),并在您的机器上启用测试签名,以便您的自签名“驱动程序”可以加载。这意味着您无法轻松分发此应用程序,但对于内部优化来说,这个方法是可行的。

2

这个HCP参考怎么样?它不提供你想要的吗?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接