Linux 内核中存在分段错误的 likely()/unlikely() 宏
likely()/unlikely() macros in the Linux kernel with a segmentation fault
我了解 likely()/unlikely() 宏的工作原理,也了解分支预测。不幸的是,我没有在高级编程的背景下学习分支预测。
我想知道的是,如果 likely/unlikely 宏中的评估导致分段错误,这将如何影响分支预测历史甚至当前 outcome/pipeline.
我不明白如果预测的验证没有完成,我们怎么知道它是成功还是失败?
__builtin_expect
(used in the definition of the likely/unlikely macros) 不会生成实际代码来评估其任一参数。它所做的只是告诉编译器期望得到什么结果 if 它被评估了。
如果您告诉优化器 *(int*)NULL
通常是 13
,它可能会使优化器感到困惑,但是(除非编译器错误)它不会对编译器进行段错误,也不会生成在 [= 处发生段错误的代码28=]-次.
Another answer on the old question 具有实际的 asm with/without 宏,表明它们的作用在于 gcc 布局代码的方式(例如,将不太可能的情况单独搁置,而可能的情况在秋季-通过条件分支的未采取的一侧,指令缓存未命中的可能性较小)。
这与 likely()/unlikely() macros in the Linux kernel - how do they work? What's their benefit? 并不完全相同,但您会找到更多关于这些宏如何工作以及它们对问答有何影响的信息。
我了解 likely()/unlikely() 宏的工作原理,也了解分支预测。不幸的是,我没有在高级编程的背景下学习分支预测。
我想知道的是,如果 likely/unlikely 宏中的评估导致分段错误,这将如何影响分支预测历史甚至当前 outcome/pipeline.
我不明白如果预测的验证没有完成,我们怎么知道它是成功还是失败?
__builtin_expect
(used in the definition of the likely/unlikely macros) 不会生成实际代码来评估其任一参数。它所做的只是告诉编译器期望得到什么结果 if 它被评估了。
如果您告诉优化器 *(int*)NULL
通常是 13
,它可能会使优化器感到困惑,但是(除非编译器错误)它不会对编译器进行段错误,也不会生成在 [= 处发生段错误的代码28=]-次.
Another answer on the old question 具有实际的 asm with/without 宏,表明它们的作用在于 gcc 布局代码的方式(例如,将不太可能的情况单独搁置,而可能的情况在秋季-通过条件分支的未采取的一侧,指令缓存未命中的可能性较小)。
这与 likely()/unlikely() macros in the Linux kernel - how do they work? What's their benefit? 并不完全相同,但您会找到更多关于这些宏如何工作以及它们对问答有何影响的信息。