常量非不变 tsc 能否在 cpu 状态下改变频率?

Can constant non-invariant tsc change frequency across cpu states?

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

不变的 TSC 概念被描述为

The invariant TSC will run at a constant rate in all ACPI P-, C-. and T-states.

常量非不变 tsc 可以在将状态从 C0(运行)更改为 C1(停止)时更改频率吗?

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

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

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

The time stamp counter in newer processors may support an enhancement, referred to as invariant TSC.

所以有些芯片(包括我的)有常数,但不是不变的tsc。

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

从奔腾 4 系列 0F 型号 03 开始​​,所有英特尔处理器都支持恒定 TSC,这意味着 TSC 在 P 和 T 状态下以恒定速率递增。 TSC 在 HLT 状态(称为 Auto Halt 或 C1/Auto Halt)中继续递增。 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  |