当在汇编指令级别对代码进行分析时,考虑到现代CPU不按顺序或顺序执行指令,那么指令指针的位置实际上意味着什么?例如,假设有以下x64汇编代码:
mov RAX, [RBX]; // Assume a cache miss here.
mov RSI, [RBX + RCX]; // Another cache miss.
xor R8, R8;
add RDX, RAX; // Dependent on the load into RAX.
add RDI, RSI; // Dependent on the load into RSI.
指令指针将在哪个指令上花费大部分时间? 对于所有这些指令,我都能想出很好的论据:
mov RAX,[RBX]
可能需要100多个周期,因为它是缓存未命中。mov RSI,[RBX + RCX]
也需要100多个周期,但可能与前一个指令并行执行。 那么指令指针在其中一个指令上是什么意思呢?xor R8,R8
可能会乱序执行,并且会在内存加载完成之前完成,但指令指针可能会停留在此处,直到所有先前的指令也完成。add RDX,RAX
生成管道停顿,因为它是实际使用RAX
值的指令,在缓慢的缓存未命中加载后才会使用它。add RDI,RSI
也会停顿,因为它依赖于对RSI
的加载。