for (int i = 0; i < 10; i++) { for (int j = 0; j < 10000; j++) { } }
引入流水线工作机制以后,为了配合流水线工作,处理器增加了一个分支目标缓冲器(Branch Target Buffer)。在流水线工作模式下,如果遇到分支结构,就可以利用分支目标缓冲器预测并读取指令的目标地址。分支目标缓冲器在程序运行时将动态记录和调整转移指令的目标地址,可以记录多个地址,对其进行表格化管理。当发生转移时,如果分支目标缓冲器中有记录,下一条指令在取指令阶段就会将其作为目标地址。如果记录地址等于实际目标地址,则并行成功;如果记录地址不等于实际目标地址,则流水线被冲洗。同一个分支,多次预测失败,则更新记录的目标地址。因此分支预测属于“经验主义”或“机会主义”会存在一定的误测。
基于上述原因,大家以后在编写多重循环时应该把大循环放到内层,这样可以增加分支
预测的准确度,如下面的示例所示:
for(int i=0;i<10;i++){ //下面每次循环会预测成功9999次 //第1次没有预测,最后退出循环时预测失败1次 //这样的过程重复10次 for(int j=0;j<10000;j++){ a[i][j]++; } } for(int j=0;j<10000;j++) //下面每次循环会预测成功9次 //第1次没有预测,最后退出循环时预测失败1次 // 这样的过程重复10000次 for(int i=0;i<10;i++){ a[i][j]++; } }