performance - 指令级分析 : The Meaning of the Instruction Pointer?

标签 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.

指令指针将大部分时间花在哪条指令上?我可以为所有这些人想到好的论据:
  • 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/

    相关文章:

    performance - 调用接口(interface)函数比直接调用成员函数更快?

    python - 加速 Python 3.4 代码

    C - 架构独立函数调用插入

    ruby-on-rails - 是否有用于 Rails 的端口 mvc-mini-profiler?

    profiling - 从 GCSampledObjectAllocationHigh 转换 TypeId

    c - 是否可以对二进制文件中的某些代码片段而不是整个二进制文件使用 vtune?

    python - 如何重置多列的索引以匹配两个数据帧?

    performance - 如何在Hive中的 View 上运行查询?

    c - 了解 gdb 格式

    assembly - 为什么我们需要针对服务器,微型/大型机和混合核的不同CPU体系结构?