栈式分支预测器的硬件实现方法.pdf

上传人:奻奴 文档编号:1068789 上传时间:2018-03-29 格式:PDF 页数:9 大小:556.73KB
返回 下载 相关 举报
摘要
申请专利号:

CN201010148493.5

申请日:

2010.04.16

公开号:

CN101807145A

公开日:

2010.08.18

当前法律状态:

终止

有效性:

无权

法律详情:

未缴年费专利权终止IPC(主分类):G06F 9/38申请日:20100416授权公告日:20121226终止日期:20130416|||授权|||实质审查的生效IPC(主分类):G06F 9/38申请日:20100416|||公开

IPC分类号:

G06F9/38

主分类号:

G06F9/38

申请人:

浙江大学

发明人:

陈天洲; 袁辉; 施青松; 胡威; 蒋冠军

地址:

310027 浙江省杭州市西湖区浙大路38号

优先权:

专利代理机构:

杭州求是专利事务所有限公司 33200

代理人:

林怀禹

PDF下载: PDF下载
内容摘要

本发明公开了一种栈式分支预测器的硬件实现方法。分支预测器通过对程序分支预测和提前执行分支之后的指令,提高流水级处理器性能。栈式分支预测器是在两级模式分支预测器的基础上,在分支预测器中设置了一个栈的结构,该结构记录了程序执行的层次。栈式分支预测器由栈、PC记录、比较器和索引组成。栈中记录了程序进入层次的入口和出口PC值,作用是记录程序的层次关系;PC记录里面存放了修改GHR位的PC值;比较器用于比较栈中的PC值和PC记录中的PC值;索引部分用于产生读写一PHT的索引值。程序的层次指的是程序的循环和函数调用。本发明是通过记录程序的层次,在预测时比较PC记录和栈中元素,过滤层次间的分支预测噪音。

权利要求书

1: 一种栈式分支预测器的硬件实现方法,其特征在于: 1)栈式结构记录程序层次: 栈为一个先进后出的硬件结构,栈以两个元素为一组,分别记录层次的入口和出口,当处理器判断当前指令为函数调用或者循环时,栈式分支预测器就把函数或循环的入口和出口地址插入到栈中成为栈中元素,保存程序的层次,函数不必记录出口地址,当某个分支的地址大于栈顶层次的出口地址或者遇到了函数返回的指令,那么就说明程序退出了一个层次,需要弹出一个栈顶的入口和出口元素; 2)PC记录中记录修改GHR位的PC值: 分支的结果将会被记录在GHR中,PC记录中记录了修改GHR对应位的PC值,通过PC记录中的值和栈中值的比较,能够判断GHR中哪些位与当前被预测分支处在相关层次; 3)比较器比较PC记录和栈中元素: 比较器用于比较PC记录中的值与栈中元素的值,比较器不需要比较值的大小,只需要比较其值是否相等,因此比较器通过异或逻辑实现,异或为零说明两者相等,比较器的输出一串GHR的掩码; 4)索引计算使用过滤后GHR值: 索引计算指的是计算索引PHT项的索引值,在栈式预测器中,用于计算索引的GHR为噪音过滤后的GHR,它是GHR值和比较器输出的掩码相与后的结果; 5)预测过程: 当处理器进行分支预测时候,首先比较每条PC记录与栈顶层次入口的值,如果PC记录值大于或者等于栈顶入口的值,那么说明该PC记录对应的GHR位为与当前分支是处在同一层中的分支,否则便是处在不同层次的分支,对于相同层次的GHR位,比较器产生一个1的结果,对于不同层次的GHR位,比较器产生一个0个结果。于是在比较结束以后,比较器产生了一串GHR的掩码,掩码和GHR异或产生用于计算索引的GHR,最后根据索引函数计算PHT的索引值,进行预测。

说明书


栈式分支预测器的硬件实现方法

    【技术领域】

    本发明涉及分支预测技术,尤其涉及一种栈式分支预测器的硬件实现方法。

    背景技术

    分支指令是程序中频繁出现的指令,C语言中平均每9条指令就会出现一条分支指令,分支指令带来了程序行为的多样性,在单发射顺序执行处理器中,分支指令不影响程序性能。但是在具有流水的处理器中,分支指令导致流水级中需要插入气泡(Bubble),影响处理器性能。因此分支预测应运而生,分支预测指的是在计算出分支跳转结果之前,预测分支的跳转方向,提前执行预测结果处的指令,如果分支结果和预测结果相同,那么提前执行的指令为有效指令,否则回滚提前执行的指令。

    随着处理器技术的发展,分支预测技术对处理器性能具有非常大的影响,准确的分支预测和高效的错误预测结果回滚能够使处理器性能更加强劲。Intel奔腾4处理器为了能够达到更高的频率,采用了非常深的流水结构,使得流水级的每一步能够在更短的时间内完成。但是这样设计使分支预测付出了更大的代价,由于深度的流水,当预测器错误预测分支结果时,处理器需要回滚更多周期的错误结果,导致处理器性能低下,被人诟病。下面几个部分将详细叙述分支预测技术的发展、先进的分支预测器以及多核时代下分支预测面临的挑战。

    在指令级流水处理器发展的初始阶段,分支点之后的指令需要等到计算出分支条件以后才能够进入流水,刚进入分支指令到计算出分支结果的时间间隔内,指令流水级中插入气泡(Bubble),这样的方式造成了处理器资源的浪费。于是提出了一种最简单的分支预测方法,就是当处理器在执行过程中遇到分支指令,则总认为分支指令是跳转的(Taken)或者不跳转的(Not Taken)。这样分支点之后的指令就可以提前进入流水,等到计算出分支的结果以后判断预测是否正确。这种方式对没有固定跳转模式的程序,预测的准确率相对较高。

    静态分支预测在程序运行阶段缺乏灵活性,使得预测性能底下,于是人们就提出了动态预测的方法。首先是一位计数器动态预测器,它记录分支指令的执行结果,以0和1分别表示分支的不跳转和跳转,当下次再次执行到这些分支指令的时候,就可以根据预测位来预测分支。如果是0则预测不跳转,如果是1则预测跳转。每次分支在得到实际跳转结果以后更新预测位。

    和一位预测器原理相同,后来又提出了多位计数器预测器,用来记录该分支以前的跳转情况。如果当前预测位的值大于等于预测位最大值的一半,那么预测该分支跳转,否则就预测该分支不跳转。如果实际结果是分支跳转,那么预测位的值更新为原来的值加1,否则减1。多位预测器能够比1位预测器取得更好的性能,因为多位预测器能够容忍分支跳转的波动。但实验结果表名,二位计数器的预测器最适合动态分支预测,它存储空间较小而且状态转换更快。在二位预测器中,0、1表示分支不跳转,2、3表示分支跳转。

    在程序的执行过程中,当前分支的跳转与否又与该分支之前的分支跳转结果有关,所以又通过一个全局历史寄存器(GHR,Global History Register)记录了当前分支之前的k条分支跳转结果,然后用GHR去索引和更新模式历史表(PHT,Pattern History Table),PHT是由2位计数器组成的一个表。这种结构也是以后Gshare如图1所示、Gselect等预测器的基础结构。

    而后发现由于只有一个独立的PHT,不同地址的分支共同读取和更新PHT,导致了严重的相互干扰,于是为了取得更高的预测效率,预测器又为不同的地址设立了不同的PHT,一方面由PC的地址去决定索引哪个PHT,另外一方面又由GHR去索引PHT里面的内容。这样的预测器被叫做全局分支预测器,因为不同地址地分支虽然分离的PHT,但还是共同使用一个GHR。

    所以继而又提出了局部分支预测器,也就是说不同地址的分支分别维护各自的GHR。预测过程中,首先由PC索引决定使用哪个PHT和GHR,然后再由该GHR去索引PHT的内容作为预测。更新的过程中则只更新相应的PHT和GHR。

    根据GHR和PHT进行分支预测的分支预测器被称为两级模式分支预测器,这类预测器存在两个方面的性能缺陷。首先是分支别名,分支别名指的是在分支预测的过程中,存在PHT表项的冲突问题。即不同的分支访问相同的表项,这使得PHT的某些表项经常未被使用,而某些表项被不同地址的分支同时使用。其次是分支历史信息干扰,它是由历史分支与当前分支的无关性引起的,具有干扰作用的分支历史信息也被称作“噪音”,即那些分支的结果对当前分支的结果不相关。

    【发明内容】

    为了能够减少分支噪音对分支预测的性能影响,提高分支预测效率,进而改进处理器性能,本发明的目的在于提出了一种栈式分支预测器的硬件实现方法。

    本发明解决技术问题所采用的技术方案是:

    1)栈式结构记录程序层次:

    栈为一个先进后出的硬件结构,栈以两个元素为一组,分别记录层次的入口和出口,当处理器判断当前指令为函数调用或者循环时,栈式分支预测器就把函数或循环的入口和出口地址插入到栈中成为栈中元素,保存程序的层次,函数不必记录出口地址,当某个分支的地址大于栈顶层次的出口地址或者遇到了函数返回的指令,那么就说明程序退出了一个层次,需要弹出一个栈顶的入口和出口元素;

    2)PC记录中记录修改GHR位的PC值:

    分支的结果将会被记录在GHR中,PC记录中记录了修改GHR对应位的PC值,通过PC记录中的值和栈中值的比较,能够判断GHR中哪些位与当前被预测分支处在相关层次;

    3)比较器比较PC记录和栈中元素:

    比较器用于比较PC记录中的值与栈中元素的值,比较器不需要比较值的大小,只需要比较其值是否相等,因此比较器通过异或逻辑实现,异或为零说明两者相等,比较器的输出一串GHR的掩码;

    4)索引计算使用过滤后GHR值:

    索引计算指的是计算索引PHT项的索引值,在栈式预测器中,用于计算索引的GHR为噪音过滤后的GHR,它是GHR值和比较器输出的掩码相与后的结果;

    5)预测过程:

    当处理器进行分支预测时候,首先比较每条PC记录与栈顶层次入口的值,如果PC记录值大于或者等于栈顶入口的值,那么说明该PC记录对应的GHR位为与当前分支是处在同一层中的分支,否则便是处在不同层次的分支,对于相同层次的GHR位,比较器产生一个1的结果,对于不同层次的GHR位,比较器产生一个0个结果。于是在比较结束以后,比较器产生了一串GHR的掩码,掩码和GHR异或产生用于计算索引的GHR,最后根据索引函数计算PHT的索引值,进行预测。

    本发明具有的有益效果是:

    栈式分支预测器的作用原理是通过记录程序的层次,在预测时比较PC记录和栈中元素,过滤层次间的分支预测噪音。

    【附图说明】

    图1是Gshare分支预测器。

    图2是Gshare上的栈式分支预测器。

    图3是比较器的实现。

    具体实施方法

    下面结合附图和实施例对本发明作进一步的说明。

    1)栈式结构记录程序层次:

    栈为一个先进后出的硬件结构,栈以两个元素为一组,分别记录层次的入口和出口,当处理器判断当前指令为函数调用或者循环时,栈式分支预测器就把函数或循环的入口和出口地址插入到栈中成为栈中元素,保存程序的层次,函数不必记录出口地址,当某个分支的地址大于栈顶层次的出口地址或者遇到了函数返回的指令,那么就说明程序退出了一个层次,需要弹出一个栈顶的入口和出口元素;

    2)PC记录中记录修改GHR位的PC值:

    分支的结果将会被记录在GHR中,PC记录中记录了修改GHR对应位的PC值,通过PC记录中的值和栈中值的比较,能够判断GHR中哪些位与当前被预测分支处在相关层次;

    3)比较器比较PC记录和栈中元素:

    比较器用于比较PC记录中的值与栈中元素的值,比较器不需要比较值的大小,只需要比较其值是否相等,因此比较器通过异或逻辑实现,异或为零说明两者相等,比较器的输出一串GHR的掩码;

    4)索引计算使用过滤后GHR值:

    索引计算指的是计算索引PHT项的索引值,在栈式预测器中,用于计算索引的GHR为噪音过滤后的GHR,它是GHR值和比较器输出的掩码相与后的结果;

    5)预测过程:

    当处理器进行分支预测时候,首先比较每条PC记录与栈顶层次入口的值,如果PC记录值大于或者等于栈顶入口的值,那么说明该PC记录对应的GHR位为与当前分支是处在同一层中的分支,否则便是处在不同层次的分支,对于相同层次的GHR位,比较器产生一个1的结果,对于不同层次的GHR位,比较器产生一个0个结果。于是在比较结束以后,比较器产生了一串GHR的掩码,掩码和GHR异或产生用于计算索引的GHR,最后根据索引函数计算PHT的索引值,进行预测。

    本发明是通过栈式结构实现栈式分支预测器,进行GHR中的噪音过滤,进而提高分支预测器预测性能和处理器性能。栈式分支预测器的总体框架图如图2右边虚线部分所示,图2的栈式分支预测器是基于Gshare分支预测器修改的,Gshare如图2左边所示,它的预测过程是通过PC和GHR异或产生的值索引PHT,然后预测,因此图2的栈式分支预测器可以被称为栈式Gshare预测器或者栈式Gshare。本发明提出的是栈式结构在分支预测器中的运用,减少分支预测噪音,提高分支预测性能,本发明不是提出了一种新的预测方法和策略,而是提出了一种两级模式分支预测器中GHR的维护和使用方法,因此栈式分支预测器中的栈式结构可以被运用的任何两级模式分支预测器或其他使用GHR的预测器中,图2中的栈式Gshare分支预测器只是为了方便说明栈式分支预测器的工作过程和实现方法,只是栈式分支预测器在某一个具体分支预测器上的一个实现实例。栈式分支预测器的关键部分为栈式结构,栈式结构由4个部分组成,分别是栈、PC记录、比较器和索引。栈中记录了程序进入新层次的入口和出口PC值,作用是记录程序的层次关系;PC记录里面存放了修改GHR位的PC值;比较器用于比较栈中的PC值和PC记录中的PC值;索引部分用于产生读写PHT的索引值。

    栈的工作过程是这样的:当处理器判断当前指令为函数调用指令或者往程序低地址跳转的指令(说明是循环)时,预测器就把函数或循环的入口和出口地址插入到栈中,保存程序的层次,函数不必记录出口地址。如果某个分支的结果大于栈顶层次的出口地址或者遇到了函数返回的指令,那么就说明程序退出了一个层次,需要弹出一个栈顶的入口和出口元素。

    当处理器进行分支预测时候,首先比较每条PC记录与栈顶层次入口的值,如果PC记录值大于或者等于栈顶入口的值,那么说明该PC记录对应的GHR位与当前分支是处在同一层中的分支,否则便是处在不同层次的分支,对于相同层次的GHR位,比较器产生一个1的结果,对于不同层次的GHR位,比较器产生一个0个结果。于是在比较结束以后,比较器产生了一串GHR的掩码,最后通过GHR值和掩码相与的结果与PC值异或产生一个索引值访问PHT,得到的结果作为预测结果。在比较器进行比较时,不一定必须同栈顶的值比较,比较可以根据层次中分支的相关性调整选取栈中的某个元素进行比较,本段前面所描述的使用栈顶元素比较是一种比较方法。

    在得到实际的分支结果以后,GHR进行移位,把分支结果存入GHR,这个过程和原来分支预测器的GHR更新过程一样。但是在栈式的预测结构中,同时需要更新PC记录,由于PC记录是与GHR中的位一一对应的,那么被移出的GHR位对应的PC记录也将被移除,取而代之的是当前分支的PC值。

    栈的实现

    在栈式的分支预测器中,最重要的是通过栈式的结构记录程序中的层次,本文所描述的程序的层次和程序中函数调用的层次类似。在函数调用中,当程序调用和返回一个函数使程序进入或者退出了一个函数层次,函数层次是以函数为划分。本文中的层次则是以循环和函数共同来划分的,当程序进入或者退出一个新的循环体或者函数时,就进入了或者退出了一个新的层次。

    本文层次的维护,对于函数和循环,维护过程稍微有点差别,由于函数是先遇到函数调用,执行完函数体然后返回,所以在遇到函数调用指令时在栈顶记录函数入口地址,而此时函数的出口地址未知,所以不设置层次的出口地址,而在函数返回时弹出栈顶的两个元素便可。

    但是在循环中,初次进入循环是不可立刻感知,即在程序进入循环时,无法知道程序进入了循环,因为在进入循环时,程序中只是遇到了一个条件分支,无法区分该条件分支是来自循环的条件分支还是其他(例如if语句)的条件分支,因此只有在遇到向低地址跳转的指令(跳转的目的地址小于当前指令的地址)时才能够判断出循环。因此在确认循环时,会先知道循环的出口地址,然后再知道循环的入口地址。而当循环嵌套时,问题就稍微复杂一点了,预测器会先知道内层循环的出口和入口地址,再知道外层循环的出口和入口地址。这样的情况下,虽然还能通过简单的往栈顶压入元素或者弹出栈顶元素维护程序的层次,但是循环体已经被执行了一遍了。此外在遇到向高地址跳转的跳转指令时,还需要比较栈顶的出口地址与跳转目的地址的大小,如果目的地址比出口地址大,那么说明退出循环了,需要弹出栈顶的两个元素。

    循环和函数在栈中的还有一个区别在于函数的一个入口必定对应一个出口,而在循环中,如果循环被执行了不止一次,那么不应该在每次遇到向低地址跳转的指令时便把目的地址压入栈中,而是需要把目的地址与栈顶地址比较,如果不想等才能压入栈中,相等则不必压入栈中。

    栈的容量就是一个值得探讨的问题,有些程序具有非常深的栈,有些程序则具有比较浅的栈。分析显示程序会把大部分的执行时间花费在某些层次上,而且这些层次比较集中并且深度不是太大,那么只要保证栈容量能够至少容纳这些层次的分支就可以了,而当栈满并且程序又进入新的层次时,不更新栈便可。

    比较器的实现

    比较器用于比较栈顶元素与PC记录中的元素,比较器的输出是一个GHR的掩码,由于要求预测器在预测过程中的高效性,那么比较器就要求具有的快速高效的特性,因此栈顶元素和PC记录中所有元素的比较被并行执行。比较的过程如图3所示,栈顶元素与PC记录的每一项进行比较,比较过程并行进行,最后的比较输出为一串掩码。

    由于进入层次以前的GHR位被认为是噪音,进入层次以后的GHR位被认为是有效的,因此以前层次的噪音总是在GHR的连续高位当中,而非噪音总是在GHR的连续低位当中,所以比较器并不需要比较栈顶元素与PC记录中元素的大小,只要比较PC记录中是否有元素与栈顶元素相同,如果有相同,那么该元素对应GHR位的左边所有位来自前面的层次,被认为是噪音,该元素右边的所有位来自同层次或者所处层次以后的层次中,被认为是有效位。比较是否相等的过程比比较大小的过程简单,比较两个元素是否相等只要把两个元素进行异或操作,如果结果为0,则元素相等,非0则不相等。在得到比较结果以后,把结果为0的元素对应左边的所有位设置为0,所有右边位以及自己设置为1,这样GHR的掩码就得到了。如果所有的比较结果中没有相同的元素,那么就认为GHR的所有位是有效的,掩码被设置成全1。

    上面的说明基于“层次中的分支只与当前分支所处层次以及该层次以后层次中的分支有关”的假设,所以在进行比较的时候取栈顶元素进行比较。如果认为层次中的分支与上一层次的分支也有关系,那么只要取栈顶第二个元素进行比较便可;如果认为层次中的分支与上上层的分支也有关系,那么取栈顶的第三个元素比较便可;依此类推。但是在认为与上一层次或者上上层次有关的时候,需要注意栈中的值是否来自函数调用,循环的嵌套使得栈中的层次记录保持由小到大的顺序,但是函数调用使得层次记录不具有有序性,因此取上层或者上上层元素时,如果遇到函数调用的入口地址,那么应该停止。在栈的记录中,需要有标记位记录是由于循环或者函数调用使程序进入新的层次,而层次的出口可以用作标记位,因为函数不使用栈中层次的出口。

    PC记录维护

    PC记录中记录了GHR中某一位对应的分支地址,它的更新和GHR的更新同时进行,当一个分支结果产生时,GHR需要左移并且把新的分支结果存入GHR的低位;同样的,PC记录也需要左移,并且把新分支的PC值记录在PC记录的最右边,对应GHR的最低位。

    在现代的分支预测器中,GHR只在遇到条件分支指令时被修改,因为无条件跳转指令的分支结果总是1,写入GHR并没有多大意义,只会增加额外的硬件代价,但是在前面的比较器设计中,需要比较PC记录中是否有元素与栈顶元素相等来确定层次,所以该策略在对应函数调用的时候就会产生问题。函数调用时的指令为一条无条件跳转指令,它的结果不更新到GHR,也就是不更新到PC记录中,而比较器在比较的过程中要需要使用函数调用时函数的调用入口,因此本文的预测器中,GHR更新时需要把函数调用的分支也更新到GHR中。

    而循环则不会产生这个方面的问题,循环是在循环体结束时遇到才由无条件跳转指令跳转到循环体的入口,而在循环体的入口本来就是一条判断循环条件的条件分支。因此循环不用作这方面的处理。

    索引计算

    索引计算指的是通过PC以及GHR值计算读写PHT项的索引号。在本文中,由于增加了一个掩码,因此索引值的计算是先计算GHR和掩码相与,再和PC值进行异或。它的本质是把GHR中的噪音位设置为0,因为在掩码中,认为是噪音的位被设置为0,不是噪音的位被设置为1,因此当掩码与GHR相与时,掩码中为1的那些位对应的GHR位被保留了,而掩码中为0的那些位对应的GHR位被置0了。

栈式分支预测器的硬件实现方法.pdf_第1页
第1页 / 共9页
栈式分支预测器的硬件实现方法.pdf_第2页
第2页 / 共9页
栈式分支预测器的硬件实现方法.pdf_第3页
第3页 / 共9页
点击查看更多>>
资源描述

《栈式分支预测器的硬件实现方法.pdf》由会员分享,可在线阅读,更多相关《栈式分支预测器的硬件实现方法.pdf(9页珍藏版)》请在专利查询网上搜索。

本发明公开了一种栈式分支预测器的硬件实现方法。分支预测器通过对程序分支预测和提前执行分支之后的指令,提高流水级处理器性能。栈式分支预测器是在两级模式分支预测器的基础上,在分支预测器中设置了一个栈的结构,该结构记录了程序执行的层次。栈式分支预测器由栈、PC记录、比较器和索引组成。栈中记录了程序进入层次的入口和出口PC值,作用是记录程序的层次关系;PC记录里面存放了修改GHR位的PC值;比较器用于比较。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 物理 > 计算;推算;计数


copyright@ 2017-2020 zhuanlichaxun.net网站版权所有
经营许可证编号:粤ICP备2021068784号-1