书签 分享 收藏 举报 版权申诉 / 11

一种低功耗的寄存器堆的写回丢弃方法.pdf

  • 上传人:00062****4422
  • 文档编号:1489626
  • 上传时间:2018-06-17
  • 格式:PDF
  • 页数:11
  • 大小:737.84KB
  • 摘要
    申请专利号:

    CN201310363885.7

    申请日:

    2013.08.20

    公开号:

    CN103425460A

    公开日:

    2013.12.04

    当前法律状态:

    撤回

    有效性:

    无权

    法律详情:

    发明专利申请公布后的视为撤回IPC(主分类):G06F 9/38申请公布日:20131204|||实质审查的生效IPC(主分类):G06F 9/38申请日:20130820|||公开

    IPC分类号:

    G06F9/38; G06F1/32

    主分类号:

    G06F9/38

    申请人:

    复旦大学

    发明人:

    虞志益; 俞政; 于学球; 张家杰; 曾晓洋

    地址:

    200433 上海市杨浦区邯郸路220号

    优先权:

    专利代理机构:

    上海正旦专利代理有限公司 31200

    代理人:

    陆飞;盛志范

    PDF完整版下载: PDF下载
    内容摘要

    本发明属于微处理器技术领域,具体涉及一种低功耗的寄存器堆的写回丢弃方法。本发明以现有微处理器为基础,其步骤包括:对所述微处理器,扩充原有的MIPS指令集,在有冗余位的指令中增加3位的“生命长度”来表征当前寄存器变量将要被几条后续指令使用;在执行级、访存级和对齐级增加“生命长度”调整逻辑,如果当前寄存器变量被后续的指令使用,则将其“生命长度”减小1,一旦发现当前寄存器变量的“生命长度”为0,则将其通过基于选择器-寄存器的屏蔽逻辑丢弃。指令寄存器生命长度静态推测算法由软件工具实现。与现有的架构相比,本发明能够在几乎不增加硬件开销的情况下,有效地发现可以丢弃的寄存器变量,从而降低寄存器堆的功耗和功耗密度。

    权利要求书

    权利要求书
    1.   一种低功耗的寄存器堆写回丢弃方法,以现有的基本流水线结构的MIPS微处理器为基础,所述现有的微处理器包含取指令级、译码级、执行级、访存储器级、对齐级和写回级;其特征在于具体步骤为:
    (1)对所述微处理器,扩充原有的MIPS指令集,在有冗余位的指令中增加3位的“生命长度”来表征当前寄存器变量将要被几条后续指令使用;
    其中,寄存器X的生命长度定义如下:当寄存器X在执行级(E)、访存级(M)、对齐级(A) 级时,如果寄存器X有1、2、3个在其反馈范围内的后续指令需要用到寄存器X,则寄存器X的生命长度就对应的被指定为1、2、3;如果寄存器X有超出反馈范围的后续指令需要用到寄存器X,则寄存器X的生命长度就被定义为4 ;
    (2)在上述扩充MIPS指令集的基础上,在执行级、访存级和对齐级增加“生命长度”调整逻辑:即如果当前寄存器变量被后续的指令使用,则将其“生命长度”减小1;一旦发现当前寄存器变量的“生命长度”为0,则将其通过基于选择器-寄存器的屏蔽逻辑丢弃。

    2.   根据权利要求1所述的方法,其特征在于,进一步进行指令寄存器生命长度静态推测计算,该计算由软件工具实现,该软件工具静态遍历生成的汇编代码,确定需要加入“生命长度”的指令中的寄存器变量的“生命长度”,并将其嵌入到当前指令的冗余位;所述的指令寄存器生命长度静态推测计算的算法包括:一个主算法和两个子算法,主算法简称算法I,两个子算法分别是:组内生命周期计算,简称算法II,组外写丢弃判断计算,简称算法III;主算法的步骤如下:
    (1)针对当前程序的汇编代码中每条指令,首先调用算法II来计算组内的生命周期life和写丢弃信号wd,如果算法II返回了有效的wd信号,表示算法II确定在组内该寄存器可以被丢弃,那么算法I就将该指令寄存器的生命确定为life;如果life等于4,则表明在组内确定该指令的寄存器不能被丢弃,算法I就将life置为4;否则表示单独调用算法II无法确定是否要丢弃;于是
    (2)进一步调用算法III,如果算法III确定可以丢弃,则将指令的寄存器生命周期置为算法III的返回值,否则将其置为4;
    其中,算法II步骤如下:
    (1)在当前指令的后续选择3条后续指令构成一个组(group),当当前指令在延迟槽时,按照分支发生与不发生,获得两个组;
    (2)定义三个概念:distance,即距离,表示当前指令的寄存器将隔多少个时钟周期而被后续的指令用到,如果距离大于3,则一律置为4;dependent,即依赖性,表示当前指令是否依赖于第一条指令,依赖意思是当前指令的操作数来自第一条指令的目的寄存器;rewrite,即覆写,表示当前指令的目的寄存器是否与第一条指令一致,一致则为覆写,否则不为覆写;
    (3)算法II首先获取当前指令对应的指令组,然后填写步骤(2)中三个概念:distance、dependent、rewrite所对应项的表格,然后开始逐一检查后续指令,A、如果发现有指令依赖于第一条指令,且距离为4,则将第一条指令的生命周期置为4,退出;B、如果有依赖且距离小于4,则生命周期加1;C、如果出现了覆写,则判断生命周期是否是4,如果是的话不能丢弃,否则可以丢弃,返回生命周期;
    算法III步骤如下:
    (1)如果判断出当前指令被后续指令使用,则表示当前指令的寄存器不能被丢弃,返回0,结束;
    (2)否则,如果判断出当前指令的寄存器被后续的指令覆写了或者达到程序的结束出口,则开启下一轮的判断;
    (3)如果下条指令是条件分支指令,那么必须同时判断分支是否发生两条路,这里将分支节点存入到分支容器中,如果在分支容器中发现了这个分支节点,则表示之前已经达到过这个分支点,意味着出现了环,需要把环剔除,否则将分支存入容器,并且先判定分支成功的支路,然后再判断分支失败的支路,直到达到步骤(2)中所说的条件,算法结束。

    说明书

    说明书一种低功耗的寄存器堆的写回丢弃方法
    技术领域
    本发明属于微处理器技术领域,具体涉及一种低功耗的寄存器堆的写回丢弃方法。
    背景技术
    寄存器堆是处理器中第一级存储单元,是现代微处理器的核心部件,由于对寄存器堆的访问呈现出高速、高频的特点,是的寄存器堆的功耗和功耗密度都相当大,以至于成为了微处理器的能量消耗主要部件和功耗热点。高能耗对微处理器特别是嵌入式应用领域的微处理器提出了挑战,而功耗热点更会导致电路稳定性和寿命下降。因此,研究降低寄存器堆功耗有十分重要的现实意义。
    图1展示了传统的6级流水线的微处理器结构图。包括了取指令级、译码级、执行级、访存储器级、对齐级和写回级。
    在传统的微处理器架构中,对于寄存器堆的写回没有专门的电路进行控制,实际指令执行过程中可能出现无用的写回操作,但这些操作在传统的微处理器架构中不会被屏蔽,从而导致了不必要的能量消耗,针对这个缺点,需要对寄存器堆的写回进行控制,一旦发现无用的写回操作则将相应的写回操丢弃,从而降低寄存器堆的访问功耗。
    发明内容
    本发明的目的在于提供一种能够降低访问功耗的寄存器堆写回丢弃方法。
    本发明通过在某些指令中插入表征当前指令目的寄存器的生命长度的标签,并在执行级、访存级和对齐级进行生命长度的减小,来判断当前的目的寄存器是否需要写回(如果为0则放弃写回),从而降低寄存器堆无用的写回功耗,同时也降低寄存器堆的功耗密度,提高电路的稳定性和寿命。
    本发明提供的能够降低访问功耗的寄存器堆写回丢弃方法,以现有的基本流水线结构的MIPS微处理器为基础,所述现有的微处理器包含取指令级、译码级、执行级、访存储器级、对齐级和写回级(见图1所示);具体步骤为:
    (1)对该微处理器,扩充原有的MIPS指令集,在有冗余位的指令中增加3位的“生命长度”来表征当前寄存器变量将要被几条后续指令使用;
    本发明中,寄存器X的生命长度定义如下:当寄存器X在E(执行级), M(访存级), A(对齐级) 级时,如果寄存器X有1、2或3个在其反馈范围内的后续指令需要用到寄存器X,则寄存器X的生命长度就对应被指定为1、2或3;如果寄存器X有超出反馈范围的后续指令需要用到寄存器X,则寄存器X的生命长度就被定义为4。反馈范围定义为:当某条在译码级(D级)的指令Y用到了寄存器X时,而产生寄存器X的指令Z处在E、M或者A级,则称Y指令在Z指令产生寄存器X的反馈范围内,例如在图2中,当寄存器$1在E、M、A级时表示其在反馈范围内,一旦超过这个范围,比如在最下方的一条指令用到了寄存器$1,则定义为寄存器$1的后续指令超出了反馈范围。
    (2)在上述扩充MIPS指令集的基础上,在执行级、访存级和对齐级增加“生命长度”调整逻辑:即如果当前寄存器变量被后续的指令使用,则将其“生命长度”减小1;一旦发现当前寄存器变量的“生命长度”为0,则将其通过基于选择器-寄存器的屏蔽逻辑丢弃。具体的步骤为:1、如果当前处在执行级、访存级或对齐级的指令目的寄存器被位于译码级的指令用到,则当前指令中的“生命长度”的tag就被减1;2、如果当前指令中的“生命长度”的tag的值减为0,则传递给下一级的数据将保持不变,而表征寄存器堆写回的信号将被置为无效,从而在最后写回级不会将该寄存器变量写回。值得说明的是,上述步骤在执行级、访存级和对齐级拥有相同的结构。
    进一步,本发明还提供指令寄存器生命长度静态推测计算的算法,该算法由软件工具实现,该软件工具可以静态遍历生成的汇编代码,确定需要加入“生命长度”的指令中的寄存器变量的“生命长度”,并将其嵌入到当前指令的冗余位。
    所述的指令寄存器生命长度静态推测计算的算法包括一个主算法和两个子算法,主算法简称算法I,两个子算法分别是:组内生命周期计算(inGroupLifetimeCalculation),简称算法II,组外写丢弃判断计算(outOfGroupWriteDiscardingJudgement),简称算法III;指令寄存器生命长度静态推测算法的代码见附录。 
    主算法调用两个子算法,主算法的步骤如下:
    (1)、针对当前程序的汇编代码中每条指令,首先调用算法II来计算组内的生命周期life和写丢弃信号wd,如果算法II返回了有效的wd信号(表示算法II确定在组内该寄存器可以被丢弃),那么算法I就将该指令寄存器的生命确定为life,如果life等于4,则表明在组内确定该指令的寄存器不能被丢弃,算法I就将life置为4,否则表示单独调用算法II无法确定是否要丢弃;
    (2)、进一步调用了算法III,如果算法III确定可以丢弃,则将指令的寄存器生命周期置为算法III的返回值,否则将其置为4。
    算法II是组内推测,其步骤如下:
    (1)、在当前指令的后续选择3条后续指令构成一个组(group),当当前指令在延迟槽时,按照分支发生与不发生,可以获得两个组,如附录(II-a)所示;
    (2)、定义三个概念:distance,即距离,表示当前指令的寄存器将隔多少个时钟周期而被后续的指令用到,如果距离大于3,则一律置为4,dependent,即依赖性,表示当前指令是否依赖于第一条指令,依赖意思是当前指令的操作数来自第一条指令的目的寄存器,rewrite,即覆写,表示当前指令的目的寄存器是否与第一条指令一致,一致则为覆写,否则不为覆写;如附录(II-b)所示;
    (3)、算法II首先获取当前指令对应的指令组,然后填写附录(II-b)所示的表格,然后开始逐一检查后续指令,A、如果发现有指令依赖于第一条指令,且距离为4,则将第一条指令的生命周期置为4,退出;B、如果有依赖且距离小于4,则生命周期加1;C、如果出现了覆写,则判断生命周期是否是4,如果是的话不能丢弃,否则可以丢弃,返回生命周期,如附录(II-c)所示。
    算法III是组外判断,由于本算法可以遍历整个程序,考虑到程序中可能存在的分支点,引入了一个容器来保存程序中的分支点。算法III的具体步骤为:
    (1)、如果判断出当前指令被后续指令使用,则表示当前指令的寄存器不能被丢弃,返回0,结束;
    (2)、否则,如果判断出当前指令的寄存器被后续的指令覆写了或者达到程序的结束出口,则开启下一轮的判断;
    (3)、如果下条指令是条件分支指令,那么必须同时判断分支是否发生两条路,这里将分支节点存入到分支容器中,需要注意的是如果在分支容器中发现了这个分支节点,则表示之前已经达到过这个分支点,意味着出现了环,需要把环剔除,否则将分支存入容器,并且先判定分支成功的支路,然后再判断分支失败的支路,直到达到步骤(2)中所说的条件,算法结束。
    本发明方法在编译器生成软件代码之后,采用全局遍历的策略,来确定某一个寄存器变量被后续指令访问的“生命长度”。本发明提出的算法具备在静态编译时推断寄存器变量的生命长度,并通过指令架构的支持,在指令中嵌入寄存器的生命长度,在运行时,动态调整变量的生命长度,在程序运行时根据生命长度决定是否写回,如果生命长度为零则可屏蔽对寄存器的的写回。本发明省去了不必要的寄存器的写回操作,从而降低了寄存器堆的功耗。
    与现有的架构相比,本发明提供的软件指导的寄存器堆写回丢弃方法,能够在几乎不增加硬件开销的情况下,有效地发现可以丢弃的寄存器变量,从而降低寄存器堆的功耗和功耗密度。
    附图说明
    图1是传统的6级流水线微处理器架构。
    图2是寄存器生命长度的定义示例。
    图3是寄存器堆写丢弃的具体判断逻辑。
    图4是指令寄存器生命长度标签插入的具体实施策略。
    具体实施方式
    本发明描述了一种软件指导的寄存器堆写回丢弃技术。以下阐述了本发明的各种实例及其中的设计思想。
    图2 是用来说明寄存器生命长度定义的示例。如果在反馈范围内有1、2、3个后续指令用到了当前指令的目的寄存器则其生命被定义为1、2、3,如果有超出反馈范围的指令用到该寄存器,则其生命被定义为4,具体的示例,在图2中,如果$1寄存器只有其后续三条指令(即subu $3, $1, $7,lw  $10, 4($1)和mul $11, $6, $1这三条指令)用到,则其生命为3,但是,如果红色所示的指令(slt $3, $1, $8)也用到了$1,则这条指令超出了$1的反馈范围,$1的生命长度将被设置为4。其中,反馈范围的定义为:当某条在译码级(D级)的指令Y用到了寄存器X时,而产生寄存器X的指令Z处在E、M或者A级,则称Y指令在Z指令产生寄存器X的反馈范围内。
    图3展示了寄存器堆写丢弃的具体判断逻辑。与图1传统的结构相比,该结构增加了对生命周期tag的判断逻辑,图3以E级为例进行描述,M级和A级的结构完全一样。首先判断当前的指令的寄存器是否被反馈到D级(必须是反馈命中信号有效(即图3中所示的信号bypass-hit信号有效)并且此时的d级不能阻塞(即图3中所示的d_stall信号为0)),如果是的话则对当前的生命周期tag进行自减,接着判断是否当前的tag为0,为零表示当前指令寄存器的生命为0,可以丢弃,丢弃采用了基于寄存器-选择器的电路结构,该结构的特点是,如果生命tag为0,则传递给下一级的寄存器数据被保持不变,并且,表征寄存器堆写回信号X_wr_sig(X代表E、M和A,图3中以E级示例,所以X为E)将被置为0,从而屏蔽寄存器堆的写回。
    图4展示指令寄存器生命长度标签插入的具体实施策略。实际的逻辑设计中,我们对R型指令和I型指令进行区分,对于R型指令,由于其总有5bit的冗余位,因此可以将tag插入到冗余位。对于I型指令,需要区分立即数的范围,如果立即数的范围在-4096~4095之间,则可以将tag插入到立即数域的高3位,否则,引入一条新的指令lli,然后将原先的指令拆分为lli指令和一条R型指令,lli指令的生命周期为1而R型指令的生命周期tag与之前的I型指令一致,并且可以有5bit的冗余位来插入tag。
    附录展示了通过编译时静态确定/推测指令寄存器变量的生命周期的算法。算法I中所列的算法是总体的算法,调用了两个子算法,分别是:inGroupLifetimeCalculation(组内生命周期计算,如附录(II)所示)和outOfGroupWriteDiscardingJudgement(组外写丢弃判断,如附录(III)所示)。算法I的步骤是:针对当前程序的汇编代码中每条指令,首先调用算法II来计算组内的生命周期life和写丢弃信号wd,如果算法II返回了有效的wd信号(表示算法II确定在组内该寄存器可以被丢弃),那么算法I就将该指令寄存器的生命确定为life,如果life等于4,则表明在组内确定该指令的寄存器不能被丢弃,算法I就将life置为4,否则表示单调用算法II无法确定是否要丢弃,进一步调用了算法III,如果算法III确定可以丢弃,则将指令的寄存器生命周期置为算法III的返回值,否则将其置为4。
    算法II是组内推测,其步骤是:在当前指令的后续选择3条后续指令构成一个组(group),当当前指令在延迟槽时,按照分支发生与不发生,可以获得两个组,如附录(II-a)所示。如附录(II-b)所示,再定义了三个概念:distance(距离,表示当前指令的寄存器将隔多少个时钟周期而被后续的指令用到,如果距离大于3,则一律置为4),dependent(依赖性,表示当前指令是否依赖于第一条指令,依赖意思是当前指令的操作数来自第一条指令的目的寄存器),rewrite(覆写,表示当前指令的目的寄存器是否与第一条指令一致,一致则为覆写,否则不为覆写)。如附录(II-c)所示,算法II首先获取当前指令对应的指令组,然后填写附录(II-b)所示的表格,然后开始逐一检查后续指令,1、如果发现有指令依赖于第一条指令,且距离为4,则将第一条指令的生命周期置为4,退出;2、如果有依赖且距离小于4,则生命周期加1;3、如果出现了覆写,则判断生命周期是否是4,如果是的话不能丢弃,否则可以丢弃,返回生命周期。
    算法III是组外判断,由于本算法可以遍历整个程序,考虑到程序中可能存在的分支点,引入了一个容器来保存程序中的分支点。算法III的步骤为:1、如果判断出当前指令被后续指令使用,则表示当前指令的寄存器不能被丢弃,返回0,结束;2、否则,如果判断出当前指令的寄存器被后续的指令覆写了或者达到程序的结束出口,则开启下一轮的判断;3、如果下条指令是条件分支指令,那么必须同时判断分支是否发生两条路,这里将分支节点存入到分支容器中,需要注意的是如果在分支容器中发现了这个分支节点,则表示之前已经达到过这个分支点,意味着出现了环,需要把环剔除,否则将分支存入容器,并且先判定分支成功的支路,然后再判断分支失败的支路,直到达到2中所说的条件,算法结束。
    附录
    算法: 生命周期的静态推测
    输入: 源程序汇编代码
    参数: 当前指令curr_instr, 源程序src_instr
                          生命周期life, 写回丢弃wd, 计数器i, 指令数目instr_#
    输出: 生命周期数组 life_arr
    初始化:  将汇编代码转化为中间表达
    00:  foreach(i∈[0, instr_#))
    01:    curr_instrgetInstr(i);  src_instr = curr_instr
    02:    wd=inGroupLifetimeCalculation(&curr_instr, &life)
    03:    if(wd)  life_arr[i] = life;  continue;  endif  /* wd有效, 取下条指令 */
    04:    if(life == 4)  life_arr[i] = 4;  continue;  endif  /* 不能丢弃, 下条指令 */
    05:    wd = outOfGroupWriteDiscardingJudgement(src_instrcurr_instr)  
    06:    if(wd)  life_arr[i] = life;  continue;  endif  /* wd有效,取下条指令 */
    07:    life_arr[i] = 4  /* 保守推测,生命周期为4,取下条指令 */
    08:  endfor
    (I)
                                                    
    算法: 组内生命周期计算
    输入: 当前指令curr_instr,生命周期life
    参数: 四条指令组group, 加速器i, 列的 distance, dependent, rewrite
    输出: 写丢弃 wd
    初始化: group = getGroup(curr_instr);fillThreeColumns(group); i = 0; life = 0; wd = 0
    00:  while(i≤2 && (dependent[i] || !rewrite[i]))
    01:    if(dependent[i] && distance[i] == 4)  life = 4;  wd = 0;  break;  endif
    02:    if(dependent[i] && distance[i] != 4)  life++;  endif;
    03:    if(rewrite[i])  break;  endif;  i++
    04:  endwhile
    05:  if(rewrite[i] && life != 4)  wd = 1;  returnwd;  endif /* rewrite in-range detected */
    06:  updateCurrInstrToLastInstrOfGroup(group);  return wd
    (c)
    (II)
    算法: 组外写丢弃判断
    输入:源程序 src_instr,当前指令curr_instr
    参数: 下条指令next_instr, 分支点容器bp
    00:  bp.clear(); bp.push_back(curr_instr)
    01:  while(!bp.empty())
    02:    next_instr = getNextInstr(bp.pop_back())
    03:    while(1)
    04:      if(isConsumer(src_instrnext_instr))  return 0;  endif /*发现读后写 */
    05:      if(isRewrite(src_instrnext_instr) || isReachEnd(next_instr))  
    06:        break;  endif  /* 没有读后写,下轮推测 */
    07:      if(isConditionalBranch(next_instr))
    08:        if(bp.find(next_instr))  break;  endif  /*检测到环,下轮推测 */
    09:        bp.push_back(next_instr)  /* 没有环,保存分支点到容器 */
    10:        next_instr = getInstrFromBranchSucc(next_instr)  /* 分支成功推测 */
    11:      endif
    12:      else  next_instr = getNextInstr(next_instr)  endelse
    13:    endwhile
    14:  endwhile
    15:  return 1
    (III)

    关 键  词:
    一种 功耗 寄存器 丢弃 方法
      专利查询网所有文档均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    0条评论

    还可以输入200字符

    暂无评论,赶快抢占沙发吧。

    关于本文
    本文标题:一种低功耗的寄存器堆的写回丢弃方法.pdf
    链接地址:https://www.zhuanlichaxun.net/p-1489626.html
    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

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