【问题标题】:Can branch prediction cause illegal instruction?分支预测会导致非法指令吗?
【发布时间】:2014-01-25 13:31:56
【问题描述】:

在下面的伪代码中:

if (rdtscp supported by hardware) {
    Invoke "rdtscp" instruction
} else {
    Invoke "rdtsc" instruction
}

假设 CPU 不支持 rdtscp 指令,所以我们回退到 else 语句。

如果 CPU 错误预测了分支,指令流水线是否有可能尝试执行 rdtscp 并抛出 Illgal Instruction 错误?

【问题讨论】:

  • 应该不行。投机执行需要表现得好像它不是投机的。所以所有的错误(访问错误、对齐、非法指令等)都需要被抑制,直到你退出推测执行模式。
  • 这是一个很好的论点。不过,我希望有一些指向可靠来源的指针(例如英特尔手册)
  • 分支预测只是填充缓存?它实际上并没有执行,不是吗?
  • 乱序/推测执行和内存重新排序的黄金法则是“不要破坏单线程代码”。只要正确的代码始终正确运行,CPU 就可以在后台做任何事情。

标签: assembly x86-64 cpu-architecture branch-prediction


【解决方案1】:

指令陷阱,例如“非法指令”陷阱,在指令执行时生效,而不是之前。程序通常取决于程序在陷阱被抛出的那一刻处于什么状态,因此提前执行它们将是架构中的一个严重错误。

编辑:好的,好的。来自英特尔软件开发人员手册,第 3A 卷:

P6 系列处理器推测执行指令的能力不会影响通过以下方式处理中断 处理器。中断发生在指令退出阶段的指令边界处 执行;所以它们总是按“有序”指令流处理。

【讨论】:

    【解决方案2】:

    英特尔处理器手册第 3A 卷第 6.15 章明确记录了#UD 陷阱(无效的操作码执行):

    在实现乱序执行微架构的 Intel 64 和 IA-32 处理器中,此异常不 生成,直到尝试退出执行无效指令的结果;也就是说,解码和 推测性地尝试执行无效的操作码不会产生此异常。同样,在奔腾 处理器和更早的 IA-32 处理器,此异常不会作为预取和初步的结果生成 解码无效指令。

    【讨论】:

    • 这非常准确地回答了我的问题!谢谢。
    【解决方案3】:

    这取决于您如何定义“原因”。它可以产生一些可观察的效果吗?是的。

    正如 Hans 和 Sneftel 所指出的 - 异常、中断、陷阱等都在退休时发生,错误路径代码永远不会到达。因此,错误预测的分支不会导致错误路径指令的提交/退出,包括它们可能尝试执行的任何非法操作码。

    但是,错误预测的代码路径可能会以更微妙的方式影响微架构状态,您可能已经执行和缓存了加载、完成了页面遍历以及各种其他微架构事件 - 简而言之,所有艰苦的工作当你不小心去错误地预测某些分支时,你的 CPU 会执行此操作(这在 OOO CPU 中相当多)。我非常怀疑那里的任何 CPU 都会将所有这些东西从你的缓存/TLB 中捞出来,所以要考虑到这些东西以后会影响你的程序的性能(无论好坏),只是不在其功能行为上。

    如果您从事优化性能的业务(并且可能太复杂而无法使用),这可能不值得,但如果您从事保护代码的业务 - 一些黑客,则可能需要考虑可能有办法从缓存中嗅探此类数据。

    【讨论】:

    • 这是一个很好的观点。不过,对于我illegal instruction 的特殊情况,CPU 希望不会造成太大的损害!除了可能将其加载到指令缓存中。
    猜你喜欢
    • 2018-11-30
    • 2019-01-27
    • 2021-07-07
    • 1970-01-01
    • 1970-01-01
    • 2020-05-03
    • 1970-01-01
    • 2019-03-31
    • 2012-01-01
    相关资源
    最近更新 更多