c++ - 流程使用其时间片后是否保存分支预测器结果

标签 c++ linux gcc cpu-architecture branch-prediction

在讨论过程中,开发人员告知

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

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

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

假设:

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

最佳答案

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

当英特尔处理器遇到条件分支时,如果不采取该分支,速度最快。在简单的 if/else 语句中,条件分支后面将跟有 if 语句。因此,如果 99% 的时间都执行 else 语句,那么这并不是最佳选择。编译器会将 if (condition) ifbranch else elsebranch 替换为 if (!condition) elsebranch else ifbranch,因此大多数情况下不会采用分支(如果这就是可能/不可能的优化告诉您的情况)。

或者考虑一个平均执行次数少于一次的循环(例如,只有百分之一)。通常编译器会提取 l 循环中与 oop 无关的代码。如果循环从未执行过,那就是浪费时间!您可以告诉编译器该循环很可能不会被执行,并且与循环无关的代码将不会被提取。

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

分支优化是针对每个处理器的。没有任何内容被刷新或存储和恢复。

关于c++ - 流程使用其时间片后是否保存分支预测器结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35117543/

相关文章:

c++ - 需要一些手持来渲染、显示和保存图像

linux - 需要回答 2 个 Unix MCQ 问题

linux - 如何撤销对信号量最近一次操作的SEM_UNDO?

c++ - c/c++ 将位置相关对象转换为位置无关对象

c++ - GCC 允许访问私有(private)静态成员

android - 从 ubuntu linux 目标 arm (android) 交叉编译的 native 库

c++ - 将子对象复制构造为父类型指针

C++ 返回 vector

c++ - 如何使用 CLion 创建 C 项目

linux - 如何替换括号之间的换行符