`

分支预测(Branch Prediction)

 
阅读更多

 

 在写代码的时候,有时会遇到在循环遍历一个数组时,如果代码块里有做if判断的操作时,我们有个优化的经验,就是先将数组先排序,然后再进行遍历比较操作时,效率会有比较大的提升。

 

一个简单的测试:

 

 

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;

public class Test3 {
  public static final void main( String argc[] ) throws Exception {
    //生成十万个随机数
    List<Integer> randomNumbers = new ArrayList<Integer>();
    Random rnd = new Random();
    for(int i=0; i <= 100000; i++){
      randomNumbers.add(rnd.nextInt(10));
    }
    //未将randomNumbers排序,将randomNumbers大于五万的数放入results1
    List<Integer> results1 = new ArrayList<Integer>();
    long start = System.nanoTime();
    for(int i=0; i <= 100000; i++){
      Integer a = randomNumbers.get(i);
      if(a > 50000){
        results1.add(a);
      }
    }
    long end = System.nanoTime();
    System.out.println(end - start);
    //将randomNumbers排序,将randomNumbers大于五万的数放入results1
    Collections.sort(randomNumbers);
    List<Integer> results2 = new ArrayList<Integer>();
    long start1 = System.nanoTime();
    for(int i=0; i <= 100000; i++){
      Integer a = randomNumbers.get(i);
      if(a > 50000){
        results2.add(a);
      }
    }
    long end1 = System.nanoTime();
    System.out.println(end1 - start1);
  }
}

  

 

运行结果:
1138865
762985

 

那为什么排好序的代码在判断的时候效率会更高呢?原因在于本文的主题:分支预测。


简单来说,就是在做if语句判断时,结果要么是A,要么是B,如果在判断前有个预判,执行A或者B,可以预先做些操作,然后通过判断来确认判断的正确性,如果预判的准确率较高,那么效率提升地就高,而预判一般地基础是之前做地判断结果,所以排序后地判断,能保证这个预判地连续性和正确性,提升了效率。

 

具体来说,这其实是个CPU level的操作,一般的,指令流水线中的第一条指令已进入到译码阶段,而第二条指令已进入到提取阶段(准备进入译码器),如果发现第一条指令是分支指令(如跳转到某个地址),则指令预取队列中下一条及下下条等指令预取无效。这时(确切地说,等到第一条指令执行期间形成了分支的目标地址),需从目标地址中现取指令,并交付执行,同时应立即清除指令预取队列,再将目标地址后面的指令预取过来填到队列中。这表明,一遇到分支指令,整个指令流水线就被打乱一次,稍后才能恢复到正常。显然,这影响了机器的运行速度。为此,在Pentium处理器中使用了分支目标缓冲器(Branch Target Buffer,BTB)来预测分支指令。
BTB实际是一个能存若干(通常为256或512)条目的地址存储部件。当一条分支指令导致程序分支时,BTB就记下这条指令的目标地址,并用这条信息预测这一指令再次引起分支时的路径,预先从该处预取。下面看一下BTB在循环程序中应用。循环程序在程序设计中使用得十分普遍。在指令级目标程序中构成循环程序需要用转移指令(条件转移指令或无条件转移指令)。看下例:
MOV CX.100
LOOP: ……
……
DEC CX
JNZ LOOP
……
在第一次执行到JNZ指令时,预测的转移地址是存在BTB中的前面一条JNZ指令的目标地址,不是LOOP,这一次预测是错误的。但执行后目标地址 LOOP便存入到BTB中。等到下一次执行到JNZ指令,就按BTB中的内容来预测,转移到LOOP,这是正确的。如此,一直到cx的值变为0之前,也都是对的。当再循环一次CX的值变为0时,JNZ指令因条件不成立而不实行转移,而预测仍是LOOP,预取仍按该预测进行,这是第二次预取错误。可见,该例中100次循环,有98次预测,确切地说,有98次预测指导下的预取是正确的。同理,对于1000次循环,就会有998次的预取是正确的。即循环次数越多,BTB带来的效益就越高。

 

参考:http://blog.sina.com.cn/s/blog_6c673e570100zfmo.html

 

 

分享到:
评论

相关推荐

    branch prediction using Two Levels of Branch History

    这个文本基本上包含了两级分支预测的原理和时限技术,适合体系结构的研究者入门使用

    branch-prediction-programming::film_frames:实施多种分支预测算法,并分析其在实际程序跟踪中的有效性

    分支预测编程 几种分支预测算法的实现以及对它们在真实程序跟踪中的有效性的分析。 实现了以下算法。 静态ALWAYS TAKEN分支预测器(Static-T) :预测将采用所有分支静态始终不接受分支预测器(Static-NT) :预测...

    学习汇编语言过程中完成的各种实验以及源代码

    其中,分支预测(Branch Prediction)是一个重要的主题。在计算机程序执行过程中,分支语句(如if语句、循环等)会影响程序的性能,因为处理器需要预测分支的方向以提高执行效率。分支预测技术可以根据之前的执行...

    黄佳_02 IBM POWER7 multicore server processor1

    1. 介绍3. 取指(Instruction fetching)4. 分支预测(Branch Prediction)5. 获取数据6. 地址翻译9.

    ]计算机常见术语解释

    一、CPU术语解释 ... BHT: (branch prediction table,分支预测表)处理器用于决定分支行动方向的数值表。    BPU:(Branch Processing Unit,分支处理单元)CPU中用来做分支处理的那一个区域。  

    matlab终止以下代码-Branch_prediction_whats_left:Branch_prediction_whats_left

    分支预测-还剩下什么 作者: 法比奥·卡拉奇(Fabio CARACCI) 马克·科莱塔 弗朗切斯科·康迪 导师: Renaud PACALET教授 目录: [数据处理](#数据处理) [结果和结论](#Results and结论) [更多说明](#更多...

    英特尔芯片漏洞处置

    有详细对付英特尔最新漏洞的方法,现代的计算机处理器芯片通常使用“预测执行”( SpeculativeExecution)和“分支预测”(Indirect Branch Prediction)技术实现对处理器计算资源的最大化利用。但由于这两种技术在实现...

    计算机术语大全(中英对照)

    计算机术语CPU类 3dnow! (3d no waiting) alu(arithmetic logic unit,算术逻辑单元) ...bht(branch prediction table,分支预测表) bpu(branch processing unit,分支处理单元) brach pediction(分支预测) ......

    计算机术语大全.doc

    (3D no waiting) ALU(Arithmetic Logic Unit,算术逻辑单元) AGU(Address Generation Units,地址产成单元) BGA(Ball Grid Array,球状矩阵排列) BHT(branch prediction table,分支预测表) BPU...

    嵌入式系统/ARM技术中的晶心发表新款32位N9系列嵌入式核心N903-S

    晶心科技(Andes)日前正式发表新款32位元N9系列嵌入式核心N903-S softcore,... Andes Core N9系列产品是以5级管线(pipeline)及静态分支预测(static branch prediction)为主轴。以0.13um制程制造时,作业时脉可达250MHz

    可重定义RISC-V处理器核f32c.zip

    branch_prediction合成分支预测器C_bp_global_depth全局分支历史跟踪大小C_result_forwarding合成结果旁路C_load_aligner合成加载对齐器C_full_shifter pipelined而不是迭代移位器C_icache_size指令高速缓存大小(0...

    biriscv:32位超标量RISC-V CPU

    具有可配置深度分支目标缓冲区(BTB)和返回地址堆栈(RAS)的分支预测(bimodel / gshare)。 64位指令获取,32位数据访问。 2个整数ALU(算术,移位器和分支单元)。 1个负载存储单元和1个管道外分隔线。 每个...

Global site tag (gtag.js) - Google Analytics