在讨论期间,开发人员告知
无效,应在英特尔处理器上忽略。所述原因是英特尔采用的动态分支预测。 我有两个问题,我找不到明确的答案:
假设:
答案 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 个高负载进程,它们往往会各自占用一个内核,并且几乎不会干扰每个(或任何)其他的分支预测表。