2009-02-22 63 views
8

我正在为C中的一些非常短的操作编写一些微型基准测试代码。例如,我测量的一件事是根据传递的参数数量调用一个空函数需要多少个周期。排空英特尔Core 2 Duo的指令流水线?

目前,我在每次操作前后使用RDTSC指令计时以获得CPU的周期数。但是,我担心在第一个RDTSC之前发布的指令可能会减慢我测量的实际指令速度。我还担心在第二个RDTSC发布之前,整个操作可能没有完成。

有没有人知道在发布任何新指令之前强制执行所有飞行中指令的x86指令?我被告知CPUID可能会这样做,但我一直无法找到任何说明的文档。

回答

9

据我所知,没有具体“消耗”管道的指令。这可以通过使用串行化指令轻松完成。

CPUID是一个序列化指令,这意味着你正在寻找什么。每个指令在CPUID指令之前保证执行之前都会发出。

这样算下来以下应该得到预期的效果:

cpuid 
rdtsc 
# stuff 
cpuid 
rdtsc 

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

编辑: CPUID的大多数指令参考将提及其序列化属性,例如NASM manual appendix B

编辑2:也可能想看看this related question

+1

你是对的围栏说明。 CPUID实际上暗示了它们(我删除了我的答案)。请注意,当CPUID序列化时,它不会清除缓存,这也可能会影响性能。缓存可以用WBINVD清除。您可能想将其添加到您的答案中。 – 2009-02-22 19:54:48