Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C Windows硬件性能计数器API_C_Performance_Profiling_X86_X86 64 - Fatal编程技术网

C Windows硬件性能计数器API

C Windows硬件性能计数器API,c,performance,profiling,x86,x86-64,C,Performance,Profiling,X86,X86 64,我想使用x86 CPU来获取缓存未命中或分支错误预测。性能计数器在英特尔VTune等高级分析器中大量使用。请不要混淆Windows操作系统上的性能计数器 为了在C/C++程序中使用这些计数器,可以使用PAPI: 这允许您轻松地使用性能计数器,但仅限于Linux。PAPI曾经支持Windows,但现在不支持了 是否有人最近尝试过在Windows上使用PAPI或其他API来使用硬件性能计数器?您可以使用指令或MSVC编译器内部,这是相同的 但是,Windows禁止用户模式应用程序通过将CR4.PCE

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

为了在C/C++程序中使用这些计数器,可以使用PAPI:

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

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

您可以使用指令或MSVC编译器内部,这是相同的

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


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

这又如何?它不能提供你想要的吗?

介意我问一下:你在写真正的爆炸式代码吗?大多数windows应用程序代码都离这不远。我本来打算建议使用VTune,但你已经提出了。那它怎么了?不,我在写一些分析代码。所以,我需要API来编程。Linux可以使用PAPI,但是Windows,我仍然在寻找使用硬件性能计数器的最新API。似乎没有通用API。当您需要这个时,您必须构建并使用自己的驱动程序。因为开源项目无法签署驱动程序,这些项目就消失了。当您启用testsigning时,您可以使用自签名驱动程序。psapi在其最新版本中似乎仍然包含其旧的windows代码,请更好地更新它并提交补丁(因为我非常怀疑您是否会找到最新的跨平台API)。