我正在为C中的一些非常短的操作编写一些微基准测试代码。例如,我测量的一件事是根据传递的参数数量调用空函数需要多少个周期。
目前,我在每次操作之前和之后使用RDTSC指令进行计时,以获得CPU的循环计数。但是,我担心在第一个RDTSC之前发出的指令可能会减慢我正在测量的实际指令。我还担心在第二个RDTSC发布之前,完整的操作可能还没有完成。
是否有人知道x86指令强制所有正在进行的指令在发出新指令之前提交?我被告知CPUID可能会这样做,但我一直无法找到任何说明的文档。
答案 0 :(得分:9)
据我所知,没有专门“消耗”管道的指令。这可以通过使用序列化指令轻松完成。
CPUID是一个序列化指令,这意味着您正在寻找的内容。在保证在CPUID指令之前执行之前,每条指令都会发出。
所以做以下事情应该会产生预期的效果:
cpuid
rdtsc
# stuff
cpuid
rdtsc
但是,顺便说一句,我不建议你这样做。你的“东西”仍然可能受到你无法控制的许多其他东西的影响(例如CPU缓存,系统上运行的其他进程等),你永远无法完全消除它们。获得准确性能统计信息的最佳方法是执行至少数百万次测量的操作,并平均批次的执行时间。
编辑: CPUID的大多数指令引用都会提及其序列化属性,例如NASM manual appendix B 。
编辑2 :您也可以查看this related question。