【问题标题】:Hardware performance counter APIs for Windows适用于 Windows 的硬件性能计数器 API
【发布时间】:2012-02-04 14:01:07
【问题描述】:

我想使用hardware performance counter,特别是 x86 CPU 来获取缓存未命中或分支错误预测。性能计数器在英特尔 VTune 等高级分析器中大量使用。请不要混淆 Windows 操作系统上的性能计数器。

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

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

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

【问题讨论】:

  • 介意我问:你在写真正的 bang-on-bits 代码吗?大多数 Windows 应用程序代码都远不及此。
  • 我本来打算推荐 VTune,但你已经提出来了。那么它有什么问题呢?
  • 不,我正在编写一些分析代码。所以,我需要 API 来编程。 Linux 可以使用 PAPI,但 Windows,我仍在寻找最新的 API 来使用硬件性能计数器。
  • 好像没有通用的API。当你需要这个时,你必须构建和使用你自己的驱动程序。由于开源项目无法签署驱动程序,这些项目就消亡了。启用测试签名后,您可以使用自签名驱动程序。
  • psapi 似乎仍然在其最新版本中包含其旧的 Windows 代码,最好更新它并提交补丁(因为我非常怀疑你会找到一个跨平台的 API迄今为止)。

标签: c performance profiling x86 x86-64


【解决方案1】:

这个HCP Reference 怎么样?它没有提供你想要的吗?

【讨论】:

    【解决方案2】:

    您可以使用RDPMC 指令或__readpmc MSVC 编译器内在函数,这是同一回事。

    但是,Windows 通过将 CR4.PCE 设置为 0 来禁止用户模式应用程序执行该指令。据推测,这是因为每个计数器的含义由 MSR 寄存器决定,这些寄存器只能在内核模式下访问。换句话说,除非您是内核模式模块(例如设备驱动程序),否则如果您尝试执行此指令,您将获得“特权指令”陷阱。

    如果您正在编写用户模式应用程序,您唯一的选择是(如 cmets 中提到的@Christopher)编写一个内核模块,它将为您执行此指令(您将招致用户->内核调用惩罚)并在您的机器上启用测试签名,以便可以加载您可能是自签名的“驱动程序”。这意味着您无法轻松分发此应用程序,但这适用于内部调整。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-17
      • 2011-10-29
      • 2015-03-24
      • 2011-05-07
      • 2013-03-06
      • 2020-05-19
      • 1970-01-01
      • 2012-05-20
      相关资源
      最近更新 更多