【发布时间】:2016-09-23 23:32:25
【问题描述】:
我试图了解使用 RDTSC/RDTSCP 测量时间时使用栅栏的正确方法。与此相关的几个关于 SO 的问题已经得到了详尽的回答。我已经经历了其中的一些。我还阅读了关于同一主题的这篇非常有用的文章: http://www.intel.com/content/dam/www/public/us/en/documents/white-papers/ia-32-ia-64-benchmark-code-execution-paper.pdf
但是,在另一个在线博客中,有一个在 x86 上使用 LFENCE 而不是 CPUID 的示例。我想知道 LFENCE 如何防止早期商店污染 RDTSC 测量值。 例如
<Instr A>
LFENCE/CPUID
RDTSC
<Code to be benchmarked>
LFENCE/CPUID
RDTSC
在上述情况下,LFENCE 确保所有较早的加载在它之前完成(因为 SDM 说:LFENCE 指令不能通过较早的读取。)。但是早期的商店(例如,Instr A 是商店)呢?我理解为什么 CPUID 有效,因为它是一个序列化指令,但 LFENCE 不是。
我在 Intel SDM VOL 3A 第 8.3 节中找到了一个解释,以下脚注:
LFENCE 确实为指令顺序提供了一些保证。在所有先前的指令在本地完成之前它不会执行,并且在 LFENCE 完成之前没有后面的指令开始执行。
所以本质上 LFENCE 就像一个 MFENCE。在那种情况下,为什么我们需要两条单独的指令 LFENCE 和 MFENCE?
我可能遗漏了一些东西。
提前致谢。
【问题讨论】:
标签: assembly x86-64 cpu-architecture atomic