dsi*_*cha 11 performance assembly profiling x86-64 low-level
在汇编指令级别分析代码时,如果现代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.
Run Code Online (Sandbox Code Playgroud)
指令指针大部分时间用在哪条指令上?我可以为所有人想出好的论点:
mov RAX, [RBX] 大概需要100个周期,因为这是一个缓存未命中.mov RSI, [RBX + RCX]也需要100个周期,但可能与前一个指令并行执行.它甚至意味着指令指针位于其中一个或另一个上?xor R8, R8 可能在内存加载完成之前执行乱序并完成,但指令指针可能会保留在此处,直到所有先前的指令也完成为止.add RDX, RAX生成管道停顿,因为它RAX是在缓慢的缓存未命中加载之后实际使用值的指令.add RDI, RSI也停滞,因为它依赖于负载RSI.CPU保持虚构,即只有架构寄存器(RAX,RBX等),并且有一个特定的指令指针(IP).程序员和编译器以这个小说为目标.
然而,正如您所指出的,现代CPU不是按顺序执行或按顺序执行的.在程序员/用户请求IP之前,它就像量子物理学,IP是一波正在执行的指令; 所有这些都使处理器能够尽快运行程序.当您请求当前IP(例如,通过调试器断点或探查器中断)时,处理器必须重新创建您期望的小说,以便它折叠此波形(所有"飞行中"指令),将寄存器值收回到架构名称,并构建用于执行调试器例程的上下文等.
在此上下文中,有一个IP指示处理器应该恢复执行的指令.在无序执行期间,该指令是尚未完成的最早的指令,即使在中断时处理器可能正好在该点之后获取指令.
例如,中断可能表示mov RSI, [RBX + RCX];为IP,但xor已经执行并完成; 但是,当处理器在中断后恢复执行时,它将重新执行xor.