为什么 CPUID + RDTSC 不可靠?

tal*_*eDa 5 x86 intel microbenchmark rdtsc cpuid

我正在尝试在 x86-64 处理器上分析执行时间的代码。我指的是这篇英特尔白皮书,并且还浏览了其他 SO 线程,讨论了在此处此处使用 RDTSCP 与 CPUID+RDTSC 的主题。

在上面提到的白皮书中,使用 CPUID+RDTSC 的方法被称为不可靠,并且也使用统计数据进行了证明。

CPUID+RDTSC 不可靠的原因可能是什么?

此外,同一白皮书中的图 1(最小值行为图)和图 2(方差行为图)中的图具有“方波”模式。什么解释了这种模式?

Pet*_*des 4

我认为他们发现测量间隔内的 CPUID 会导致总时间出现额外的变化。他们在3.2 使用 RDTSCP 指令的改进CPUID中提出的修复方案强调了这样一个事实:当他们使用/RDTSC启动和RDTSCP/CPUID停止时,在定时间隔内没有 CPUID 。

也许他们可以在执行 CPUID 之前确保 EAX=0 或 EAX=1,以选择要读取哪个 CPUID 数据叶(http://www.sandpile.org/x86/cpuid.htm#level_0000_0000h),以防 CPUID 时间占用取决于您进行的查询。除此之外,我不确定为什么会这样。

或者更好的是,使用lfence而不是cpuid序列化 OoO exec,而不是完整的序列化操作。


请注意,英特尔白皮书中的内联汇编很糟糕:mov如果您使用适当的输出约束(例如"=a"(low), "=d"(high). 请参阅如何从 C++ 获取 x86_64 中的 CPU 周期计数?以获得更好的方法。