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 确保所有内容看起来都完全像指令按程序顺序执行一样,除非可能更快。如果执行在地址 0x112 处停止,无论是由于中断、断点或任何其他原因,您将看到 %ecx 包含 div 的结果但没有添加的 0x13 .

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

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