Assembly x86_64指令流水线:指令执行顺序
我对指令流水线有一些疑问 我有一个集会Assembly x86_64指令流水线:指令执行顺序,assembly,x86-64,cpu-architecture,instruction-set,Assembly,X86 64,Cpu Architecture,Instruction Set,我对指令流水线有一些疑问 我有一个集会 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。我的疑问是,当RIP位于0x111时,处理器是否会执行(指令流水线或命令更改/任何原因)0x112的指令。如果我在RIP0x111停止执
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
。我的疑问是,当RIP
位于0x111时,处理器是否会执行(指令流水线或命令更改/任何原因)0x112的
指令。如果我在RIP0x111
停止执行,是否有可能执行0x112
,并且%ecx
值为0X13
?否。一般规则是,管道等功能对任何单线程执行(即单核)都是完全透明的,而且CPU确保每件事情看起来都像是按照程序顺序顺序执行的指令,除了速度可能更快之外。如果执行在地址0x112
处停止,无论是由于中断或断点还是任何其他原因,您将看到%ecx
包含div
的结果,但没有添加0x13
可能在内部,机器已经执行了add
,可能使用了一些未命名的内部寄存器,但如果是这样,则机器负责“回滚”该执行,因此,架构寄存器%ecx
包含您能够检查它时应该包含的内容
在考虑性能时,管道和其他类型的执行/内存重新排序是相关的,但在考虑程序实际执行时则不相关。在多线程程序中是个例外,因为由于这些特性,一个线程执行的内存访问可能不会以相同的顺序被其他线程看到,并且在这种顺序很重要的某些情况下可能需要屏障。但是要明确的是,这不适用于单线程程序。div%ecx
有2个字节长,但是让我们假设它是一个1字节的指令,就像push%rcx
(就像div读取rcx一样),就玩具示例而言,这很好。这是一个(有用的)过于简化:执行顺序与内存顺序不同。存储地址和存储数据UOP可以按顺序完全执行,但存储缓冲区确保它们仅按程序顺序存储提交到L1d缓存。而且-在CPU体系结构术语中,“精确异常”是一种功能,它允许我们在某个任意点通过调试器或外部中断停止,并查看一致的状态,就好像按照程序顺序执行一样。这就是为什么从无序后端退出是按程序顺序进行的。(有人提出了一些避免顺序失效的方法,比如KIP,Kilo指令处理器:。人们想知道苹果的M1是否会做类似的事情,而不是用一个巨大的ROB来隐藏这么多的延迟。)还要注意,你可以在没有OoO exec的情况下进行内存重新排序:。(例如,使用记分板加载和弱顺序存储缓冲区在未命中缓存下命中。或者对于存储加载重新排序,仅使用存储缓冲区)。很高兴知道。也许我应该提到“流水线和其他类型的执行/内存重新排序”?是的,这句话很管用。