ReadThreadProfilingData() - 无法获取HPC值

时间:2015-10-09 06:35:19

标签: performancecounter

我遇到了ReadThreadProfilingData()的问题。我想要做的是计算当前线程执行的指令数量(仅限 在用户模式下执行的指令)。我不能直接使用RDPMC,因为我在用户模式下。 Windows提供的HPC API正是我所需要的。这是我的代码:

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()并没有真正读取任何内容。

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

2 个答案:

答案 0 :(得分:0)

我遇到了类似的问题,并且认为在启用线程分析之前可能需要调用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

然而,当我同时包含&#34; Windows.h&#34;时,我会收到数百个编译器错误。和&#34; ntddk.h&#34;。如果你找不到&#34; ntddk.h&#34;在您的系统上,您需要安装Windows驱动程序工具包(WDK)。

答案 1 :(得分:0)

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

或尝试使用英特尔PMU