我重写了整个问题,人们显然不理解它。
RDTSC 用于计算 CPU 周期,它随着 CPU 节流而变化。
目前,RDTSC 不随 CPU 节流而变化。
一些旧应用程序预计 RDTSC 会随着 CPU 节流而变化。
我如何让 RDTSC 满足他们的期望?
我不想分析代码,我不想重写大量代码,我不想强迫用户弄乱 BIOS 或内核权限,我只想让遗留应用程序按他们应该的方式工作。
简而言之,您无法通过轻按开关来做到这一点
英特尔开发人员手册 3B,第 17 章,明确阅读
不变的 TSC 将在所有 ACPI P-、C- 中以恒定速率运行。和 T 状态。这是向前发展的架构行为。
这是另一种告诉你没有办法切换回以前的行为的方式。
但是,如果你真的喜欢它,你可以尝试一些东西。
rdtsc
从可写的IA32_TIME_STAMP_COUNTER中获取其值。
所以你可以在不改变任何程序的情况下“伪造”读取rdtsc
,但你需要一个驱动程序。
更改IA32_TIME_STAMP_COUNTER以调整内部时钟计数可能不是那么容易。
我不记得自复位以来是否存在计算内部时钟的性能事件,如果有,那么理论上您只需读取该值并写入IA32_TIME_STAMP_COUNTER。
较新的 CPU 还支持IA32_TSC_ADJUST可用于以相对方式调整TSC :从 IA32_TSC_ADJUST 中添加/减去的任何内容都会从IA32_TIME_STAMP_COUNTER中添加/减去。因此,您可以减慢或加快计数器的速度。
无论哪种方式,您都需要:
我最近因为不相关的原因偶然发现了这个:
AMD Bulldozer 系列 (15h) CPU 具有新的 MSR:时间戳计数器比率 ( TscRateMsr
),如 AMD 优化手册中所述。他们建议 VMM“使用时间戳计数器比率功能来调整来宾 VM 的 TSC 频率”(第 12.16 节),但您也可以使用它来根据当前的频率缩放设置更改比率。
有关时间戳计数器比率 MSR 的更多信息,请参阅AMD 系列 15h 型号 00h-0Fh 处理器的 BIOS 和内核开发人员指南 (BKDG) 中的第 3.12 节“MSR - MSRC000_0xxx” 。
IDK 如果英特尔有类似的东西;我没看过
使用 CPU 性能计数器。它们在 Linux 中通过使用perf_event_open
syscall 可用。perf
或者,或者,您可以通过运行实用程序来全局测量您的程序需要多少 cpu 周期。