【问题标题】:Dummy operations handling of Intel processor英特尔处理器的虚拟操作处理
【发布时间】:2011-01-08 13:01:48
【问题描述】:

诚然,我有一个有点愚蠢的问题。基本上,我想知道是否 英特尔处理器提供了一些特殊机制来有效地 执行一系列虚拟指令,即 NOP 指令?例如,我可以想象那里 可能是某种识别 NOPS 的预取机制,丢弃它们 并尝试获取一些有用的指令。还是这些 NOPS 已派出 作为正常指令到执行单元,这意味着我可以大致处理 每个周期5个nops(假设有5个执行单元)

谢谢, 莱因哈德

【问题讨论】:

    标签: assembly x86 intel computer-architecture instruction-set


    【解决方案1】:

    丢弃它们将是一个非常糟糕的主意:它们通常用于忙于等待。如果您丢弃NOPs,您的等待循环就会比应有的更紧,并且可能会引入相当大的通信开销。

    如果你觉得NOPs 效率低,你可以试试HLT,这样可以节省一些能量。或者你甚至可以让 CPU 进入睡眠状态。然而,这些只有在你想在相当长的时间内“什么都不做”时才有意义并且它们通常需要管理员权限。

    【讨论】:

      【解决方案2】:

      没有。它们被解码并作为正常指令执行;有硬件支持来消除错误的依赖,否则会在 EAX 寄存器上引入单字节 NOP 0x90(实际上是 xchg eax, eax),但仅此而已。

      参考:Intel(R) 64 and IA-32 Architectures Optimization Reference Manual - 第 3.5.1.8 节,“使用 NOP”。

      【讨论】:

        【解决方案3】:

        几乎不需要在 x86 架构上优化无操作序列,因为它具有不同长度的无操作编码。可以只使用单个多字节无操作,而不是许多单字节无操作。解码器需要做更多的工作,但实际的执行单元只看到一条要执行的指令。

        【讨论】:

        • 感谢您的回答。从性能的角度来看,使用多字与多单 NOP 指令是否有所不同?或者这只是从代码大小的角度来看很有趣?
        • 很难准确地说出多字节 NOP 的性能影响是什么。我不知道他们是否都可以通过简单的解码器路径(您可能可以在某处查找)。如果他们需要复杂的解码器路径,并且它已经饱和,那么最好使用两个较小的 NOP。
        • 实际上,通过长 NOP 支持,您可以制作 1 到 15 个字节的任意大小的单个 NOP。如果你需要跳过更大的空格,那么 JMP 而不是 NOP。
        猜你喜欢
        • 1970-01-01
        • 2020-05-24
        • 1970-01-01
        • 1970-01-01
        • 2016-01-27
        • 1970-01-01
        • 1970-01-01
        • 2018-06-20
        • 1970-01-01
        相关资源
        最近更新 更多