作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在汇编指令级别分析代码时,鉴于现代 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
的负载. 最佳答案
CPU 认为只有架构寄存器(RAX、RBX 等)并且有特定的指令指针 (IP)。程序员和编译器以这种小说为目标。
然而,正如您所指出的,现代 CPU 不是串行或按顺序执行的。直到你程序员/用户请求IP,就像量子物理学,IP是一波正在执行的指令;所有这些都是为了让处理器可以尽可能快地运行程序。当您请求当前 IP(例如,通过调试器断点或分析器中断)时,处理器必须重新创建您期望的虚构,以便它折叠此波形(所有“飞行中”指令),将寄存器值收集回架构名称,并构建用于执行调试器例程等的上下文。
在这种情况下,有一个 IP 指示处理器应恢复执行的指令。在乱序执行期间,这条指令是尚未完成的最旧指令,即使在中断发生时,处理器可能正在获取远远超过该点的指令。
例如,也许中断指示 mov RSI, [RBX + RCX];
作为IP,但xor
已经执行并完成;然而,当处理器在中断后恢复执行时,它会重新执行异或。
关于performance - 指令级分析 : The Meaning of the Instruction Pointer?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17010178/
我是一名优秀的程序员,十分优秀!