【问题标题】:Is QueryPerformanceFrequency accurate when using HPET?使用 HPET 时 QueryPerformanceFrequency 是否准确?
【发布时间】:2014-04-08 15:55:03
【问题描述】:

我在玩QueryPerformanceFrequency。 它曾经返回3.6 Mhz,但对于我想做的事情来说还不够。

我已使用此命令bcdedit /set useplatformclock true 启用HPET。现在它返回14.3 Mhz。太好了,它更精确……但事实并非如此。我很快意识到我没有得到我期望的粒度。

如果我尝试轮询QueryPerformanceCounter 直到它滴答作响,我能得到的最小增量是11,这意味着1.27Mhz。如果我尝试计算在一秒钟内可以从QueryPerformanceCounter 获得的不同值的数量,我会得到1.26Mhz

所以我想知道有没有办法真正充分利用14.3 Mhz

我使用的是 Windows 7,64 位系统,Visual Studio 2008。

【问题讨论】:

  • 您测量了调用 QPC 的成本。海森堡在 86 年前就预言,你真的需要这么高的分辨率。尤其是在以用户模式运行代码的多任务操作系统上。
  • 你说得对,我没有注意到。所以实际上使用HPET 将频率推到14.3Mhz 但是因为它需要~700ns 才能阅读它,所以真的没有意义......太好了

标签: c++ windows visual-c++ performancecounter


【解决方案1】:

众所周知,使用 HPET 硬件作为 QueryPerformanceCounter (QPC) 的来源会带来大量开销。

配置 HPET 时,QPC 的调用成本很高。

它提供 14.3 MHz,这表明精度很高,但正如您所发现的,它的调用速度不足以实际解析该频率。

因此,只要硬件能够这样做,Microsoft 就将 CPU 时间戳计数器 (TSC) 作为 QPC 的来源。 TSC 查询的开销要低得多。用于 QPC 的相关频率通常是 CPU 频率除以 1024;通常也有几兆赫兹。

在 TSC 模式下 QPC 的调用非常快,以至于许多连续调用可能会显示相同的结果(通常大约 20-30 次调用或 15-20 ns/调用)。 通过这种方式,您可以获得大约 10 倍的典型分辨率。 0.3 us(在 3.4 GHz CPU 上)。

您在切换到 HPET 之前观察到了 3.6 MHz。这可能是系统 ACPI PM 计时器 (3579545 Hz) 的标志,这表明您在切换到 HPET 之前没有在基于 TSC 的 QPC 上运行。

因此,无论哪种方式,运行 HPET 或 ACPI PM 定时器都会产生几兆赫兹范围内的可用分辨率。两者都无法公开性能计数器频率 (PCF) 给出的完整分辨率,因为对 QPC 的调用过于昂贵。只有基于 TSC 的 QPC 足够快并且能够实际对 QPC 进行过采样。

微软最近刚刚发布了有关此事的更多详细信息:

有关详细信息,请参阅Acquiring high-resolution time stamps (MSDN 2014)。

这是一篇综合性文章,包含大量示例和详细说明。 QPC用户必读。

...真正充分利用 14.3 Mhz 的方法?

很遗憾没有。

您可以从 Windows Sysinternals 运行 Coreinfo.exe 实用程序。 Sysinternals 已移至 Microsoft technet。这是链接:Sysinternals System Information Utilities。这将为您提供以下问题的答案:如何检查我的系统是否具有非不变 TSC?

总结:最好的分辨率/精度/粒度是基于TSC的QPC得到的。

顺便说一句:正确选择硬件作为 QPC 的资源也会影响新 GetSystemTimePreciseAsFileTime function(Windows 8 桌面及更高版本)的调用费用,因为它在内部使用 QPC。

【讨论】:

  • " TSC 查询的开销要低得多。用于 QPC 的相关频率通常是 CPU 频率除以 1024;通常也是几 MHz。"为什么使用 TSC 时 QPC 会有这么低的频率?我在我的系统上也看到了这一点(Windows 8.1,i7-3930K@3.20 GHz)的 QPC 频率为 3.12679 MHz,几乎是它“应该”的 1/1024。这是为什么呢?
  • @Quantumboredom:性能计数器频率源自“基本频率”。 CPU 频率从基本频率提升。 CPU 的速度变化(例如,通过能量方案或类似的方式)只会影响“升级”,但影响性能计数器频率。
猜你喜欢
  • 1970-01-01
  • 2011-03-25
  • 2010-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多