多年以前,当我从课本上第一次看到分支预测(BP, Branch Prediction) 的概念时,一方面我惊奇于其可以预测未来的强大能力,另一方面也对其感到困惑,不知道真实的分支预测器在流水线上是如何工作的。遗憾的是几年来我一直忙于其它领域的工作,一直没真正花时间和精力去深入细节,所以到现在为止,我对BP的认知还停留在教科书...
但是由于只有一个Branch history,也就是说每个分支都是以这个Branch history为基础来选择Pattern history table,不过不同的分支也有可能出现相同的Branch history值,这就很难保证一个独立的分支对应一个独立Pattern history table entry,也就是说需要较长的Branch history(较大的n,很多现代的微处理器为n=16),以降低不...
Local Branch Prediction中的BHR跟GHR有所不同,是在指令retire阶段更新(non-speculative),由于记录的是local branch history,只有在for循环体很短的情况,才可能出现一条指令在流水线提交阶段更新BHR时,流水线内又出现了这条分支使用BHR进行预测的情况。但这种情况不会对预测性能有太大影响,因为经过warmup/training之后,...
分支预测(Branch Prediction)模型在现代CPU中扮演着至关重要的角色。它解决了程序中分支指令带来的性能挑战,通过预测分支的执行路径,提高了指令执行的吞吐量。让我们更深入地了解CPU的分支预测模型。分支指令根据条件的真假来选择执行不同的代码路径。然而,因为条件在执行前是未知的,CPU需要在分支指令执行前进行预测,以便...
深入理解CPU的分支预测(Branch Prediction)模型 说明: 本文以stackoverflow上Why is it faster to process a sorted array than an unsorted array?为原型,翻译了问题和高票回答并加入了大量补充说明,方便读者理解。 背景 先来看段c++代码,我们用256的模数随机填充一个固定大小的大数组,然后对数组的一半元素求和:...
BranchPredictionTest.countUnsortedArr avgt331854.238±5393.947us/op 是不是很出乎意料,明显有序数组中统计快的多,性能差距足足有6倍。而且经过我多次测试,这个性能差距非常稳定。是不是感觉不符合逻辑,大多数程序猿都是用高级语言编写代码,其实语言本身就封装了很多底层的细节,事实上,CPU对分支跳转指令是有优化的,这...
g++ branch_prediction.cpp./a.out 1. 2. 在我的macbook air上运行结果: 复制 # 1. 取消std::sort(data, data + arraySize);的注释,即先排序后计算10.218sum= 312426300000# 2. 注释掉std::sort(data, data + arraySize);即不排序,直接计算29.6809sum= 312426300000 ...
Two Level Local Branch Prediction (Adaptive two-level prediction) 1991年的论文Two-Level Adaptive Training Branch Prediction提出可以基于分支历史结果进行预测,每个分支对应一个Branch History Register(BHR),每次将分支结果移入BHR。 从上图可以看出为什么是Two-level : ...
当一个分支指令第一次执行时,处理器为该指令分配一个Entry放入BTB中,当指令读取请求的时候,将该指令同步放到L1的Instruction Cache以及BTB中,如果在BTB中Match上该指令,Branch Target Address将会从BTB中被读取。当指令分支执行完毕后,它的Target Address也会在BTB中被更新,Prediction Statistics也同样会更新。