是否有C/C++API用于读取WIndows(针对intel和AMD处理器)上的CPU性能监视计数器(PMC)



是否有C/C++API用于读取WIndows(针对intel和AMD处理器(上的CPU性能监视计数器(PMC(?

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

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

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

令人惊讶的是,即使是AMD开发者资源网站似乎也没有提供C/C++-API来读取AMD CPU性能计数器(或者我忽略了一些?(

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

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。