诚然,我有一个有点愚蠢的问题。基本上,我想知道英特尔处理器是否提供了一些特殊机制来有效地执行一系列虚拟指令,即 NOP 指令?例如,我可以想象可能存在某种预取机制来识别 NOPS,丢弃它们并尝试获取一些有用的指令。或者这些 NOPS 是否作为正常指令发送到执行单元,这意味着我每个周期可以大致处理 5 个 nops(假设有 5 个执行单元)
谢谢,莱因哈德
诚然,我有一个有点愚蠢的问题。基本上,我想知道英特尔处理器是否提供了一些特殊机制来有效地执行一系列虚拟指令,即 NOP 指令?例如,我可以想象可能存在某种预取机制来识别 NOPS,丢弃它们并尝试获取一些有用的指令。或者这些 NOPS 是否作为正常指令发送到执行单元,这意味着我每个周期可以大致处理 5 个 nops(假设有 5 个执行单元)
谢谢,莱因哈德
丢弃它们将是一个非常糟糕的主意:它们通常用于忙于等待。如果你丢弃NOP
s,你会让你的等待循环比它应该的更紧,并且可能会引入相当大的通信开销。
如果您觉得NOP
s 效率低下,您可以尝试HLT
节省一些能源。或者你甚至可以让 CPU 进入睡眠状态。但是,只有当您想在相当长的时间内“什么都不做”并且它们通常需要管理程序权限时,这些才有意义。
不,它们被解码并作为正常指令执行;有硬件支持来消除错误的依赖,否则会在 EAX 寄存器上引入单字节 NOP,0x90(实际上是xchg eax, eax
),但仅此而已。
参考:英特尔(R) 64 和 IA-32 架构优化参考手册- 第 3.5.1.8 节,“使用 NOP”。
在 x86 架构上几乎不需要优化无操作序列,因为它具有不同长度的无操作编码。可以只使用单个多字节无操作,而不是许多单字节无操作。解码器需要做更多的工作,但实际的执行单元只看到一条要执行的指令。