Mvo*_*sek 5 c c++ benchmarking timing rdtsc
我从事编程语言分析器工作,正在寻找分辨率优于 100 ns 的 Windows 计时器解决方案。
QueryPerformanceCounter应该是一个答案,但在 Windows 10 上返回的频率为QueryPerformanceFrequency10 MHz,在 Windows 7 上甚至更低
GetSystemTimePreciseAsFileTime有 100 ns 刻度/步
RDTSC分辨率优于1ns,但随频率变化
我的目标分辨率至少为 10 ns。
目前最好的解决方案是什么?
如何QueryPerformanceCounter实施?是否可以轻松拆卸并提高分辨率?
是否可以RDTSC在每次频率变化时直接使用并跟踪/中断?
\n\n如何
\nQueryPerformanceCounter实施?
根据硬件的不同,QPC定时器在HAL中有不同的实现;它使用 TSC、HPET、RTC、APIC、ACPI 或 8254 定时器,具体取决于可用性。
\nQPC 定时器分辨率硬编码为 100ns。但这并不重要,因为对 QPC 的调用本身需要 >100ns。100ns在Windows世界中只是非常非常短的时间。
\n\n\n\n
RDTSC分辨率优于1ns,但随频率变化
事实并非如此,自 Nehalem 以来,TSC 频率实际上相当稳定。请参阅 Intel 64 架构 SDM 卷。3A,“17.16 不变 TSC”:
\n\n\n处理器系列以不同的方式递增时间戳计数器:
\n\n
\n- \n
适用于 Pentium M 处理器(系列 [06H]、型号 [09H、0DH]);对于 Pentium 4 处理器、Intel Xeon 处理器(系列 [0FH]、型号\n[00H、01H 或 02H]);对于 P6 系列处理器:时间戳计数器随着每个内部处理器时钟周期而递增。\n内部处理器时钟周期由当前核心时钟与总线时钟的比率决定。Intel SpeedStep 技术过渡\n也可能会影响处理器时钟。
\n- \n
适用于 Intel Xeon 处理器(系列 [0FH]、型号 [03H 及更高版本]);适用于 Intel Core Solo 和 Intel Core Duo\n处理器(系列 [06H],型号 [0EH]);适用于 Intel Xeon 处理器\n5100 系列和 Intel Core 2 Duo 处理器(系列 [06H],型号\n[0FH]);适用于 Intel Core 2 和 Intel Xeon 处理器(系列 [06H]、\nDisplayModel [17H]);对于 Intel Atom 处理器(系列 [06H]、\nDisplayModel [1CH]):时间戳计数器以恒定\n速率递增。该速率可以由处理器的最大核心时钟与总线时钟的比率来设置,或者可以由处理器启动时的最大解析频率来设置。最大解析频率可能与处理器基本频率不同,请参阅第 18.18.2 节了解更多详细信息。在某些处理器上,TSC 频率可能与品牌字符串中的频率不同。
\n较新处理器中的时间戳计数器可能支持增强功能,称为不变 TSC。\n处理器\xe2\x80\x99s 对不变 TSC 的支持由 表示
\nCPUID.80000007H:EDX[8]。\n不变 TSC 将在所有 ACPI P-、 C-。和 T 状态。这就是前进的架构行为。在具有不变 TSC 支持的处理器上,操作系统可以使用 TSC 来提供挂钟计时器服务\n(而不是 ACPI 或 HPET 计时器)。TSC 读取效率更高,并且不会产生与环转换或访问平台资源相关的开销。
因此,为了快速测量,您应该能够使用__rdtsc或__rdtscp。您可以在启动时校准 TSC 频率,并确保它不依赖于 CPU 状态。不过,线程仍然可以被抢占,因此最好多次重复测量或使用QueryThreadCycleTime(当然它有自己的开销)。在实践中,我发现RDTSC它并不像使用 rdtsc 计算系统时间中介绍的那么糟糕,尽管后者仍然是一个很好的读物。