【问题标题】:likely()/unlikely() macros in the Linux kernel with a segmentation faultLinux 内核中的可能()/不太可能()宏存在分段错误
【发布时间】:2016-11-16 10:30:53
【问题描述】:

我了解可能()/不太可能()宏的工作原理,并且我也了解分支预测。不幸的是,我没有在高级编程的上下文中学习分支预测。

我想知道的是,可能/不太可能宏中的评估是否会导致分段错误,这对分支预测历史甚至当前结果/管道有何影响。

我不明白,如果预测的验证没有完成,我们怎么知道它是成功还是失败?

【问题讨论】:

  • 我认为这个问题的开头会分散您真正要问的内容,因为您想知道在推测性执行的分支被刷新的情况下分支预测是如何工作的,对吧?
  • 并非如此。是否冲洗的决定取决于评估,不是吗?我的问题是,如果评估无法完成怎么办。在这种情况下系统的状态是什么?
  • 是的,我就是这个意思。如果整个分支都被刷新,而不仅仅是它之后的代码。它与可能/不太可能完全无关,甚至也与异常无关(您可能只是破坏预测变量,异常是如此昂贵,以至于对 bp 准确性的影响并不重要) - 当这真正重要时'正在推测过去的几个分支,而您错误地预测了第一个分支。有几种解决方案。

标签: c gcc x86 branch-prediction likely-unlikely


【解决方案1】:

__builtin_expect(在the definition of the likely/unlikely macros 中使用)不会生成实际代码来评估其任一参数。它所做的只是告诉编译器如果它被评估会得到什么结果。

如果你告诉优化器 *(int*)NULL 通常是 13,它可能会混淆优化器,但是(除非编译器错误)它不会对编译器进行段错误,或生成在运行时出现段错误的代码。

Another answer on the old question 具有带有/不带有宏的实际 asm,表明它们的影响在于 gcc 如何布置代码(例如,将不太可能的情况自行排除,并将可能的情况放在失败未采取的一面条件分支,其中指令缓存未命中的可能性较小)。


这不是likely()/unlikely() macros in the Linux kernel - how do they work? What's their benefit? 的完全重复,但您会发现更多关于这些宏如何工作以及它们对问答的影响的信息。

【讨论】:

    猜你喜欢
    • 2014-02-17
    • 2011-07-13
    • 1970-01-01
    • 1970-01-01
    • 2012-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-16
    相关资源
    最近更新 更多