8

我正在为 C 中的一些非常短的操作编写一些微基准测试代码。例如,我正在测量的一件事是根据传递的参数数量调用一个空函数需要多少个周期。

目前,我在每次操作之前和之后使用 RDTSC 指令进行计时,以获取 CPU 的循环计数。但是,我担心在第一个 RDTSC 之前发出的指令可能会减慢我正在测量的实际指令。我还担心在第二个 RDTSC 发布之前,完整的操作可能还没有完成。

有谁知道在发出任何新指令之前强制所有正在进行的指令提交的 x86 指令?我被告知 CPUID 可能会这样做,但我一直无法找到任何这样说的文档。

4

1 回答 1

9

据我所知,没有专门“耗尽”管道的指令。这可以通过使用序列化指令轻松完成。

CPUID 是一个序列化指令,这正是您要查找的内容。每条指令在保证在 CPUID 指令之前执行之前发出。

因此,执行以下操作应该会获得预期的效果:

cpuid
rdtsc
# stuff
cpuid
rdtsc

但是,顺便说一句,我不建议您这样做。您的“东西”仍然会受到您无法控制的许多其他事物的影响(例如 CPU 缓存、系统上运行的其他进程等),您永远无法将它们全部消除。获得准确的性能统计信息的最佳方法是执行您想要测量至少几百万次的操作并平均批处理的执行时间。

编辑: CPUID 的大多数指令参考都会提到它的序列化属性,例如NASM 手册附录 B

编辑 2:也可能想看看这个相关的问题

于 2009-02-22T18:05:48.963 回答