在Windows操作系统中,HPET是否可以直接访问?

11

我想使用高性能事件计时器(HPET)作为一种性能分析工具,以快速进行高精度测量。timeGetTime在1毫秒的情况下提供的分辨率不足够,并且QueryPerformanceCounter每次读取的速度比我想要的慢得多。在研究这个问题时,我发现了HPET,但是我找不到如何实际使用它的示例。

那么我可以直接使用它(汇编语言也可以),还是必须依赖于Win32 API中已经内置的多媒体/高性能定时工具?


1
我也很想使用它,因为我猜测我的分析器也有同样的问题。 - leppie
这似乎相关:http://msdn.microsoft.com/zh-cn/magazine/cc163996.aspx - ta.speot.is
进一步更新:当系统具有非恒定基础频率(系统内超频)时,RDTSC和QueryPerformanceCounter不安全使用。在这些情况下,Windows无法调整QPC频率,导致时间偏差。在这些情况下,HPET和ACPI仍然是可靠计时器的唯一选择。因此,这个问题仍然没有得到解答。 - Mysticial
@Mysticial 错了。这只适用于旧的 CPU 和系统。尝试运行此代码:https://randomascii.wordpress.com/2011/07/29/rdtsc-in-the-age-of-sandybridge/ 在发表错误陈述之前,请在您的系统上自行尝试! - xakepp35
你链接的文章不完整。它只涵盖了基于乘数的时钟缩放,而没有涵盖基础时钟缩放。任何有超频经验的人都知道基础时钟和乘数是分开的。在计算机已经启动的情况下更改基础时钟(通过超频实用程序,如Intel XTU)将影响rdtsc频率,因为rdtsc是从基础时钟派生出来的。此外,操作系统不知道在这种方式下更改基础时钟时重新校准其定时器。 - Mysticial
显示剩余5条评论
2个回答

1

我也对使用HPET作为计时器感兴趣。据我所知,QueryPerformanceCounter和QueryPerformanceFrequency实际上是在访问HPET的计数器和时钟,这在Windows XP下是可行的(例如,请参见http://www.geisswerks.com/ryan/FAQS/timing.html)。

因此,就计时代码而言,我认为通过使用QueryPerformanceCounter,实际上可以访问构成HPET基础的计数器,并且这些计数器都存在于芯片组中(而不是处理器中)。


2
据我所知,XP不支持HPET,因此QueryPerformanceCounter实际上使用的是RDTSC。 - O'Rooney
请参阅https://en.wikipedia.org/wiki/High_Precision_Event_Timer#cite_note-7(“使用和兼容性”中有关XP SP3的说明)以获取完整解释。简而言之,XP使用具有软件和各种硬件的“尽力而为”的HPET_仿真。 - ivan_pozdeev

-2
我在搜索中找到了这个信息,看起来它可能是最具成本效益的方法。当我有勇气进入汇编时,我会尝试它。 :) 更新 我用我的分析器测试了一下,虽然速度稍快,但似乎仍有很多其他开销 :((我没有关注时间,因为好像没有足够的好处)

3
不!不要使用RDTSC,在多核机器上会产生奇怪的问题。每个核心都有自己的计数器,可能会导致函数花费负时间等效果。时间戳计数器并不总是同步的!已经尝试过了。 - Nils Pipenbrinck
你说你跟踪线程?那会如何影响差异? - leppie
1
跟踪线程只会告诉你可能存在问题,而不是是否存在问题或如何解决它。要安全地使用RDTSC,必须将线程固定到特定的核心上。从用户空间安全计算跨核心的RDTSC差异是不可能的。 - Mihai Limbășan
8
如果有人看到这个内容,带有CPUID设置中TSC不变位的现代处理器可以安全地在没有亲和性的情况下使用RDTSC,并且没有任何风险会影响TSC速率,例如Speed Step或睡眠状态。 - ajs410
1
@ajs410...而且由于在Windows中可以使用__cpuid读取CPUID,因此这实际上是可以检查的。 - ivan_pozdeev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接