当前位置:  开发笔记 > 编程语言 > 正文

排出Intel Core 2 Duo的指令流水线?

如何解决《排出IntelCore2Duo的指令流水线?》经验,为你挑选了1个好方法。

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

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

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



1> SoapBox..:

据我所知,没有专门"消耗"管道的指令.使用序列化指令可以很容易地实现这一点.

CPUID是一个序列化指令,这正是您正在寻找的.在保证在CPUID指令之前执行之前,每个指令都会发出.

因此,执行以下操作应获得所需的效果:

cpuid
rdtsc
# stuff
cpuid
rdtsc

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

编辑:对于大多数CPUID指令引用会提到它的序列化特性,如NASM手册附录B中.

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

推荐阅读
mobiledu2402851203
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有