【发布时间】:2016-04-16 06:35:30
【问题描述】:
我今天在一个由 If 语句引起的紧密循环中遇到了一些减速,这让我有些惊讶,因为我希望分支预测能够成功地流水线化特定语句以最小化条件的成本。
当我坐下来思考为什么没有更好地处理它时,我意识到我根本不知道如何处理分支预测。我非常了解分支预测的概念及其好处,但问题是我不知道谁在实施它以及他们使用什么方法来预测条件的结果。 p>
深入了解我知道分支预测可以在几个层次上完成:
- 带有指令流水线的硬件本身
- C++ 风格的编译器
- 解释语言的翻译。
- 像 java 这样的半编译语言可以做到以上两三点。
但是,由于可以在许多领域进行优化,因此我不确定如何预测分支预测。例如,如果我用 Java 编写,我的条件是在编译时、解释时还是在解释后由硬件优化的!?更有趣的是,这是否意味着如果有人使用不同的运行时环境?在不同的解释器中使用不同的分支预测算法是否会导致基于条件的紧密循环显示出显着不同的性能,具体取决于运行它的解释器吗?
因此,我的问题是,如果软件可以在非常不同的计算机上运行,这可能意味着不同的分支预测,那么如何概括围绕分支预测的优化?如果硬件和解释器可以改变他们的方法,那么分析和使用任何一种被证明最快的方法都不能保证。让我们忽略 C++,因为您有编译级别的能力来强制执行此操作,如果有人仍然需要优化其中的紧密循环,请查看解释语言。
无论使用何种口译员,是否有某些通常可以安全做出的假设?是否必须深入研究一种语言的复杂规范才能对分支预测做出任何有意义的假设?
【问题讨论】:
-
这有点宽泛。非常一般地,分析并获得它将运行的硬件的平均值,并尝试从中进行优化。
-
我不会以解释语言为目标,因为它们具有“隐藏开销”,可能涉及您无法控制的分支。
-
关于您可以采取的唯一“可移植”措施是尽可能避免条件分支。见stackoverflow.com/a/17828251/1196549
标签: optimization branch-prediction