首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ReadThreadProfilingData () -无法获取HPC值

ReadThreadProfilingData () -无法获取HPC值
EN

Stack Overflow用户
提问于 2015-10-09 14:35:19
回答 2查看 248关注 0票数 2

我对ReadThreadProfilingData()有一个问题。我想要做的,是统计当前线程执行的指令数量(只统计在用户模式下执行的指令)。我不能直接使用RDPMC,因为我处于用户模式。Windows提供了HPC API,这正是我需要的。下面是我的代码:

代码语言:javascript
复制
PERFORMANCE_DATA pd;        
HANDLE           hdl, thd_hdl;

ZeroMemory(&pd, sizeof(PERFORMANCE_DATA) );

pd.Size            = sizeof(PERFORMANCE_DATA);
pd.Version         = PERFORMANCE_DATA_VERSION;
pd.HwCountersCount = 1;

thd_hdl = GetCurrentThread();
thd_hdl = OpenThread(THREAD_ALL_ACCESS, TRUE, GetCurrentThreadId() );

EnableThreadProfiling(thd_hdl, 0, (DWORD64)0x02, &hdl);
// this returns ERROR_SUCCESS

for(int i=0; i<10000000; i++ );     // do something
printf("Number of HPC returned: %d\n", pd.HwCountersCount );
ReadThreadProfilingData(hdl,READ_THREAD_PROFILING_FLAG_HARDWARE_COUNTERS, &pd);
// this also returns ERROR_SUCCESS

DisableThreadProfiling(hdl);

printf("Number of HPC returned: %d\n", pd.HwCountersCount );

在上面的代码中,我读取了性能计数器#1 (失效的指令)。

尽管所有函数都返回ERROR_SUCCESS,但pd.HwCountersCount为0,这意味着ReadThreadProfilingData()实际上不读取任何内容。

我哪里做错了?有没有其他方法来计算当前线程执行的指令数量?

EN

回答 2

Stack Overflow用户

发布于 2016-05-04 17:25:46

我有一个类似的问题,我认为可能有必要调用KeSetHardwareCounterConfiguration(...)在启用线程评测之前配置硬件计数器的函数:

https://msdn.microsoft.com/en-us/library/windows/desktop/dd796399%28v=vs.85%29.aspx

KeSetHardwareCounterConfiguration的帮助页面为:

https://msdn.microsoft.com/en-us/library/windows/hardware/ff553257%28v=vs.85%29.aspx

然而,当我同时包含"Windows.h“和"ntddk.h”时,我得到了数百个编译器错误。如果在系统上找不到"ntddk.h“,则需要安装Windows驱动程序工具包(WDK)。

票数 0
EN

Stack Overflow用户

发布于 2016-07-16 09:20:21

要分析硬件性能计数器,您需要一个驱动程序来配置计数器。性能计数器是为系统全局配置的,因此每个线程都可以访问相同的硬件计数器数据。必须先配置计数器,然后才能启用分析。有关配置硬件性能计数器的信息,请参阅Windows Driver Kit (WDK)中的KeSetHardwareCounterConfiguration函数。

或者尝试使用英特尔PMU

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33031438

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档