Performance 如何避免大部分未清除的条件分支?
考虑以下情况:Performance 如何避免大部分未清除的条件分支?,performance,if-statement,assembly,optimization,branch-prediction,Performance,If Statement,Assembly,Optimization,Branch Prediction,考虑以下情况: 在整个代码中,宏经常执行某些操作。(例如一些异常处理) 这个宏通常做的很少,但在某些情况下会周期性地出现,因此宏必须做更多的工作 这可以很容易地实现,使用条件分支来选择是需要复杂代码还是简单代码,如果需要复杂代码则使用分支。。。但这可能导致以下严重的性能问题: 许多现代分支预测器对多个分支使用相同的预测结构,因此从其他分支收集的数据会影响每个分支的预测!因此,大多数时间未使用的大量分支可能会“混淆”分支预测器,从而对其他分支做出可怕的预测 我怎样才能避开这个问题 注
- 在整个代码中,宏经常执行某些操作。(例如一些异常处理)
- 这个宏通常做的很少,但在某些情况下会周期性地出现,因此宏必须做更多的工作
- 这可以很容易地实现,使用条件分支来选择是需要复杂代码还是简单代码,如果需要复杂代码则使用分支。。。但这可能导致以下严重的性能问题:
- 许多现代分支预测器对多个分支使用相同的预测结构,因此从其他分支收集的数据会影响每个分支的预测!因此,大多数时间未使用的大量分支可能会“混淆”分支预测器,从而对其他分支做出可怕的预测李>
(研究的起点可能是:像java这样的语言是如何绕过这个问题的?分支预测器通常会很好地识别几乎从未采用过的分支。我觉得你太担心这种情况了。我不知道。。。我的恐惧是基于我的工作方式。我认为如果你用从未执行过的树枝淹没它,它将变得毫无用处。。。我担心有很多预测因子都是一样的……也就是说,它会完美地识别这些分支,但会完全搞乱其余的分支。通常情况下,情况并非如此。分支预测器有足够的条目,很难将其与普通代码混淆。此外,除非相关代码很热门,否则偶尔的预测失误不太可能真的产生影响。@fuz:污染/稀释全球历史对于现代it-TAGE预测器(Haswell,Zen(?)来说似乎是一个合理的问题,其中预测的索引基于上一个
n
分支(如15到20?)的历史。但是我认为OP应该尝试用一个从未执行过的条件分支与一个普通的nop
作为失败的最佳案例基线来测试一些实际案例。(或者只是一条针对指令长度填充的cmp
指令,不使用jcc
,以保持前端对齐与cmp/jcc附近的对齐方式相同。)可能没有那么糟糕。