x86_64指令流水线:指令执行顺序

我对指令流水线有一些疑问。

我有一个大会

0x111: div    %ecx
0x112: add    $0x13,%ecx  #The address 112 is not real, I just kept to show that there is no instructions between div and add

程序计数器,RIP 指向0x111. 我的疑问是,将处理器执行(指令流水线或顺序变化/不限原因)0x112's指令而RIP处于0x111。如果我在 RIP 停止执行0x111,是否有任何机会0x112被执行并且%ecx价值是0X13

回答

不。一般规则是,流水线等功能对任何单个执行线程(即单个内核)是完全透明的,并且 CPU 确保一切看起来都完全像指令按程序顺序依次执行一样,除非可能更快. 如果执行在 address 处停止0x112,无论是由于中断、断点还是任何其他原因,您都会看到%ecx包含 的结果div但没有添加0x13.

可能在内部,机器已经执行了add已经执行的操作,也许使用了一些未命名的内部寄存器,但是如果是这样,那么机器负责“回滚”这个执行,以便架构寄存器%ecx包含它应该执行的操作您可以检查它的时间。

在考虑性能时,流水线和其他类型的执行/内存重新排序是相关的,但在考虑程序实际做什么时则无关紧要。例外是在多线程程序中,因为由于这些特性,一个线程执行的内存访问可能不会被其他线程以相同的顺序看到,并且在这种顺序很重要的某些情况下可能需要屏障。但需要明确的是,这不适用于单线程程序。


以上是x86_64指令流水线:指令执行顺序的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>