【问题标题】:Is there a C/C++ API for reading CPU performance monitoring counters (PMC) on WIndows (for intel and AMD processors)?是否有用于读取 WIndows 上的 CPU 性能监控计数器 (PMC) 的 C/C++ API(适用于英特尔和 AMD 处理器)?
【发布时间】:2023-02-19 11:05:42
【问题描述】:

是否有用于读取 WIndows 上的 CPU 性能监控计数器 (PMC) 的 C/C++ API(用于英特尔和 AMD 处理器)?

到目前为止我发现了什么:

  1. https://icl.utk.edu/papi/ 非常好的 API 但似乎不支持 MS Windows

  2. https://www.agner.org/optimize/#testp 支持 Windows 但 API 功能有限,需要繁琐的工作流程 PMC 驱动程序“禁用驱动程序签名强制”

    令人惊讶的是,即使是 AMD 开发人员资源站点似乎也没有提供用于读取 AMD CPU 性能计数器的 C/C++-API(或者我是否忽略了某些东西?)

    编辑:找到了这个相关信息: https://randomascii.wordpress.com/2015/09/24/etw-central/

【问题讨论】:

  • 尝试寻找探查器而不是性能。 learn.microsoft.com/en-us/windows-hardware/test/wpt
  • -cup:问题具体是关于 API/库,而不是关于分析工具
  • 对硬件计数器进行编程需要内核支持。为了让每个用户空间任务都有计数器(而不是逻辑核心上的任何东西),你还需要内核支持来保存/恢复上下文切换的计数器,就像 Linux 支持 PAPI 一样。我猜想可能有一些带有内核驱动程序的库可以在 Windows 上使用,但似乎没有任何标准库。在 Linux 上,您也可以使用 perf/PAPI 以外的库,例如轻量级内核模块,只允许您在内核上编写计数器并在用户空间中使用rdpmc
  • @Peter Cordes:感谢您的评论。实际上,对于我的目的来说,在每个物理核心的基础上设置计数器就足够了(因为我在大多数时间关键循环中将线程固定到核心)。

标签: c++ c api cpu perf


【解决方案1】:

Windows 内核内置支持收集核心 PMC 计数器。这种支持采用内核 ETW 事件提供程序的形式。

通常,您会启用 ETW 提供程序并指定操作系统将事件数据写入内存缓冲区或文件。有记录的 API 和工具来摄取 ETW 跟踪文件。 Windows 附带一个名为 Windows Performance Recorder wpr.exe 的工具,它采用 XML 配置文件(已记录),并且可以处理将事件获取到 ETW 日志文件中的整个过程。对于 PMC 计数器,您可以指定另一种事件类型,如配置文件计时器滴答或线程上下文切换,并设置选项以将您选择的 PMC 计数器附加到这些事件。堆栈遍历也可以附加到生成诸如火焰图之类的东西所需的事件。您还可以在 PMC 计数器溢出时写入一个事件并设置溢出间隔,请参阅 PerfView 源代码。

操作系统附带一个工具,logman,可以将 ETW 日志文件转换为 XML 文件,然后您可以使用任何您想要的 XML 工具对其进行解析。 Logman 对于小的跟踪很方便,但在将二进制 ETW 日志转换为 XML 时会导致跟踪大小像 15:1 的扩展,因此对于大型跟踪来说不太好。还有一个 .Net 类库可以对 ETW 日志进行复杂的解码,在 nuget 上搜索 Microsoft.Diagnostics.Tracing.TraceEvent。源代码也在 PerfView 中。

有用于解码 ETW 跟踪的本机 API,也有一些 Python 库。使用本机 ETW 控制和接收器 API,还应该可以创建一个使用 PMC 事件的实时跟踪会话,尽管选项结构的确切格式很少(或根本没有)记录以启用 PMC 计数器。 Github 上的 PerfView 工具的 C# 源代码中有一些提示。

操作系统带有一组基本的通用 PMC 计数器类型,但您也可以使用注册表或作为 WPR 控制文件的一部分添加 CPU 特定类型。

所有这些都只是用户模式代码,内核模式部分已经是 x64 和 ARM64 平台上操作系统的一部分。

实现某些功能的最简单途径可能是创建一个 wpr 控制文件,使用 wpr 收集数据,然后使用 logman 将其转换为 XML。

【讨论】:

    猜你喜欢
    • 2018-08-17
    • 2018-05-16
    • 2010-11-21
    • 2018-12-23
    • 2012-02-04
    • 2023-03-24
    • 1970-01-01
    • 2013-03-06
    • 1970-01-01
    相关资源
    最近更新 更多