【问题标题】:Is there any technology to "cache" the result of a branch choice?是否有任何技术可以“缓存”分支选择的结果?
【发布时间】:2020-12-13 07:22:13
【问题描述】:

在我的代码中有一个规则:如果if 语句为真,它将保持一段时间为真,如果它变为假,它将保持假一段时间。由于这段代码的性能很重要,我想让分支预测更有效。

目前我尝试的是编写这个if语句的两个版本,一个用“可能”优化,另一个用“不太可能”优化,并使用函数指针来保存要使用哪个,但由于函数指针也破坏了管道,基准测试似乎与普通的if 语句没有什么不同。所以我很好奇是否有任何技术可以让 CPU“记住”if 语句的最后一个选择?

或者,我真的需要关心这个吗?

【问题讨论】:

  • CPU 的分支预测器已经准备好了。如果前几次相同,它将继续使用该分支,直到它发生更改并且您错过了。然后它会重新评估。
  • CPU 已经这样做了,这叫做分支预测。
  • CPU 怎么能记住我代码中这么多if 语句?或者这是否意味着如果将代码移出 CPU 缓存,结果会被 CPU 遗忘?
  • @ravenisadesk 至少应该有一个缓冲区来跟踪哪些指令产生了哪些值。

标签: c++ cpu-architecture branch-prediction


【解决方案1】:

如果它在一段时间内保持不变,分支预测器会很快发现这一点。这就是为什么sorting an input sometimes makes code run significantly faster;随机未排序的数据不断地来回改变测试结果,没有分支预测器可以使用的模式,但是对于排序的数据,它有很长的运行时间,分支总是被采用或总是不被采用,这是最简单的 em> 分支预测器处理的情况。

不要想太多;让分支预测器完成它的工作。你不需要关心它。

【讨论】:

  • 您好,感谢您的回答,但是如果将if 语句移出CPU 缓存怎么办?是不是意味着 CPU 必须重新评估它?
  • 但是,如果您确实想过度考虑这一点,并且(可能)过度设计解决方案,请确保您配置文件以查看手动优化的复杂代码的性能提升多少超过了常规优化的简单代码。如果没有任何好处,或者性能更差,那就放弃复杂的代码。
  • ^ 这是必须的。如果你不分析你的代码,你实际上无法知道它需要在哪里加速。您可能会发现导致所有性能问题的是一段完全不同的代码。
  • @ravenisadesk:取决于分支预测器。但是,如果您的 if 语句很少被评估,以至于它经常从缓存中退出,那么它与您的整体性能无关。通常,你 90% 的时间花在 10% 的代码上(有时表述为 80% 和 20%,但原理相同),如果它从缓存中退出,它可能不是关键的 10% 的一部分,世界上所有的微优化都不会对您的整体性能产生有意义的影响。正如其他人所指出的,您需要分析才能知道首先要优化什么。
  • @ShadowRanger,非常感谢,我想现在我对分支预测的工作原理更加清楚了,看起来我对性能的考虑太多了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-03
  • 1970-01-01
  • 1970-01-01
  • 2010-11-12
  • 2020-08-14
  • 1970-01-01
相关资源
最近更新 更多