gpt4 book ai didi

optimization - 优化分支预测:如何概括可以在不同的编译器,解释器和硬件预测下运行的代码?

转载 作者:行者123 更新时间:2023-12-03 17:30:22 25 4
gpt4 key购买 nike

今天,我因If语句而在一个紧密的循环中遇到了一些放慢的速度,这让我有些惊讶,因为我希望分支预测能够成功地对特定的语句进行流水线化以最大程度地降低条件语句的成本。

当我坐下来思考为什么不能更好地处理它时,我意识到我对分支预测的处理方式一无所知。我非常了解分支预测的概念,它有很多好处,但是问题是我不知道谁在执行它,以及他们使用什么方法来预测条件结果。

更深入地了解,分支预测可以在几个级别上完成:


带有指令流水线的硬件本身
C ++样式编译器
口译语言的翻译。
Java之类的半编译语言可以在上面做两个和三个。


但是,由于可以在许多领域进行优化,因此我对如何预测分支预测还不确定。例如,如果我使用Java编写,是否在编译,解释或在解释后由硬件优化条件?更有趣的是,这是否意味着如果有人使用其他运行时环境?在不同的解释器中使用不同的分支预测算法,是否会导致紧缩循环,而条件取决于条件,取决于运行哪个解释器,该条件显示出显着不同的性能?

因此,我的问题是,如果软件可以在非常不同的计算机上运行(这可能意味着不同的分支预测),那么如何围绕分支预测进行一般化优化?如果硬件和解释器可以更改其方法,则不能保证概要分析和使用证明最快的方法。让我们忽略C ++,如果您有编译级能力强制执行此操作,请查看解释的语言(如果仍然有人需要优化它们之间的紧密循环)。

无论使用哪种口译员,是否都有通常可以安全地做出的某些假设?是否需要深入研究一种语言的复杂规范才能对分支预测做出任何有意义的假设?

最佳答案

简短答案:

为了帮助提高分支预测器的性能,请尝试构建程序,以使条件语句不依赖于显然随机的数据。

细节

该问题的other answers之一声称:


无法使用高级语言做任何事情来优化分支预测,请确保可以缓存(有时可以缓存),但是分支预测并非没有。


但是,这根本不是事实。一个很好的例子来自most famous questions on Stack Overflow之一。

所有分支预测器都通过识别重复代码执行的模式并根据需要使用此信息来预测分支的结果和/或目标来工作。

用高级语言编写代码时,应用程序程序员通常不必担心尝试优化条件分支。例如,gcc具有__builtin_expect函数,该函数允许程序员指定条件分支的预期结果。但是,即使应用程序程序员确定他们知道特定分支的典型结果,通常也不必使用注释。在热循环中,使用此伪指令不太可能有助于提高性能。如果分支确实受到严重偏见,则即使没有程序员注释,预测器也将能够在大多数时间正确预测结果。

在大多数现代处理器上,分支预测器的性能都非常好(即使在复杂的工作负载下,其准确性也超过95%)。因此,作为微优化,尝试提高分支预测的准确性可能不是应用程序程序员想要关注的事情。通常,编译器会做得更好,以生成适用于它所针对的特定硬件平台的最佳代码。

但是分支预测器依赖于识别模式,并且如果以不存在模式的方式编写应用程序,则分支预测器的性能将很差。如果可以修改应用程序,以便存在某种模式,那么分支预测器就有机会做得更好。如果您发现分支的预测确实很差的情况,那么您可以在高级语言级别上考虑这一点。

关于optimization - 优化分支预测:如何概括可以在不同的编译器,解释器和硬件预测下运行的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34730220/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com