分支预测变量结果是否在流程使用其时间片后保存

Are branch predictors results saved after process uses its timeslice

本文关键字:程使用 时间片 保存 变量 结果 结果是 是否 分支预测      更新时间:2023-10-16

在讨论期间,开发人员告知

  • 可能/不太可能的 GCC 优化
  • 将最常见的分支放在代码中的第一个

没有影响,在英特尔处理器上应忽略。所述原因是英特尔采用的动态分支预测。我有两个问题,找不到明确的答案:

  1. 分支预测数据是处理器(核心(的全局数据还是每个进程的?
  2. 如果是每个进程。Branch 目标缓冲区的结果是在整个进程中保存的,还是在使用进程时刷新,它的时间片和指令缓存被刷新或移动到另一个内核?

假设:

  • Linux目录
  • 天湖英特尔处理器
  • 将一个内核上运行的多个进程分开。

可能/不太可能的优化与分支预测无关。

当英特尔处理器遇到有条件的分支时,如果不采用该分支,则速度最快。在一个简单的 if/else 语句中,条件分支后跟 if 语句。因此,如果 else 语句在 99% 的时间内执行,则这不是最佳选择。编译器会将 if (condition( ifbranch else elsebranch 替换为 if (!condition( elsebranch else ifbranch,这样大多数时候分支不会被采用(如果这是可能/不太可能的优化告诉你的(。

或者考虑一个平均执行少于一次的循环(例如,每 100 次中只有一个(。通常编译器会提取l循环中独立于 oop 的代码。如果循环从未执行,那是浪费时间!您可以告诉编译器,循环可能未执行,并且不会提取与循环无关的代码。

换句话说,开发人员不知道他在说什么。也就是说,我们谈论的微优化很少有用,就像所有微优化一样,但这并不意味着它不起作用。

分支机构优化是按处理器进行的。不会刷新或存储和恢复任何内容。

分支预测数据是每个处理器的全局数据。

这意味着,当两个不同的分支共享相同的预测表条目时,共享同一处理器的多个进程将干扰彼此的分支预测。这称为别名。但在某种程度上,混叠也可能发生在单个进程中。

"过程切换和分支预测准确性"(David Chen 等人,2005 年(研究了使用每个过程的预测表的性能优势。他们发现"预测提高了0.5 – 3%"。但他们的结论是,"对于通用应用,由于必须实现和快速访问大量并行历史表,因此所提出的系统提供的好处有限,并且硬件成本很高。

我怀疑这个结论在几年后发生了变化。事实上,现代多核 CPU 可能会大大减少混叠。调度程序倾向于在同一内核上运行给定的线程/进程,以提高性能。因此,如果一个系统有 2 个高负载进程,它们将倾向于每个占用一个内核,并且几乎不会干扰每个(或任何(其他分支预测表。