在流程使用其时间片

时间:2016-01-31 18:22:05

标签: c++ linux gcc intel

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

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

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

  1. 处理器(核心)的分支预测数据是全局的还是每个进程?
  2. 如果是每个过程。分支目标缓冲区是否在整个过程存在期间保存了结果,或者当进程使用它的时间片并且指令缓存闪存或移动到另一个核心时它是否闪烁?
  3. 假设:

    • 的Linux
    • Skylake英特尔处理器
    • 分开在核心上运行的多个进程。

2 个答案:

答案 0 :(得分:1)

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

当Intel处理器遇到条件分支时,如果不采用分支则最快。在简单的if / else语句中,条件分支后面跟着if语句。因此,如果else语句在99%的时间内执行,那么这不是最佳的。编译器将if(condition)ifbranch else elsebranch替换为if(!condition)elsebranch else ifbranch,以便大部分时间不采用分支(如果那是可能的/不太可能的优化告诉你的)。

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

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

分支优化是每个处理器。没有任何东西被刷新,存储和恢复。

答案 1 :(得分:1)

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

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

Process Switches and Branch Prediction Accuracy”(David Chen 等人,2005 年)研究了对每个进程使用预测表的性能优势。他们发现“预测提高了 0.5 – 3%”。但他们的结论是“对于通用应用程序,由于必须实施和快速访问大量并行历史表,因此所提议的系统提供的好处有限,并且硬件成本很高。”

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