我遇到了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()并没有真正读取任何内容。
我做错了什么?有没有其他方法来计算数量 指令由当前线程执行?
答案 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