tal*_*eDa 5 x86 intel microbenchmark rdtsc cpuid
我正在尝试在 x86-64 处理器上分析执行时间的代码。我指的是这篇英特尔白皮书,并且还浏览了其他 SO 线程,讨论了在此处和此处使用 RDTSCP 与 CPUID+RDTSC 的主题。
在上面提到的白皮书中,使用 CPUID+RDTSC 的方法被称为不可靠,并且也使用统计数据进行了证明。
CPUID+RDTSC 不可靠的原因可能是什么?
此外,同一白皮书中的图 1(最小值行为图)和图 2(方差行为图)中的图具有“方波”模式。什么解释了这种模式?
我认为他们发现测量间隔内的 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 周期计数?以获得更好的方法。