恒定非不变 tsc 可以改变 CPU 状态的频率吗?

Som*_*ame 3 assembly x86-64 intel cpu-architecture rdtsc

我曾经使用 rdtsc 对 Linux 系统调用进行基准测试,以获取系统调用前后的计数器差异。我将结果解释为挂钟定时器,因为 TSC 以恒定速率递增,并且在进入暂停状态时不会停止。

不变 TSC 概念描述为

不变的 TSC 将在所有 ACPI P-、C- 中以恒定速率运行。和 T 状态。

当状态从 C0(运行)更改为 C1(停止)时,恒定非不变tsc 是否可以改变频率?

我当前的观点是,它不能仅在性能(P)状态下更改频率。因此,在使用非不变 tsc 时,应用 rdtsc 获取用于系统调用的挂钟计时器并不可靠。

我在 my 中没有找到不变的 tsc 标志/proc/cpuinfo,只是constant_tsc意味着它没有必要不变

混乱的根源是英特尔系统编程手册中的一句话:

较新处理器中的时间戳计数器可能支持增强功能,称为不变 TSC。

所以有些芯片(包括我的)具有恒定的 tsc,但不是不变的。

Had*_*ais 7

从 Nehalem 和 Saltwell 开始,所有英特尔处理器都支持不变 TSC,这意味着 TSC 在 P、C 和 T 状态(但不一定在 S 状态)上以恒定速率递增。

从 Pentium 4 Family 0F Model 03 开始​​,所有 Intel 处理器都支持恒定 TSC,这意味着 TSC 在 P 状态和 T 状态下以恒定速率递增。TSC 在 HLT 状态(称为自动停止或 C1/自动停止)下继续递增。TSC 在任何其他睡眠状态下都不会增加。此类处理器包括 Bonnell。

较旧的处理器不支持恒定 TSC。TSC 在 HLT 状态下继续递增,但在更深的睡眠状态下则不会。在其中一些处理器上,TSC 存在缺陷。

从 S 状态唤醒时,TSC 值可能会重新初始化(某些与 BIOS 相关的值)。

这是一个总结。“Y”表示 TSC 在指定类型的状态中继续以相同的速率增加。“N”表示 TSC 要么继续以不同的速率递增,要么停止递增。在一些处理器上,TSC 在 S3 状态及更低状态下递增(这称为始终开启的 TSC)。“N/A”表示不支持 TSC。

                                  |   T   |   P   |C = HLT|C Other|S <= S3|S Other|
---------------------------------------------------
Nehalem+                          |   Y   |   Y   |   Y   |   Y   |   N   |   N   |
Silvermont Merrifield+Moorefield, |   Y   |   Y   |   Y   |   Y   |   Y   |   N   |
Saltwell Penwell+Cloverview
Other Saltwell+                   |   Y   |   Y   |   Y   |   Y   |   N   |   N   |
KNL+                              |   Y   |   Y   |   Y   |   Y   |   N   |   N   |
P4 90nm+                          |   Y   |   Y   |   Y   |   N   |   N   |   N   |
Enhanced Pentium M+               |   Y   |   Y   |   Y   |   N   |   N   |   N   |
Bonnell                           |   Y   |   Y   |   Y   |   N   |   N   |   N   |
Quark X1000                       |   Y   |   N   |   Y   |   N   |   N   |   N   |
KNC                               |   Y   |   N   |   Y   |   N   |   N   |   N   |
P5+                               |   Y   |   N   |   Y   |   N   |   N   |   N   |
Before P5                         |  N/A  |  N/A  |  N/A  |  N/A  |  N/A  |  N/A  |
Other Quark                       |  N/A  |  N/A  |  N/A  |  N/A  |  N/A  |  N/A  |
Run Code Online (Sandbox Code Playgroud)

  • 上次我编辑关于 [How to get the CPU Cycle count in x86\_64 from C++?](https://stackoverflow.com/a /51907627)。我没有发现 Linux 在任何地方取消了 Intel CPU 的一个功能标志,但没有取消另一个功能标志。如果我没记错的话,不变的 TSC 和恒定的 TSC 都是相同的 CPUID 功能位(这很奇怪,对吗?CPUID 中不应该有一些东西表明 TSC 将在更深的 C 状态中继续滴答作响吗?) (3认同)
  • @PeterCordes 不变的 TSC 只有一点,即“CPUID.0x80000007.EDX[8]”。是的,恒定 TSC 和非常量 TSC 之间没有任何区别。请注意,不变的 TSC 也是恒定的。 (3认同)