Assembly 恒定的非不变tsc能否跨cpu状态改变频率?
我曾经使用rdtsc对Linux系统调用进行基准测试,以获得系统调用前后的计数器差异。我将结果解释为挂钟计时器,因为TSC以恒定速率递增,并且在进入停止状态时不会停止 不变TSC概念描述为 不变TSC将在所有ACPI p-、C-中以恒定速率运行。和 T型国家 将状态从C0(运行)更改为C1(停止)时,恒定的非不变tsc能否改变频率? 我目前的观点是,它不能只在性能(p)状态之间改变频率。因此,当使用非不变tsc时,应用rdtsc获取系统调用的挂钟计时器是不可靠的 我在我的Assembly 恒定的非不变tsc能否跨cpu状态改变频率?,assembly,x86-64,intel,cpu-architecture,rdtsc,Assembly,X86 64,Intel,Cpu Architecture,Rdtsc,我曾经使用rdtsc对Linux系统调用进行基准测试,以获得系统调用前后的计数器差异。我将结果解释为挂钟计时器,因为TSC以恒定速率递增,并且在进入停止状态时不会停止 不变TSC概念描述为 不变TSC将在所有ACPI p-、C-中以恒定速率运行。和 T型国家 将状态从C0(运行)更改为C1(停止)时,恒定的非不变tsc能否改变频率? 我目前的观点是,它不能只在性能(p)状态之间改变频率。因此,当使用非不变tsc时,应用rdtsc获取系统调用的挂钟计时器是不可靠的 我在我的/proc/cpuinf
/proc/cpuinfo
中没有找到不变的tsc标志,只有常量\u tsc
意味着不需要不变
造成混淆的原因是《英特尔系统编程手册》中的一句话:
较新处理器中的时间戳计数器可能支持增强,
称为不变TSC
因此,一些芯片(包括我的芯片)具有恒定但非不变的tsc。从Nehalem和Saltwell开始,所有英特尔处理器都支持不变的tsc,这意味着tsc在p、C和T状态之间以恒定速率递增(但不一定在S状态之间) 从奔腾4系列0F 03型开始,所有英特尔处理器都支持恒定TSC,这意味着TSC在p和T状态之间以恒定速率递增。TSC在HLT状态下继续增加(称为自动停止或C1/自动停止)。TSC在任何其他睡眠状态下都不会增加。这类处理器包括Bonnell 较旧的处理器不支持恒定TSC。TSC在HLT状态下继续增加,但在深度睡眠状态下不增加。在其中一些处理器上,TSC是有缺陷的 从S状态唤醒时,TSC值可能会重新初始化(为某些BIOS相关值) 这里是一个总结。“Y”表示TSC在指定类型的州内以相同的速率继续增加。“N”表示TSC以不同的速率继续增加或停止增加。在一些处理器上,TSC在S3状态和更低状态下递增(称为始终在TSC上)。“不适用”表示不支持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 |
最后一个非恒定tsc处理器是什么?你关心史前处理器吗?EOF:嗯,不,我不考虑非代码>康斯坦茨TSC < /代码>。但是拥有
常数并不意味着拥有不变量。嗯,对于我的处理器,在/proc/cpuinfo
中有一些与TSC相关的标志:TSC
,constant\u TSC
,nonstop\u TSC
,TSC\u known\u freq
,TSC\u deadline\u timer
,TSC\u adjust
。没有“不变”,但可能是“已知频率”?cpuinfo通过将常量\u TSC
和不间断\u TSC
放在一起来表示不变的TSC,您确定不只是有一个较旧的内核吗?所有这些东西只有一个CPUID特性位,但是Linux内核添加了几个不同的名称,因此它可以根据已知的CPU型号执行一些逻辑。我做了一些关于TSC特征位的研究,并把我的发现放在了报告中。但是较旧的内核在/proc/cpuinfo中没有显示不同的名称,例如,在我拥有的旧Core2系统上,只是constant\u tsc
。尽管它是不间断的,并且在内核之间同步。上次我在Linux内核源代码中编辑我的答案时,我去寻找关于不变TSC和常数TSC的信息。我没有发现Linux会为英特尔CPU设置一个功能标志,而不是另一个。如果我没有弄错的话,不变TSC和常数TSC都是相同的CPUID特征位(这很奇怪,对吧?CPUID中不应该有什么东西表明TSC将在更深的C状态中继续滴答滴答地运行?@PeterCordes只有一个不变TSC位,它是CPUID.0x8000007.EDX[8]
。是的,没有一点可以区分恒定TSC和非恒定TSC。注意,不变TSC也是常数。