CN108196884B - 利用生成重命名的计算机信息处理器 - Google Patents

利用生成重命名的计算机信息处理器 Download PDF

Info

Publication number
CN108196884B
CN108196884B CN201810144683.6A CN201810144683A CN108196884B CN 108196884 B CN108196884 B CN 108196884B CN 201810144683 A CN201810144683 A CN 201810144683A CN 108196884 B CN108196884 B CN 108196884B
Authority
CN
China
Prior art keywords
instruction
branch
register
instructions
branch history
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN201810144683.6A
Other languages
English (en)
Other versions
CN108196884A (zh
Inventor
索菲·威尔逊
杰弗里·巴雷特
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Avago Technologies International Sales Pte Ltd
Original Assignee
Avago Technologies General IP Singapore Pte Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Avago Technologies General IP Singapore Pte Ltd filed Critical Avago Technologies General IP Singapore Pte Ltd
Publication of CN108196884A publication Critical patent/CN108196884A/zh
Application granted granted Critical
Publication of CN108196884B publication Critical patent/CN108196884B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline or look ahead
    • G06F9/3802Instruction prefetching
    • G06F9/3804Instruction prefetching for branches, e.g. hedging, branch folding
    • G06F9/3806Instruction prefetching for branches, e.g. hedging, branch folding using address prediction, e.g. return stack, branch history buffer
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline or look ahead
    • G06F9/3836Instruction issuing, e.g. dynamic instruction scheduling or out of order instruction execution
    • G06F9/3842Speculative instruction execution
    • G06F9/3844Speculative instruction execution using dynamic branch prediction, e.g. using branch history tables
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline or look ahead
    • G06F9/3836Instruction issuing, e.g. dynamic instruction scheduling or out of order instruction execution
    • G06F9/3842Speculative instruction execution
    • G06F9/3848Speculative instruction execution using hybrid branch prediction, e.g. selection between prediction techniques

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Advance Control (AREA)

Abstract

本申请涉及利用生成重命名的计算机信息处理器。一种处理器,包括具有多个寄存器的寄存器文件,并配置为乱序指令执行,该处理器进一步包括重命名器单元,重命名器单元产生与寄存器文件地址相关的生成数以提供暂时偏离现有版本的寄存器的重命名版本的寄存器,而不是分配非编程可见的物理寄存器作为重命名的寄存器。处理器结构包括小重置DHL Gshare分支预测单元,小重置DHL Gshare分支预测单元耦接至指令高速缓存并且被配置成为指令高速缓存提供投机性地址。

Description

利用生成重命名的计算机信息处理器
分案申请的相关信息
本申请是申请日为2015年4月24日、发明名称为“利用生成重命名的计算机信息处理器”、申请号为201510203229.X的中国发明专利申请的分案申请。
相关申请的交叉引用
本申请要求于2014年4月25日提交的题为“Branch Prediction”的美国临时申请号61/984,711、和于2014年10月31日提交的题为“Computer Processor With GenerationRenaming”的美国非临时申请号14/530,038的权益,通过引用将其全部内容结合于此。
技术领域
本公开整体涉及计算机处理器。
背景技术
半导体制造的发展使得可以将大量逻辑电路结合到集成电路上。反过来,这导致数字系统架构的进步。大大得益于该性能而在单个集成电路上包括各种逻辑电路阵列的数字系统架构的一个特定领域是处理器设计。
发明内容
根据本公开的实施方式,提供了一种处理器,包括:预约队列(reservationqueue);重命名器(renamer),耦接至所述预约队列并被配置为产生生成数并将所述生成数(generation number)传递至所述预约队列;寄存器,耦接至所述预约队列并被配置为存储值;执行流水线(execution pipe),耦接至所述预约队列;以及缓冲器,耦接至所述执行流水线并被配置为接收所述执行流水线的输出,并且所述缓冲器进一步耦接至所述预约队列并被配置为将所述执行流水线的输出传递至所述预约队列。
进一步地,所述处理器包括:小重置DHL Gshare分支预测单元。
进一步地,所述处理器包括:加载/存储单元,被配置成为多个排队的加载指令和存储指令的每一个调度对内存的访问;其中,所述加载/存储单元包括资源锁定电路,所述资源锁定电路被配置为防止同时调度冲突的内存操作。
根据本公开的另一实施方式,提供了一种处理器,包括:指令高速缓存;指令解码器,耦接至所述指令高速缓存;预约队列,耦接至所述指令解码器;寄存器,耦接至所述预约队列并被配置为存储值;小重置DHL Gshare分支预测单元,耦接至所述指令高速缓存并被配置为生成地址并将所述地址传递给所述指令高速缓存;执行流水线,耦接至所述预约队列;缓冲器,耦接至所述执行流水线并被配置为接收所述执行流水线的输出,并且所述缓冲器进一步耦接至所述预约队列并被配置为将所述执行流水线的输出传递至所述预约队列。
根据本公开的又一实施方式,提供了一种处理器,包括:指令高速缓存;指令解码器,耦接至所述指令高速缓存;分支预测单元,耦接至所述指令高速缓存并被配置为生成指令地址并将所述指令地址提供至所述指令高速缓存;寄存器文件,被耦接以接收寄存器地址;重命名器单元,耦接至所述指令高速缓存和所述指令解码器;多个预约队列,所述多个预约队列的每个预约队列耦接至所述寄存器文件、所述指令解码器、和所述重命名器单元;多个执行流水线,所述多个执行流水线的每个执行流水线耦接至所述多个预约队列的相应一个预约队列,并且所述多个执行流水线的每个执行流水线被配置为从所述多个预约队列的相应一个预约队列接收指令和数据并且执行所述指令;解读机构(stunt box),耦接至所述多个执行流水线的每个执行流水线,并被配置为接收所述多个执行流水线的每个执行流水线的输出;其中,响应于所述指令解码器的输出,所述寄存器文件被配置为提供指令中指定为源的寄存器的内容;并且响应于所述指令解码器的输出,所述重命名被配置为同时提供生成数。
其中,所述分支预测单元包括小重置DHL Gshare分支预测器。
其中,所述指令高速缓存被配置为接收和存储VLIW指令。
其中,所述解读机构的输出耦接至所述多个执行流水线的每个执行流水线的输入,并且所述解读机构的输出进一步耦接至所述多个预约队列的每个预约队列的输入。
进一步地,所述处理器包括:加载/存储单元,耦接至所述解读机构和所述寄存器文件;以及存储器(memory,内存),耦接至所述加载/存储单元;其中,所述加载/存储单元被配置为从所述解读机构接收输入并从所述寄存器文件接收输入。
其中,所述多个预约队列的每个预约队列被配置为存储指令操作码、目的地寄存器地址、和目的地寄存器生成数。
其中,所述多个预约队列的每个预约队列进一步被配置为存储第一源寄存器地址、第一寄存器生成数、第一寄存器值、第一有效位、第二源寄存器地址、第二寄存器生成数、第二寄存器值、和第二有效位。
其中,所述指令解码器识别指定配对寄存器操作的指令。
其中,所述寄存器文件包括多个寄存器;并且所述重命名器单元包括用于所述多个寄存器的每一个的寄存器重命名模块。
其中,所述解读机构被配置为同时将配对的宽输出(pair-wide output)和单个宽输出(single-wide output)放置到所述操作数复制网络。
进一步地,所述处理器包括指令获取单元。
其中,所述指令获取单元包括:循环计数寄存器,被配置为存储循环计数值或投机性循环计数值(speculative loop count value,推测的循环计数值);循环开始寄存器,被配置为存储循环开始地址;以及循环匹配寄存器,被配置为存储循环匹配地址。
其中,所述指令获取单元耦接至所述所述指令解码器和SIN分配器,并且所述所述指令获取单元被配置成为所述SIN分配器提供指示循环计数值的信号,所述循环计数值表示投机循环执行。
其中,所述指令解码器耦接至所述循环计数寄存器、所述循环开始寄存器和所述循环匹配寄存器。
其中,所述指令获取单元被配置为生成循环匹配信号。
其中,所述指令解码器被配置为从所述指令获取单元接收所述循环匹配信号。
附图说明
参考附图已描述示例性实施方式。在附图中,相同的附图标记表示相同的或功能相似的元件。此外,参考标号最左边的数字表示该参考标号首次出现的附图。
图1是示例性处理器的高级框图。
图2是实施寄存器重命名的示例性处理器的高级框图。
图3是示出根据实例实施方式的寄存器重命名过程的流程图。
图4是具有资源锁定(resource locking)的示例性处理器的高级框图。
图5是示出根据实例实施方式的状态确定过程的流程图。
图6是示出根据实例实施方式的指令状态更新过程的流程图。
图7是实施解读机构(stunt box)的示例性处理器的高级框图。
图8是实施解读机构的另一示例性处理器的高级框图。
图9是示出根据实例实施方式的结果选择过程的流程图。
图10示出了根据本公开的实施方式的实例分支预测单元(branch predictionunit)。
图11更详细地示出了根据本公开实施方式的分支预测单元。
图12示出了根据本公开实施方式的全局分支历史记录寄存器的实例更新。
图13示出了根据本公开实施方式的全局分支历史记录寄存器的预设置。
图14示出了根据本公开实施方式的用于提供索引以访问大分支历史记录表中的条目的实例系统。
图15示出了根据本公开实施方式的用于提供索引以访问小分支历史记录表、混合选择器、和更新计数器的每个中的条目的系统。
图16示出了根据本公开实施方式的用于更新存储于大分支历史记录表和小分支历史记录表中的分支预测条目的实例状态机。
图17示出了根据本公开实施方式的实施零开销循环(zero overhead loop)的架构的一部分。
图18示出了根据本公开实施方式的用于实施零开销循环的架构的一部分。
图1至图18示出了各个组件、它们的布置、以及相互连接,并且如同在本领域中大家所熟知的那样,附图不一定是按比例绘制。
具体实施方式
以下具体实施方式参考附图以说明示例性实施方式。在具体实施方式中,对“一个示例性实施方式”、“示意性实施方式”、“示例性实施方式”等的引用是指所描述的示例性实施方式可包括特定的特征、结构或特性,但每个示例性实施方式可不一定包括特定的特征、结构或特性。而且,这些短语不一定指相同的示例性实施方式。此外,当结合示例性实施方式描述具体的特征、结构或特性时,结合其他示例性实施方式来影响这些特征、结构或特性在相关领域的技术人员的知识范围内,而不管是否明确说明。
提供本文所述的示例性实施方式是用于说明的目的而非用于限制。其他示例性实施方式也是可行的,并且可在本发明的精神和范围内对示例性实施方式进行修改。
应当理解,本文中的措辞或术语是为了描述而非限制,因此,本说明书的术语或措辞应由相关领域的技术人员根据本文中的教导进行解释。
术语
在电子领域,术语芯片、管芯、集成电路、半导体器件、及微电子器件通常可互换使用。
如在本文中使用的,FET是指金属氧化物半导体场效应晶体管(MOSFET)。在本文中n-沟道FET是指NFET。在本文中p-沟道FET是指PFET。
CMOS是代表互补金属氧化物半导体的缩略词,并且是指NFET和PFET形成在相同的芯片中的半导体制造工艺。
CMOS电路是指其中NFET和PFET两者一起使用的电路。
SoC是代表片上系统的缩略词,并且是指包括两个或更多个通常由总线相互连接的电路模块的芯片,其中,那些电路模块提供这种高级功能,先前这些块被看作系统级别组件。举例来说,迄今为止具有所需级别的功能的电路模块包括标量(scalar)、超标量(superscalar)、以及超长指令字处理器;DRAM控制器(例如,DDR3、DDR4和DDR5);闪存控制器;通用串行总线(USB)控制器等。该列举是示例性而非限制性的。描述SoC的另一常见方法例如是包括实施电子系统所需的所有组件的芯片,诸如,计算机系统或基于计算机的系统。
VLIW是超长指令字的缩写。
如在本文的示例性实施方式的描述中使用的,VLIW指令是指组合在一起以呈现给指令解码器的指令集。指令集中的各个指令被分配为用以执行的多个执行流水线(execution pipe,执行管线)之一。
IC0是指在指令高速缓存的输入上的伪阶段(pseudo-stage)。
IC1是指指令高速缓存阶段。在该周期做出对指令高速缓存的获取(fetch)请求,并伴随有计算以确定下一次存取哪个PC。在该阶段上供应先前请求的VLIW指令。
DE1是指指令解码器的第一阶段。
DE 1_operation是指由指令解码器的第一阶段执行的逻辑操作。
DE 1_time是指其中出现DE1_operation的周期。
DE2是指指令解码器的第二阶段。
DE 2_operation是指由指令解码器的第二阶段执行的逻辑操作。
DE 2_time是指其中出现通用寄存器文件(GRF)和预测寄存器文件(predicateregister file)(PREG)的读取和重命名的周期。
RS是指预约站。存在能够排队的几个不同的预约站。在最好的情况下,这是单个循环阶段,然而操作可结束在此的很多周期的排队。
EXn是指执行流水线的第n阶段。执行流水线的实例包括ALU短流水线和长流水线,分支和负载存储单元。
SHP是指短执行流水线。短执行流水线用以执行单循环运算。
LOP是指长执行流水线。长执行流水线用于执行需要完成2-8个循环的指令。
LSU是指加载存储单元。
DTCM是指数据紧密耦合内存(data tightly coupled memory)。
PBUS是指连接至外围存储器的总线。
DCACHE是指用于缓存对外围存储器的访问的数据缓存。
排队(enqueue)是指DE2中的VLIW指令被分成其分量操作(component operation)后沿流水线向前移至预约站的动作。
发布(issue,下发)是指将操作从预约站移动到执行单元。操作是指当从预约站移动至执行单元时被发布。操作是VLIW指令的构成部分。
当前PC是指当前在给定阶段中的指令的程序计数器(PC)的值。流水线的每个阶段会具有其自身版本的当前PC。
下一PC是指从Icache取出的下一PC。对于直线式代码(straight line code),这将是当前PC+当前指令宽度,对于重定向代码(redirected code),它将是新目标PC。
循环开始地址是指循环体中第一指令的地址,即,开始新循环迭代的分支的地址。
循环结束地址是指在循环体之后第一指令的地址,即,自然退出循环的分支的地址。
循环体是指始于循环开始地址并终于循环匹配地址(loop match address)的指令。
循环匹配地址是指循环体中最后一个指令的地址。
循环计数是指应当执行的循环的迭代数量。这来自用于LOOP操作的立即字段(immediate field)或者用于ZLOOP和ZLOOPS操作的通用寄存器。
SIN是指投机(Speculation)索引号,其被用于识别在分支的附近投机性地排队的指令。
SIN解析(resolution)是指确定分支是否正确投机。在EX1中进行SIN解析。
SIN验证是指正确投机的EX1中的分支,其反过来将验证与在正确投机的分支附近的操作相关的SIN。验证操作是将更新架构状态的操作。
SIN取消是指错误投机的EX1中的分支,其反过来将取消所有突出的SIN,并进行EX1重定向,有效地从执行流水线中清除分支附近的所有操作。在一个实施方式中,清除错误投机的分支附近中的操作包括改变与执行流水线中的那些指令中的每个指令相关的位的状态。
状态相干执行(State coherency enforcement)(SCE)是指由内部机构执行的以防止将来的操作看见不连贯的机器状态的动作。
陷阱事件(Trap event)是指同步、异步及故障事件的设置。
同步陷阱事件涉及具体指令并及时检测以防止引起事件的指令排队。监管程序调用(SVC)指令适合这种类型。这些如它们在指令流中总体定义的地方中发生的一样精确。
从当前指令序列中独立出现异步陷阱事件(中断)。异步异常适合这种情况。
故障陷阱事件防止程序流恢复。故障陷阱事件的实例是错位的PC和数据中止。具有寄存器目的的故障操作必须完成寄存器值。
处理器概述
公开了一种处理器架构,包括具有多个寄存器的寄存器文件,并被配置为乱序指令执行,该处理器架构进一步包括重命名器单元,其产生与寄存器文件地址相关的生成数以提供暂时偏离现有版本的寄存器的重命名版本的寄存器而不是分配非编程可见物理寄存器作为重命名的寄存器。处理器架构包括小重置双历史记录长度(DHL)Gshare分支预测单元,其耦接至指令高速缓存并被配置为为指令高速缓存提供投机地址。处理器架构适于在集成电路中实施。这种集成电路通常但不一定利用CMOS电路实现。
在一个示例性实施方式中,在集成电路中实现根据本公开的处理器作为嵌入式处理器。
图1是示出根据本公开的示例性处理器的主要模块的高级框图。示例性处理器包括指令高速缓存102,该指令高速缓存耦接为从分支预测单元104接收VLIW指令地址并进一步耦接成为分支预测单元104、指令解码器106、寄存器文件108、以及生成重命名110提供输出。生成重命名110耦接至分支执行单元118以接收SIN控制信号,耦接至SIN分配器以接收SIN数,耦接至解读机构124以从操作数复制网络接收输出,并耦接至分支预约队列112、执行流水线预约队列114A、114B、114C、114D,以及加载/存储预约队列116。寄存器文件108耦接至解读机构124以从操作数复制网络接收输入,并进一步耦接至分支预约队列112、执行流水线预约队列114A、114B、114C、114D,以及加载/存储预约队列116。分支预约队列112耦接至分支执行单元118。执行流水线预约队列114A、114B、114C、114D各自分别耦接至相应的执行流水线120A、120B、120C、以及120D。执行流水线120A、120B、120C、和120D各自耦接为向解读机构124提供输出。每个执行流水线120A、120B、120C、以及120D分别耦接以将它们的输出提供回到它们的输入,并且各自被进一步耦接以输出分支执行单元118的输出以接收SIN控制信号。内存122耦接至加载/存储单元116。加载/存储单元116进一步耦接至系统总线126。
指令高速缓存102保持先前由指令获取单元(未示出)取出的VLIW指令。通常从布置在处理器本身以外的内存取出VLIW指令。分支预测单元104示出为耦接至指令高速缓存102。分支预测单元104提供VLIW指令的地址以取出。如果指令高速缓存102中存在所需的VLIW指令,那么其被提供至指令解码器106。如果指令高速缓存102中不存在所需的VLIW指令,那发生高速缓存缺失并且从布置在处理器之外的内存获取所需指令。
分支预测单元104具有几个功能,包括提供指令高速缓存102所需的程序计数器值、不同阶段所需的程序计数器值以及整个处理器的逻辑块。对于连续执行程序代码,程序计数器值仅改变刚获取的指令的长度。但是当检测到分支指令时,则分支预测单元104确定应当从什么地址获取下一指令。在该示例性处理器中,分支预测单元104使用小重置DHLGshare分支预测机构以确定下一个指令地址。
指令解码器106解码VLIW指令的内容并为处理器的各个其他块提供控制信息。
寄存器文件108包含预定数量的编程器可见的(programmer-visible)寄存器。这些寄存器保持在执行程序的过程中使用的值。
从VLIW指令获得的各个指令排队进入选择的预约队列。当可获得执行进入队列的指令所需的运算数时,将指令发布到与选择预约队列相关的执行流水线。
当那些寄存器实例按照惯例被再分配至不同的非编程器可见的物理寄存器时,生成重命名110被用于为指令中的寄存器实例分配生成数。
预约队列保持等待发布的指令。
解读机构124提供用于接收和分配执行流水线的输出的机构。解读机构124为操作数复制网络提供数据。操作数复制网络允许执行流水线的所有结果对于处理器内的其他块是可获得的。以这种方式,等待从另一指令的执行中产生操作数的指令无须等操作数写回寄存器文件并且然后读出寄存器文件。而是,通过操作数复制网络使所需操作数对于等待特定结果的整个处理器的所有位置是可获得的。
系统总线126提供嵌入式处理器的机构以与处理器本身以外的集成电路上的其他逻辑模块通信。
利用生成数重命名
处理器包括许多不同的物理资源,例如,寄存器、执行单元、运算单元、内存、控制逻辑等。处理器中包含的物理资源之一是当编程器在生成软件时使用的结构上可见的寄存器组。这些寄存器物理地存储处理器使用的信息,如通过软件指导。基于处理器的设计和实施的指令集来确定寄存器的组内可用的寄存器的数目。因为存在寄存器组,常常要求编程器在创造它们的软件时重新使用寄存器。
处理器在执行软件时为了保证适当执行程序需要确信及时在最佳时间确认修正值在每个寄存器中。这对能够根据可获得的资源按不同的顺序执行指令的乱序机器来说是这样的,因此对于能够同时获取、解码、以及执行多个指令的超长指令字(VLIW)处理器更是如此。为了解决这些问题,开发了生成重命名。生成重命名允许过程为寄存器文件的每个结构寄存器维持值,同时允许每个寄存器的多个版本、命名的生成存在于机器内。每一生成表示新数值将存储或可存储在寄存器中。不同的寄存器可同时使用不同的生成。例如,机器可使用R0的生成2、3、及4同时使用R1的生成5和7。结构上,每个寄存器具有与其相关的值,维持当前正使用的生成的手段、以及用于识别上次已知正确地使用的生成和任何投机性使用的生成的一组指针。下面将更详细地描述这些部件。
由于独立的指令正在进行,例如,等待执行、正被执行、或等待退出(retire),与独立的指令相关的寄存器保持表示该指令正使用每个寄存器的生成的描述。因此,正要进行使用相同的寄存器的多指令而同时允许软件预期执行。能够维持指令直至可获得它们的源寄存器中的每个的正确的生成。即使指令使用相同的目的寄存器,它们能够执行。而且即使将修改相同的寄存器指令能够引退而不会在程序执行中引起误差。在最小附加逻辑下,主要涉及向正确的指令转发正确的值,处理器在维持与结构上可见的寄存器相关的寄存器文件时能够执行。例如,由于指令退出,目的寄存器的值可被转发至请求具有该生成的寄存器的正在执行的指令。在实例中,如果这也是在进行的最后生成的寄存器,值也可写入到寄存器文件。
生成允许处理器在使用相同的结构寄存器的同时允许处理器获取、排队、并执行多个指令。这减少或消除中止执行流水线以等待先前指令的结果的需要。例如,编程器(programmer)可能希望仅使用6个寄存器执行以下代码:
Inst 0:Add R0,R1,R2
Inst 1:Add R0,R1,R2
Inst 2:Add R0,R4,R5
Inst 3:Mul R4,R0,R0
在该代码中,程序员将R1和R2中的值相加并将结果存到R0中。然后对那些结果(存储在R0中)求平方并存储在R1中。接下来,R4和R5中的值相加并将结果再次存储到R0中。类似地,对该结果求平方并存储在R4中。
通常,处理器必须中止指令2直至指令1完整(或者在指令1执行时风险R0包含错误值),或使用程序员所看不见的寄存器以放大可用寄存器的组并在读取(WAR)由重新使用寄存器R0引起的故障之后删掉写入。如果这未完成,那么R0中的值可能是不正确的,因而,将不期望的值存到R1中。每次遇到故障时使机器停止运转会明显减小处理器的性能。增大存储结构寄存器和非编程可见寄存器两者的寄存器文件的大小能够缓和这个问题。但这需要增大转发逻辑和重命名逻辑以跟踪哪个寄存器存储指令正使用的结构寄存器的值。物理寄存器数目的增加增大功率消耗和芯片面积。
即使在那些指令指定相同的寄存器的用途时,生成重命名允许处理器维持具有结构寄存器的寄存器文件,同时允许处理器排队并同时执行指令。具体地,这允许改变相同寄存器的值的两个指令排队、发布并执行而不会根据任一指令影响剩余的软件的执行。每次寄存器用作目的时,其被标记有新生成数。此后使用寄存器的每个指令将会使用新生成数直至生成数再次增大。一旦起始指令执行并且为寄存器确定值,能够更新使用该寄存器和该生成数的所有等待指令以指示它们对该寄存器具有有效值。
回到以上实例,我们将使用规约
Figure BDA0001578504810000121
m以表示Rn生成m。对于以上代码段,我们将假定寄存器的生成信息是
Figure BDA0001578504810000122
0、
Figure BDA0001578504810000123
1、
Figure BDA0001578504810000124
1、
Figure BDA0001578504810000125
3、以及
Figure BDA0001578504810000126
0。在该示例性实施方式中,当指令排队时,生成数分配如下:
Inst 0:Add
Figure BDA0001578504810000127
1,
Figure BDA0001578504810000128
1,
Figure BDA0001578504810000129
1(R0的生成增加,R1和R2保持相同)
Inst 1:Mul
Figure BDA00015785048100001210
3,
Figure BDA00015785048100001211
1,
Figure BDA00015785048100001212
1(R1的生成增加,R0保持相同)
Inst 2:Add
Figure BDA00015785048100001213
2,
Figure BDA00015785048100001214
0,
Figure BDA00015785048100001215
1(R0的生成增加,R4和R5保持相同)
Inst 3:Mul
Figure BDA00015785048100001216
4,
Figure BDA00015785048100001217
2,
Figure BDA00015785048100001218
2(R4的生成增加,R0保持相同)
因而,在不影响指令1的结果的情况下,生成重命名允许发布并执行指令2。在以上实例中,如果在指令1之前执行指令2,在不影响使用其他生成R0的指令的情况下指令2的结果将会转发到使用
Figure BDA0001578504810000131
2的所有其他指令。例如,一旦执行,等待那些结果的任何正在进行的指令可以复制指令的结果。如以下将论述,例如,如果我们具有两个执行单元,我们的指令中的每一个能够排队到不同的执行单元。如果加法指令比乘法指令执行的更快,则我们可掌握下列所述:
时间1:将指令0放到队列0中;将指令1放到队列0中;将指令2放到队列1中;将指令3放到队列1中;
时间2:执行指令0和指令2(不取决于任何先前指令的结果)
时间3:退出
Figure BDA0001578504810000132
1;适当更新指令1和指令3;执行指令1和指令3,使用指令0和指令2的结果(这假定对于该处理器,指令2的结果能够转发回指令3)
可替换地:
时间1:将指令0放到队列0中;将指令1放到队列0中;将指令2放到队列1中;将指令3放到队列1中;
时间2:执行指令0和指令2(不取决于任何先前指令的结果)
时间3:退出
Figure BDA0001578504810000133
1;适当更新指令1;开始使用指令0的结果执行指令1。
时间4:退出
Figure BDA0001578504810000134
2;适当更新指令3;开始使用指令2的结果执行指令3。
因而,生成重命名允许多个指令同时存在于处理器中。虽然看似有序执行可乱序执行这些指令(即,乱序执行和有序执行的结果是相同的)。通过允许多个版本的各个寄存器存在于处理器中生成重命名允许这种情况发生因此能够更新指令并使用相同的寄存器而不彼此干扰执行。
生成重命名结构
参考图2,处理器的示例性实施方式包括寄存器文件202、重命名204、预约队列208、执行单元210、以及解读机构212。
寄存器文件202被配置为存储每个结构寄存器的值。例如,寄存器文件202可存储通用寄存器R0-R32、推断寄存器(predicate register)P0-P7、以及乘法和加法(MAC)寄存器M0-M7的值。在实施方式中,寄存器文件202包括当执行流水线的结果被写入寄存器文件的结构寄存器时进行控制的写控制电路。
在实施方式中,处理器包括一个或多个结构寄存器的重命名204。重命名204可包括空中阵列(inflight array)216、真指针(true pointer)218、一个或多个投机指令数(SIN)指针220、使能电路(enable circuit)222、以及验证电路224。每个空中阵列216指示目前处理器正在使用哪个寄存器的生成。例如,空中阵列216可指示处理器目前正在使用R0的生成2、4、以及5。
因此,在处理器中每个空中阵列216维持指令目前正使用的每个寄存器的所有生成列表。空中阵列216可以是圆形阵列。因此,在分配阵列中上次生成后,例如,生成7,分配的下一生成将会是生成0。这些生成可用在预约队列、加载/存储(L/S)队列、执行单元、解读机构等中。
为了确定哪个生成是使用的最新生成,真指针218用于每个结构寄存器。每个真指针218指向相关空中阵列216中的位置,该位置表示用作指令目的的该寄存器的上次生成。例如,在上述代码段中,在取出并重命名指令3之后,R0的真指针218将会指向
Figure BDA0001578504810000141
2,R1的正确指针218将会指向
Figure BDA0001578504810000143
3,并且R4的真指针218将会指向
Figure BDA0001578504810000142
4。可以几种方法使用真指针218。例如,当指令被解码时,真指针218指向用于指令源的寄存器的生成。对于目的地,在真指针后可将生成设置为下一生成。
在实施方式中,当结果退出时,可发生一些不同的事。寄存器这次生成的值可转发至使用目前预约队列中的该寄存器的这次生成的所有的指令并且能够设置那些寄存器的有效位。有效位允许处理器确定准备发布哪个指令来执行。在实施方式中,如果值不是投机的,即,在我们猜测到结果的条件分支指令之后未生成值,相关空中阵列216中的该生成的空中位(in-flight)被清除。
使能电路222也使用退出的结果值、退出的结果生成数、以及真指针218确定该结果是否应当写入寄存器文件202。真指针218指向非投机执行的寄存器的上次生成。即,在已投机性预测处理器的任何条件分支之前,真指针218指向分配寄存器的上次生成。如果退出的结果生成数与真指针218匹配,则空中没有写给该寄存器的非投机指令。在那一点上,可将值写入寄存器文件202。因此,使能电路222能够为该寄存器设置允许写入并具有写给寄存器文件202的退出结果值。这可限制对寄存器文件202进行的不必要写入的数。
除了真指针218,一个或多个SIN指针220也分配至每个寄存器。SIN指针220用于跟踪已分配至已投机地取出、排队或执行的指令的寄存器的生成。例如,以下代码段检索指令0中的内存的值并执行指令1-6,次数等于检索值。指令1-6占用起始于内存位置0x00200020并且每个元件双倍的阵列。
Inst 0:LD R0,[0x10]
Inst 1:ADD R1,0x00200020
Inst 2:LD R2,[R1]
Inst 3:MUL R2,R2,0x2
Inst 4:ST R2,[R1]
Inst 5:SUB R0,R0,0x01
Inst 6:BNZ Inst 1
当处理器到达指令6时,其必须确定或者返回到指令1或者用下一连续指令继续执行。该确定基于R0中的值。该指令试图用位于内存位置0x10的值加载R0。这可能需要花些时间从内存检索,尤其如果值位于主存储器,而不是高速缓冲存储器。当从内存检索该值时,处理器可以决定投机性地执行额外指令。其可以基于例如过去的历史记录确定分支回到指令1。
由于从主存储器检索信息所需的时间,可能多次投机性地执行该循环。虽然处理器知道第一次执行的结果是正确的,但每次额外迭代都将是投机性的直到我们从内存接收指令0所需的值为止。
因此,对于指令6的每次投机性执行,分配新SIN指针220。对于每个SIN指针220,分配新版本的R1和R0(参见指令1和5),并分配两个新版本的R2(参见指令2和3)(存储指令-指令4-不具有寄存器目的)。在循环4次后,R1和R2起来可能这样:
R1.True Pointer=>
Figure BDA0001578504810000161
1
R1.SIN0Pointer=>
Figure BDA0001578504810000162
2
R1.SIN1Pointer=>
Figure BDA0001578504810000163
3
R1.SIN2Pointer=>
Figure BDA0001578504810000164
4
R1.SIN3Pointer=>
Figure BDA0001578504810000165
5
R1.Inflight Array=011111000…0
如果此时,完成对R0的加载,其值大于4,然后,确定投机执行指令中的每个,这些寄存器中每个寄存器的SIN3指针复制到真指针中,并且非投机性地继续执行。但是,如果值小于4,例如,2,必须展开一个或多个执行。正确的指针(例如,SIN1指针)被复制到真指针,新的正确指针与最新分配的SIN指针(例如,SIN3指针)之间所有空中位(例如,R1)被清除。空中阵列位4-5。空中阵列位5-8。
因为投机执行的指令的结果未加载到寄存器文件202,寄存器文件202不需要进行改变。
在实施方式中,如果寄存器文件中的值有效那么也可以确定重命名204。当对指令进行解码并加到预约队列中的队列中时,存储于寄存器文件202中的值也被复制到预约队列中。此外,设置指示该源寄存器值是否有效的有效位。验证电路224处理设置位。如果真指针所指的寄存器的生成(或最近分配的SIN指针,如果我们投机地执行该指令)是1,那么有效位被清除,并且如果是0,那么设置有效位。这意味着如果仍计算该寄存器生成的值(即,仍正在进行),那么寄存器文件202中的值不是有效的,但如果已经退出,那么寄存器文件202中的值是有效的。一旦设置了所有的源寄存器有效位,那么准备发放指令来执行。
生成重命名过程
在示例性实施方式中,可在对VLIW指令解码时将处理器配置为进行生成重命名。在另一个实施方式中,在已解码VLIW指令之后可进行生成重命名。
在步骤302中,处理器获取VLIW指令。例如,处理器取程序计数器(PC)所指的下一超高速缓冲存储器线。该超高速缓冲存储器线可包括可由多个单独指令组成的VLIW指令。例如,根据实施细节,VLIW指令可由2、4、或8单独的指令组成。在其他实施方式中,如本领域技术人员应当理解,根据实施细节,VLIW指令可由其他许多单独的指令组成,例如,3。
在步骤304中,能够识别用作VLIW指令内的源极和目的的寄存器。如以下更详细地描述,该信息可提供至其余的指令解码单元、寄存器文件、以及重命名。作为指令解码的一部分,能够识别与每个指令相关的寄存器(即,源和目的寄存器)。在另一个实施方式中,可将寄存器识别为分离单元的一部分并传递到指令解码单元、寄存器文件、以及重命名。
在步骤306中,能够对VLIW指令内的一个或多个指令进行解码。在一个实施方式中,这是指令解码单元的第二相位的一部分,第一阶段包括识别寄存器。进行两个步骤的解码的一个优点是寄存器识别,这可以是简单并快速的,可在循环初期进行,从而允许其他元件处理依靠正识别的寄存器的指令。
在步骤308中,能够访问寄存器文件,例如,寄存器文件202,并且能够识别在VLIW指令中所使用的任何源寄存器的生成的值。在这一点上,识别被写入到寄存器文件的源寄存器的上次生成。这个值可以有效或可以无效。因此,该值与VLIW指令投机性地相关。如以下将描述的,对于该VLIW指令的源寄存器需要的生成,将设置指示该值是否是正确值的有效位。
在步骤310中,生成数与在步骤304中识别的寄存器数相关。需要指示与寄存器数相关的值的该生成数来完成指令。例如,如果VLIW指令指示其将寄存器R0用作源寄存器,那么目前在处理器中使用的R0的上次生成可与VLIW指令相关。这可以是目前正在进行的R0的生成并将在将来的某一天变得可用。或者这可以是早期计算的R0的生成并可以加以应用。在另一实例中,如果VLIW指令指示寄存器数是目的寄存器,那么下一可用非空中R0的生成与该VLIW指令相关。例如,如果生成3-6目前正在进行,R0生成7将与VLIW指令相关。
在实施方式中,指针,诸如,真指针或以上论述的SIN指针,能够识别目前正在进行的寄存器的最新生成。例如,如果目前所取的指令不是投机性的(即,已解析所有先前的分支指令),可用真指针识别寄存器的最新有效生成。如果投机性地获取指令则可使用SIN指针来识别寄存器的最新有效生成。
在实施方式中,可将源寄存器标记为指示它们使用该VLIW指令产生的值。例如,第一单独的指令可增大由第二单独指令检索的值,其中,两者都包含在相同的VLIW指令内。在这个实施方式中,为第一单独指令识别的源寄存器可包括VLIW指令内的标记,该VLIW指令指示其使用VLIW指令内另一单独指令的结果。如果这样加标记的话,不是与可用于寄存器的最后空中生成相关,而是第一单独指令的源寄存器将与下一可用非空中生成有关。这对于第二单独指令的目的地的生成来说将会是相同的生成,从而指示第二单独指令的结果在可获得时能够被转发到第一单独指令。
在步骤312,对于被识别为VLIW指令的源寄存器的识别寄存器,确定从寄存器文件检索的值是否是有效的。例如,能够检查寄存器数的空中阵列。如果所使用的上次生成的指针指示目前未正在进行生成并且所使用的上次生成与VLIW指令的源寄存器的生成相匹配,则能够设置有效位。从寄存器文件检索的值是正使用的源寄存器的生成的正确版本。在实施方式中,如果不存在正使用的SIN指针(即,不存在正投机执行的指令)和真指针,则仅设置有效位。
在步骤314,将单独指令加到预约队列中。这包括添加要执行的指令的操作码,源和目的寄存器数、相关生成数、源寄存器的值、以及源有效位也被加到预约队列。
加载/存储调度的资源锁定
除了使用相同的寄存器,程序内的指令通常指定相同资源的使用。资源可包括但不限于具体的寄存器,例如,乘法和加法(MAC)寄存器、或内存,例如,内存阵列的每个库。在实施方式中,能够同时访问一些或所有这些类型的资源。在实施方式中,存在与不同资源相关的局限性,例如,MAC不能同时由两个指令写入或如果它们被写入到不同的地址或相同地址内的不同位两个指令仅可同时写入相同的内存库。
在实施方式中,对于更新资源的指令,可使用逻辑电路图来确定物理资源何时能够在任何时间更新。对于更新MAC寄存器的指令,处理器的控制逻辑可评估更新MAC寄存器的其他等待指令。如果旧的等待指令更新相同的MAC寄存器,则在试图对MAC寄存器进行更新之前可能需要停用该指令。
在实施方式中,每次获取更新资源的指令并排队时,关于更新资源的所有等待指令能够设置该指令的状态信息。可在处理时钟周期维持该状态。
在实施方式中,对于排队更新资源的一个或多个指令的每个周期,处理器能够识别资源独立的任何指令。在不与任何其他等待冲突或执行指令的情况下能够执行的指令是资源独立的。在实施方式中,资源独立的指令是未更新相同的资源的指令作为任何旧的排队指令。例如,如果指令是MAC指令并更新MAC3,如果没有旧的排队指令处理器将会识别作为资源独立的指令也会更新MAC3。直至所有资源依赖关系被清除,否则指令将会被识别为取决于与旧的指令相同的资源。
在实施方式中,处理器能够识别资源独立的所有指令。该列表指示在该周期中很可能发布的所有指令。然后,处理器从要发布的队列中选择一个或多个指令。在实施方式中,处理器可基于指令的位置选择进行选择,例如,选择新指令之前的旧指令。在实施方式中,处理器可基于更新的资源数选择,例如,选择对更新很少的那些更新更多资源的指令(很可能是因为那些指令将会保持更多的指令)。处理器可基于由执行执行的操作类型从资源独立的指令的组中选择要发布的指令。例如,处理器可允许根据处理器的设计方式发布额外指令(例如,如果处理器能够发布2MAC指令,但仅有一个推断更新指令,并且MAC和断定两者都是资源,则处理器可能相比推断更新指令更喜欢发布MAC指令)。
在实施方式中,加载/存储(L/S)单元可被分成两个部分。一旦获取L/S指令,就将其放置在L/S单元的第一部分中。指令将会保持在L/S单元的第一部分中直至准备执行。对于加载指令,一旦已确定加载信息的存储地址就准备执行指令。对于存储指令,一旦已经确定存储的值和存储值的存储地址就准备执行指令。
一旦L/S指令准备执行,其从L/S单元移动并被放置在L/S单元的第二部分中的指令的队列之上。在实施方式中,L/S单元的第二部分内的每个指令与可用于选择用于发布的一个或多个指令的附加状态信息相关。
在实施方式中,状态信息包括关于存储指令的操作数是否是投机的状态。存储指令改变内存。很难撤消或退出重新对内存进行改变。因此,在一些实施方式中,未执行存储指令,并且未对内存进行改变,直到处理器确定对于执行存储指令可获得正确的操作数。
在实施方式中,状态信息可指示L/S指令与其他L/S指令的关系,尤其是其否能够发布或者是否阻止其被L/S单元中的一个或多个其他L/S指令发布。例如,如果目前L/S单元中存在三个L/S指令,当新L/S指令被添加到L/S单元时,新L/S指令的状态信息将包含关于三个旧L/S指令中每一个的状态信息。
在实施方式中,状态信息可包括是否准备发布L/S指令的指示。对于任何给定周期,可准备发布多个L/S指令。一旦分析了L/S单元内所有的L/S指令,选择一个或多个L/S指令以从指示它们准备发布的L/S指令发布。在实施方式中,可选择最旧的准备发布的L/S指令。在另一个实施方式中,可在准备发布存储指令之前选择准备发布加载指令。可根据处理器和系统设计权衡使用选择并发布L/S指令的其他方法。
在实施方式中,状态信息可包括两个L/S指令之间的关系。在实施方式中,状态信息可表示四个状态–独立、互相排斥、可合并、以及冲突。在上述划分的L/S单元实施方式中,随着每个L/S指令从L/S单元的第一部分移动至L/S单元的第二部分,可相对于目前在L/S单元中每个其他指令生成其状态信息。可维持该生成的状态信息直至发布L/S指令并可在其之前在其他L/S指令发布时更新。
在实施方式中,如果将L/S指令标记为独立于旧指令,这意味着如果准备好可分别发布两个指令。在实施方式中,如果每个指令的执行访问不同的存储器资源,则指令可被标记为相对于内存资源独立于另一指令。例如,如果内存阵列具有4个库,其每个可独立于另一内存库读取或写入,则读取或写入不同内存库的两个指令将被标记为独立的。
在实施方式中,如果L/S指令被标记为与旧指令互相排斥,这意味着如果两者都准备好则能够发布任一指令,但两者不能在相同周期内发布。因此,如果两者准备在相同周期期间发布,则新的那个可发布,旧的那个可发布,但两者不能一起发布。在以上实例中,在内存阵列具有四个独立内存库的情况下,如果每个指令的执行将从相同库读取在该库内的不同索引或者将不同索引写入该库内,在准备好时可执行任一指令,但两者不能一起执行因为在单个周期中每个库可仅写入或读取一次。
在实施方式中,如果L/S指令被标记为与旧指令可合并,这意味着新指令可与旧指令一起或在旧指令之后而非之前执行。因此,如果准备发布新指令,其可在与旧指令相同周期或此后的任何周期发布,但如果旧指令还没发布或还没选择发布则不能发布新指令。例如,在内存阵列具有四个独立内存库时,如果两个指令是存储指令并且每个指令的执行写入一个或多个相同的内存位置(例如,如果它们两者都具有它们要写入的重叠字节),则将新指令标记为可合并。在该实例中,如果旧指令能够发布,而非新指令,则不会有问题。但新指令必须等旧指令执行,否则重叠字节可能以错误值结束(来自未来将发布的旧指令的值,而不是准备发布的新指令)。并且如果准备发布两个指令,则可同时发布。可将重叠字节的值设置为新指令将会存储在该位置的值。
在实施方式中,如果将L/S指令标记为与旧指令冲突,这意味着必须在旧指令之后发布子指令。例如,在以上实例中,内存阵列具有四个独立内存库的情况下,如果旧指令是存储指令且子指令是加载指令,并且它们两者都访问内存中至少一个相同位置,那么子指令必须在本身被发布之前等待旧指令发布。如果在旧存储指令之前发布新加载指令,将检索到任何重叠位置的错误值。
以下是L/S指令如何在L/S单元内与它们的相关状态指示一起被跟踪的实例。为了示出以上条件和关系以下实例使用简化内存结构。该实例使用使用以上的四个库内存实例,其中,每个库包括索引的编号(即,行),如以下示出的。
Figure BDA0001578504810000221
在这个实例中,在时间1,存储指令移动到L/S单元。在索引3,该存储指令将数据存储到库0和1。因为此刻在这个实例中L/S单元中不存在其他指令,其状态是清楚的。此外,准备状态是清楚的,这表示该指令当前是投机的。在以下实例中,我们将使用以下规则描述L/S指令-St[R0],R1I 3,B0/1。在该规则中,“St”是用于存储的指令-“St”或者用于加载的“Ld”。“[R0]”,即,第一操作数是目的地。在该实例中,“[]”表示目的是由R0指向的地址。例如,如果R0是0x00010000,该指令最终将会存储值以对内存中的0x00010000寻址。“R1”,即,第二操作数是源。在这个实例中,这是将会存储到R0指向的地址中的值。
Figure BDA0001578504810000222
在时间2,第二存储指令移动到L/S单元。该存储指令也将数据存储至库0,但是存储在索引1处。然后处理器相对于所有的现有指令更新该指令的状态。该指令不是投机性的,所以准备评估。因为该指令作为第一存储指令写入相同内存库,但写入不同的索引,指令互相排斥。任何一个都可相对于另一个在任何时候执行,但它们不能同时执行。
时间2:
Figure BDA0001578504810000231
在时间3,加载指令移动到L/S单元。该加载指令从索引3的库1检索信息。通过该加载指令访问的内存的至少一部分与通过第一存储指令写入的存储器相匹配。当该指令移动进入L/S单元时,处理器相对于所有的现有指令更新该指令的状态。始终准备评估加载指令。因为从相同内存库读取该指令作为第一存储指令,索引相同,并且存在内存重叠,指令冲突。任何一个都可相对于另一个在任何时候执行,但它们不能同时执行。因为与第二指令相比该指令写入不同的库,指令彼此独立。因此,状态看来像:时间3:
Figure BDA0001578504810000232
在时间4,第三存储指令移动到L/S单元。该存储指令将信息写入在索引3的库1。该存储指令的地址中没有一部分与先前的加载指令重叠。当该指令移动进入L/S单元时,处理器相对于所有的现有指令更新该指令的状态。该存储指令不是投机性的,所以准备评估。因为该指令作为第一存储指令写入相同内存库和索引,所以可合并指令。该指令可与第一存储指令同时执行或在其后任何时间执行。与第二指令相比该指令写入不同的库,所以指令彼此独立。因为该指令作为加载指令写入相同内存库,索引相同,但不存在内存重叠,所以指令互相排斥。
时间4:
Figure BDA0001578504810000241
在时间5,第二加载指令移动到L/S单元。该加载指令从索引3的库1检索信息。该加载指令的地址中没有一部分与第一存储指令重叠但部分与第三存储指令重叠。当该指令移动进入L/S单元时,处理器相对于所有的现有指令更新该指令的状态。始终准备评估加载指令。因为从相同内存条读取该指令作为第一存储指令,索引相同,但不存在内存重叠,指令互相排斥。与第二指令相比从不同的库加载该指令,所以指令彼此独立。从相同索引和相同库读取第一加载指令和第二加载指令。因此,指令彼此独立。没有什么能够阻止在另一个之前执行。因为从相同内存条读取该指令作为第三存储指令,索引相同,并且存在内存重叠,所以指令冲突。
时间5:
Figure BDA0001578504810000242
在实施方式中,一旦内存变得可用,例如,当系统总线可用时,处理器能够分析L/S单元中的等待的L/S指令以确定准备发布哪些指令。在实施方式中,从最旧的到最新的分析L/S指令,并且识别每个指令是否准备发布。在实施方式中,准备发布可包括关于L/S单元中其他指令的发布状态的附加信息(例如,准备发布,准备以指令X发布,或者如果指令X不发布准备发布)。这对可合并和互相排斥的指令来说是重要的。
继续以上实例,如果在时间6,处理器能够访问内存,其必须确定将执行哪个L/S指令或指令。因此,开始评估准备指令。在时间6的开始,L/S单元看来是这样:
时间6:
Figure BDA0001578504810000251
在实施方式中,从最旧的到最新的评估在第二L/S单元中准备评估的指令。因为不准备评估第一存储指令,所以不能发布。处理器能够暂时修改与第一指令互相排斥的所有指令以指示它们现在独立于第一存储指令。因此,现在可发布第二存储指令和第二加载指令,假定没有别的指令阻止它们。
接下来,评估第二存储指令。准备评估第二存储。与第一存储互相排斥。因为不发布第一存储,可暂时将状态修改为独立的。对状态的修改是暂时的但当周期结束时取消所有的状态改变。没有要评估的其他状态确定,所以第二存储可被标记为准备发布。
时间6:
Figure BDA0001578504810000252
接下来,评估第一加载指令。准备评估第一加载指令。其与第一存储冲突。因为还没发布第一存储,所以不能发布该加载。第一加载独立于第二存储指令。但是其不能发布直至第一存储指令发布之后。因此,不准备发布。
接下来,评估第三存储指令。准备评估第三存储指令。其可与第一存储指令合并。因此,其可与第一存储指令一起或在第一存储指令之后发布,但是因为还没发布第一存储指令,并且在该周期将不会发布,所以也不能发布第三存储指令。情况是这样,即使其独立于第二存储指令并与未准备发布的第一加载指令互相排斥。因此,不准备发布第三存储指令。
时间6:
Figure BDA0001578504810000261
接下来,评估第二加载指令。准备评估第二加载指令。其与第一存储指令互相排斥。未准备发布第一存储指令,所以与第一存储指令不冲突。第二加载指令可独立于第二存储指令和第一加载指令执行,所以与这些指令的任何一个也无冲突。但在第三存储指令写入时第二加载指令从相同索引和相同库读取,并且存在与存储重叠的部分加载,所以指令冲突。第二加载指令不能发布直至第三存储指令之后。
接下来,完成评估,处理器可选择要发布的指令。在这种情况下,准备发布的唯一指令是第二存储指令,从而,其发布。
继续以上实例,如果在时间7,处理器能够访问内存,其必须确定将执行哪个L/S指令或指令。此时,第一存储指令不再是投机性的并准备被评估。在时间6的开始时,L/S单元看来像:
时间7:
Figure BDA0001578504810000262
此时,准备评估第一存储指令。因为不存在与其冲突的旧指令,所以准备发布。处理器能够暂时修改可与第一指令合并的所有的指令以指示它们现独立于第一存储指令,即,假定不存在其他冲突它们可与第一指令一起执行。因此,修改第二存储指令以指示其独立于第一存储指令。
时间7:
Figure BDA0001578504810000271
接下来,准备评估第一加载指令。因为如果与第一存储指令冲突,则其不能发布直至第一存储指令已发布为止。因此,未准备好发布。处理器能够暂时修改与第一加载指令互相排斥的所有的指令以指示它们现在独立于第一存储指令,即,假定不存在其他冲突,它们可执行因为第一加载指令未执行。因此,修改第二存储指令以指示其独立于第一存储指令。
接下来,准备评估第二存储指令。由于以上论述的状态改变,假设第一存储指令发布,则第二存储器机器可发布。这是因为状态最初指示它们是可合并的,即,第二存储器可在第一存储指令之后或与第一存储指令一起发布。
最后,准备评估第二加载指令。因为其与第一指令互相排斥并且第一指令准备好发布,所以其不能发布。此外,第二加载指令与第二存储指令冲突,所以其不能发布直至在第二存储指令之后。
此时,已评估在L/S队列中所有的等待的指令。准备发布两个存储指令。根据内存系统的实施,此时可执行一个或多个L/S指令。例如,内存系统可被设计成每个周期仅处理一个L/S指令,每个周期多个L/S指令,或加载指令和存储指令的一些组合(例如,每周期1个加载指令和2个存储指令)。
时间7:
Figure BDA0001578504810000272
在该示例性实例中,已将内存系统设计成能每周期处理2个L/S指令。这可以是2个加载指令、2个存储指令、或者1个加载和1个存储指令。已认识到能够发布两个存储指令,在该周期处理器可发布这两者。在实施方式中,一旦指令被发布其可从L/S单元移除,可将涉及该指令的所有依赖关系改变为独立的,并且其余状态表可保持相同。在实施方式中,状态表仍可保持相同直至L/S指令被放入其最后的条目,这时其可使表固定以去除已发布的条目。在实施方式中,一旦指令被发布,不仅将其移除而且能够相应地转移表中所有其余条目。
在该实例中,每次L/S指令发布时状态表崩溃。在时间8的开始,已发布存储指令,状态表看起来:
时间8:
Figure BDA0001578504810000281
这时,如果准备好评估其他L/S指令可将它们移动到L/S单元并且可如上所述更新状态表。如果处理器能够访问内存,则这两个加载指令可发布(即,两者都准备发布,并且第二加载可独立于第一加载指令执行,所以两者将准备发布)。
资源锁定结构
参考图4,加载/存储(L/S)队列的示例性实施方式包括L/S预约队列1 402和L/S预约队列2 404。
L/S预约队列1 402可以是上述L/S单元的第一部分。当获取L/S指令时,其先放置在L/S预约队列1 402中。一旦解析L/S指令的操作数,其可放置在L/S预约队列2 404中。加载指令从内存中的位置采取数据并将其加载至目的地,通常,寄存器。因此,对于加载指令,所需要解析的是内存中的位置。对于存储指令,通常存储在寄存器中的值存储至内存位置。因此,对于要移动至L/S预约队列2 404的存储指令,需解析将被存储的值和值将被存储的位置。
L/S预约队列2 404可以是上述L/S单元的第二部分。L/S预约队列2404包括状态选择逻辑406、状态更新和发布确定逻辑408、以及L/S指令状态队列410。如上所述,当L/S指令接收在L/S预约队列2 404中时,其放置于L/S指令状态队列410中。
在实施方式中,当L/S指令放置于L/S指令状态队列410时,鉴于L/S预约队列2 404中当前等待的所有其他L/S指令状态,选择逻辑406确定指令的初始状态。如上所述,在实施方式中,状态选择逻辑406设置各个L/S指令的初始状态。状态选择逻辑406表示存储指令是否是投机性的。对于投机性的那些存储指令,状态选择逻辑406将它们放入L/S指令状态队列410但将数据准备状态设置为“否”。对于所有其他L/S指令,状态选择逻辑406将数据准备状态设置为“是”。如上所述,状态选择逻辑406也设置初始指令冲突状态。该状态允许状态更新和发布确定逻辑408以基于由先前L/S指令读取或写入的内存确定是否能够发布指令。
在实施方式中,状态更新和发布确定逻辑408确定是否准备发布指令、选择将发布的指令、以及当指令发布时更新L/S指令状态队列410。如上所述,当L/S指令的操作数准备好时,状态更新和发布确定逻辑408分析指令冲突状态和先前L/S指令的发布状态以确定是否准备发布L/S指令。一旦已分析了L/S预约队列2 404中的所有指令,状态更新和发布确定逻辑408选择要发布的指令。其可能倾向于发布旧指令而不是新指令,存储指令而不是加载指令,从内存的特定区域读取或写入特定区域的指令等。
在实施方式中,L/S指令状态队列410维持L/S预约队列2 404中所有L/S指令的状态。在实施方式中,L/S指令状态队列410包括表示是否能够执行指令的数据准备指示符。例如,不能发布投机获取的存储指令。因为它们影响内存,从而不能够轻易地撤回发布存储指令。因此,将这些指令维持在L/S指令状态队列410中直至它们不再是投机性的。在实施方式中,L/S指令状态队列410包括内存指令本身或指向存储器指令的指针。这允许处理器一旦准备好即可发布指令。在实施方式中,L/S指令状态队列410包括维持L/S指令之间的关系的指令冲突状态。在实施方式中,一旦为任何给定指令设置指令冲突状态,可维持该状态直至发布指令。因此,不需要在每次处理器访问内存时重新计算。在实施方式中,L/S指令状态队列410包括发布指令可用的。该指令允许L/S预约队列2 404跟踪可用于每周期发布的指令。因此,一旦处理器访问内存,其可选择一个或多个L/S指令来执行。
状态选择过程
在示例性实施方式中,L/S单元可被配置为确定新L/S指令和所有等待L/S指令之间的关系。
图5中示出的过程描述L/S单元如何将新L/S指令与等待L/S指令进行比较。
在步骤502,L/S单元确定是否将新L/S指令写入到与等待L/S指令相同的块。
如果不,则指令是独立的,如上所述,并且过程移动到步骤504。在步骤504,L/S单元将与新L/S指令和等待L/S指令相关的状态设置为“独立”并继续至步骤520。
如果新L/S指令和等待L/S指令写入相同的块,则过程移动至步骤506。在步骤506,L/S单元确定是否将新L/S指令写入到与等待L/S指令相同的索引。
如果不,则指令互相排斥,如上所述,并且过程移动到步骤508。在步骤508,L/S单元将与新L/S指令和等待L/S指令相关的状态设置为“互相排斥”并继续至步骤520。
如果向相同的索引写入新L/S指令和等待L/S指令,则方法移动至步骤510。在步骤510中,L/S单元确定新L/S指令和等待L/S指令是否是相同类型的操作,即,它们都是加载指令还是它们都是存储指令。
如果这样的话,可合并指令,如上所述,并且过程移动到步骤512。在步骤512,L/S单元将与新L/S指令和等待L/S指令相关的状态设置为“可合并”并继续至步骤520。
如果新L/S指令和等待L/S指令是不同类型的操作,即,一个是加载指令,另一个是存储指令,则方法移动到步骤514。在步骤514中,L/S单元确定新L/S指令和等待L/S指令是否访问至少一个重叠字节,即,两个操作访问内存中相同位的存储。
如果不,则指令互相排斥,如上所述,并且过程移动到步骤518。在步骤516,L/S单元将与新L/S指令和等待L/S指令相关的状态设置为“互相排斥”并继续至步骤520。
如果是这样的话,指令冲突,如上所述,并且方法移动到步骤518。在步骤518,L/S单元将与新L/S指令和等待L/S指令相关的状态设置为“冲突”并继续至步骤520。
在步骤520,选择下一等待L/S指令并且过程可重新开始以确定与新L/S指令和新的重新选择的等待L/S指令相关的状态。
状态更新和发布过程
在示例性实施方式中,L/S单元可被配置为更新等待L/S指令之间的状态关系并识别准备发布的L/S指令。
图6所示的方法描述了L/S单元如何更新状态关系并识别准备发布的指令。
在步骤602,L/S单元识别最旧的非评估L/S指令并开始对其进行评估。
在步骤604,L/S单元确定是否准备发布该指令。如果L/S指令是仍为投机性的存储指令,则不准备发布。如果目前未将与L/S指令相关的任何指令冲突状态设置为“独立的”,则不准备发布L/S指令。否则,准备发布该L/S指令。
如果准备发布L/S指令,则过程移动到步骤606。在步骤606中,识别与该指令有关的所有新指令的状态。如果现在将任何新指令状态设置为“合并”,则该状态暂时设置为“独立的”。这是因为准备发布当前L/S指令并且新L/S指令指示如果发布当前L/S指令其可发布。
在步骤608,当前L/S指令被标记为准备发布。然后该过程继续至步骤612。
如果未准备发布当前L/S指令,则过程移动到步骤610。在步骤610中,识别与该指令有关的所有新指令的状态。如果当前将任何新指令状态设置为“互相排斥”,则暂时将状态设置为“独立的”。这是因为未准备发布当前L/S指令并且新L/S指令表示如果未发布当前L/S指令其可发布。然后该过程继续至步骤612。
在步骤612,如果要评估任何剩余的L/S指令,则过程返回至步骤602以评估剩余的L/S指令。否则,过程继续至步骤614。
在步骤614中,选择准备发布的L/S指令。在实施方式中,基于L/S指令的期限(age)进行选择,例如,先选择旧指令。在实施方式中,基于L/S指令的类型进行选择,例如,与加载指令相比更优选发布存储指令。在实施方式中,可基于处理器的设计选择指令,例如,把加载和存储带宽作为因素。本领域技术人员应理解可使用其他选择方法。
在步骤616中,发布选择的L/S指令。
在步骤618中,将L/S单元中所有指令的指令冲突状态设置回该过程开始之前的状态,并且在步骤620结束该过程。
解读机构
在标量处理器设计中,按顺序获取、解码、执行、和退出每个指令。当退出执行指令的结果,更新将来的指令要使用的寄存器文件。可与解码另一指令、执行另一指令、以及退出另一指令并行地获取指令。处理器的这些部分的每一个可被称作阶段。然后通过用指令完成阶段的最长时间来估计处理器的速度。因此,如果执行阶段是最长的阶段,其花费1秒来完成该阶段,则可通过需要运行其的指令数来估计程序的执行时间,即,如果程序是60指令长,则完成程序的估计时间将会是1分钟。因此,为了提高处理器可运行的速度,这些阶段的一个或多个可分成较小的部分。但该估计可能是错误的,因为某些指令在它们执行之前可能需要等待完成其他指令。因此,在一个阶段中,例如,在执行指令结束时指令的结果可转发至其他步骤。
此外超标量处理器在一个步骤中采用这些概念。而不是仅获取、解码、执行、和退出一个指令,它们执行允许它们同时处理多个指令的多个并行流水线。因此,可将超标量处理器设计成同时获取、解码、执行、和退出2、4、8、或多个指令。但是超标量处理器可实施的管线数处限于处理器的设计需求。例如,将程序内的大部分指令的结果存储在寄存器文件可能仅能够被设计成处理有限数量的写入给定空间和布线局限性。
解读机构提供一种方法来增加并行流水线的数目而不需要同等增加寄存器文件接受新数据的能力。如图1所示,解读机构从所有执行流水线接收结果。解读机构也可向其余机器提供一个或多个结果。从执行流水线接收但未提供至其余机器的结果在稍后时间保持以提供至机器。这提供了很多好处。首先,允许处理器具有比在单个时钟周期可退出的结果数目更多的并行流水线。第二,允许处理器在必须停用之前的较长时段内以全带宽进行因为其不能以创造它们时的速度退出结果。例如,如果解读机构可保持20个额外的结果,则处理器可继续处理程序,其中,某些部分的程序是集中执行的,并减少由于退出拥堵程序停止的时间量。当与能够退出的相比创造了更多的结果时,可将额外的结果存储在解读机构中而不会使机器减速。当与可退出的相比创造较少的结果时,处理器可腾空解读机构而不会使机器减速。这可通过以下示例看出:
要执行的代码:
4个加法指令
4个存储指令
4个加法指令
4个存储指令
Figure BDA0001578504810000331
在以上实例中,在每个周期处理器可获取4个指令并退出2个指令的情况下,具有解读机构的处理器能够更迅速地结束代码段。为简单起见,我们将假定以上所有指令是独立的并不会引起处理器内其他中止。没有解读机构的处理器每次仅可执行2个加法指令因为每个周期其仅可退出2个结果。具有解读机构的处理器每次可执行所有的4个加法指令。其立即退出2个结果,并在执行存储指令时退出两个其余结果。以下是更清晰地示出使用解读机构的实例的较长的实例。即使可获取4个加法指令,因为在任何时钟周期仅可退出2个结果,所以仅可退出2个加法指令。
要执行的代码:
4个加法指令
4个加法指令
4个加法指令
4个加法指令
4个加法指令
4个加法指令
4个存储指令
4个存储指令
4个存储指令
4个存储指令
4个存储指令
4个存储指令
Figure BDA0001578504810000341
Figure BDA0001578504810000351
解读机构结构
图7和图8示出了解读机构的示例性实施方式。
参考图7,解读机构的示例性实施方式可包括判别器(arbiter)702、临时存储器704、解读机构复用器706、以及存储708。
在实施方式中,来自执行单元的结果,例如,图7中的结果1-N被发送至判别器702和临时存储器704两者。
在实施方式中,在接收下一期的新结果时,临时存储器704存储一个周期的处理器的先前结果。临时存储器704的先前结果被提供至解读机构复用器706。
在实施方式中,解读机构复用器706从临时存储器704接收先前结果并将非退出结果发送至存储器708。在判别器确定将退出哪个结果时,如下面讨论的,判别器选择哪个结果应从临时存储器704移动至存储器708。然后判别器可更新解读机构复用器706的选择线以便确保正确结果被发送至存储器708。
在实施方式中,存储器708从解读机构复用器706接收所选择的结果,并向判别器702提供一组结果。存储器708被配置为存储还未被退出的结果。
如上所述,可能需要存储这些结果因为与在给定时间可退出的相比生成更多结果。此外,这些结果可以是投机性的,并不可退出直至处理器已确认假设获取相关指令。例如,当遇到条件分支指令时,处理器可推断采取分支,并且从由分支指令所指的位置获取指令。但处理器不能退出这些指令直至已确定分支是有条件的条件。一旦已经确定这些,可退出沿着投机路径的指令结果。但如果投机是不正确的,则必须清除这些结果而不能退出。
在实施方式中,由判别器702从执行单元、解读机构复用器706、以及存储器708接收结果。判别器702可被配置为选择应当退出哪个结果。例如,判别器可选择在解读机构复用器706的结果之前退出存储器708结果,并且在执行单元的结果之前退出解读机构复用器706的结果。这可能是因为与新结果相比判别器更优选退出旧结果。此外,判别器可基于可用退出资源和结果互动对退出的结果作出决定。例如,解读机构可被配置为每周期退出两个结果。此外,解读机构可被配置为使得这些结果之一可以是大结果(例如,128位)并且一个可以是小结果(例如,64位)。在实施方式中,基于寄存器文件的设计,128位可包括两个连续的寄存器。例如,寄存器文件可被配置为使得寄存器R0和R1(每个是64位)可使用单个大输出写入相同的周期。这对于连续寄存器的所有偶/奇对或许是真的,例如,R0/R1、R2/R3、R4/R5等。因而,判别器可选择将R0和R1结果结合在大输出中,即使R0存储在存储器708中并从执行单元接收R1。
本领域技术人员应理解在不偏离本公开的情况下根据处理器的设计可进行许多其他改变。
参考图8,解读机构的示例性实施方式可包括判别器802、临时存储器804、解读机构复用器806、存储器808、投机性存储器810、以及旧结果判别器812。判别器802、临时存储器804、解读机构复用器806、以及存储器808可与判别器702、临时存储器704、解读机构复用器706、以及存储器708类似地执行,除了以下所示以外。
在实施方式中,解读机构中可包含额外的投机性存储器810。存储器808中的问题之一是存储在存储器808中的所有结果的连接性。存储器808可被配置为使得可将存储结果的任何一种可能的组合提供至判别器802。随着存储在存储器808中的结果数目的增加,选择提供至判别器802的结果的复杂度成指数地增加。
投机性存储器810解决该问题。可两次退出投机结果。首先,用泄露投机的指示退出投机结果。这允许其他投机指令还继续使用这些结果执行。该退出可称为投机退出。最终,如果确认投机指令,则再次退出投机结果,更新依靠该结果的任何补充指示并用现在的非投机结果更新寄存器文件。可与第一退出稍微不同地处理投机结果的第二退出。现在可按它们最初退出的相同的顺序退出这些结果。因此,可使用先入先出(FIFO)队列而不是增加复杂存储器808的尺寸以同样存储已投机退出的投机指令。
在实施方式中,存储器808可被配置为存储还没被退出的所有结果,投机性存储器810可被配置为存储所有投机退出指令,并且判别器802可被配置为从执行单元、解读机构复用器806、存储器808、以及投机性存储器810接收的结果中选择要退出的结果。
在实施方式中,旧结果判别器812可被配置为选择一个或多个结果以从解读机构复用器806和存储器808提供至判别器802。例如,如果判别器802仅可退出2个结果,那么旧结果判别器812可被配置为仅向判别器802提供两个结果。正如以上关于判别器802的讨论,可基于处理器的使用年限或设计选择这些结果。这允许判别器802内简单的逻辑选择要退出的指令。判别器802仅需要在从执行单元接收的结果和从旧判别器812接收的结果之间进行选择。
在实施方式中,旧结果判别器812也可从投机性存储器810接收结果。
在实施方式中,判别器802可被配置为迅速退出某些数据以便减少拥堵。在实施方式中,判别器802可包括简单的数据解读机构。简单的数据解读机构可被配置为从执行单元接收某种类型的数据(例如,预测数据)并且退出从由判别器802退出的其他结果中分离出来的该数据。在实施方式中,由简单的数据解读机构处理的数据可以小,例如,8位宽。使用解读机构的主要输出,例如,上述64位和128位输出,小数据会导致退出带宽使用效率低。虽然这可通过尝试将较小数据与较大的数据结合而缓和,但这需要额外的逻辑。通过将该数据移到简单的数据解读机构,也可通过减少小数据的延迟减少主要输出的拥堵和延迟。
解读机构处理
在示例性实施方式中,解读机构可被配置为确定要退出的结果。
图9中示出的过程描述L/S单元如何将新L/S指令与等待L/S指令进行比较。
分别在旧结果判别器812处接收投机性存储结果902、存储结果904和锁定结果906;并且在判别器802接收未锁定结果。在步骤910,选择旧结果并将其路由到判别器802。在步骤912,判别器802选择要退出的结果。在步骤914,更新临时存储器,并且在916做出关于所选择的结果是否是投机的确定。如果确定是肯定的,则那些结果存储918在投机性存储器810中;并且如果确定是否定的,则退出920那些结果。
分支预测
分支指令被用于选择程序经过哪个路径。分支可用于跳到程序中的不同位置的流程。它们也可以用于允许重复地执行循环体,并且它们可用于只有当满足某些条件时执行代码段。
分支会因两个原因引起处理器的问题。分支可通过程序改变流动,所以下一指令并不总是分支后相继跟随的指令。分支也可以有条件的,所以直至执行分支才知道要取的下一指令是否是下一连续指令或在分支目标地址的指令。
在处理器设计中,获取指令并一次执行一个。等到开始获取新指令时,已知道先前分支的目标地址和条件。处理器始终知道接下来要获取哪个指令。然而,在流水线处理器中,几个指令的执行重叠。在流水线处理器中,需要在执行分支之前获取跟随分支的指令。然而,还不知道要获取的下一指令的地址。该问题可称作分支问题。由于直至执行分支之后才知道分支的目标地址和条件,在执行步骤之前所有的流水线阶段将充满泡沫(bubble,投机)或非操作,直到准备执行分支时。如果指令在流水线的第n阶段执行,每个分支将有(n-1)个泡沫或非操作。每个泡沫或非操作表示失去的执行指令的机会。
在超标量处理器中,由于存在两个或更多个流水线分支问题更严重。对于每个周期能够执行k个指令的超标量处理器,泡沫或非操作的数目是(n-1)×k。每个泡沫仍表示失去的执行指令的机会。在流水线和超标量处理器中由于每个分支失去的循环数目是相同的,但在那个时段超标量处理器可做的更多。例如,考虑4发布超标量(4-issuesuperscalar)(即,k=4)处理器,在该处理器中在第n(n=6)流水线阶段执行分支。如果每五个指令是分支指令,则每执行5个有用的指令将会存在20个泡沫。由于分支问题,仅20%的执行带宽用于执行指令。处理器设计中的趋势朝着更宽的发布和更深的流水线的方向,这进一步加重了分支问题。
分支预测是处理分支问题的一种方式。分支预测器预测是否采用分支。预测器使用预测决定要从下一周期中从什么地址获取下一指令。如果采用预测的分支,则将在分支目标地址获取指令。如果未采用预测分支,则将在分支指令之后获取下一个连续指令。当使用分支预测器时,如果分支预测错误则仅看出分支损失。因此,高准确度的分支预测器是减少处理器中分支损失的重要机制。
图10示出了根据本公开的实施方式的实例分支预测单元104。图10示出耦接至分支预测单元的程序计数寄存器1002。程序计数寄存器1002提供当前程序计数(PC)值。当前PC是指当前在给定阶段中的指令的程序计数器(PC)的值。流水线的每个阶段会具有其自身版本的当前PC。接下来,PC是指要从Icache102中获取的下一指令的地址。对于直线式代码,下一PC将是当前PC+现行指令宽度,对于重定向代码,将是新目标PC。应理解除了程序计数寄存器1002以外的另一源可用来提供要获取的下一指令的地址。分支预测单元104基于下一PC生成分支方向信号1004。分支方向信号1004表示是否将采用分支。
图11更详细地示出根据本公开实施方式的分支预测单元104。分支预测单元104包括预设模块1102、散列模块1104、全局分支历史记录寄存器1106、大分支历史记录表1108、小分支历史记录表1110、混合选择器表1112、更新计数器表1114、以及复用器(mux)1116。预设模块1102和散列模块1104耦接至全局分支历史记录寄存器1106。散列模块1104也耦接至大分支历史记录表1108、小分支历史记录表1110、混合选择器表1112、以及更新计数器表1114。大分支历史记录表1108、小分支表1110、以及混合选择器1112耦接至复用器1116。
全局分支历史记录寄存器1106存储表示在执行程序中的指令过程中是否采用分支的位。散列模块1104生成用于访问大分支历史记录表1108、小分支历史记录表1110、混合选择器表1112、以及更新计数器表1114中的条目的地址。如下进一步参考图11描述使用散列模块1104生成用于访问大分支历史记录表1108中的条目的地址。如下进一步参考图15描述使用散列模块1104生成用于访问小分支历史记录表1110、混合选择器表1112、以及更新计数器表1114中的条目的地址。
传统的分支预测器可仅使用一个分支历史记录表。在本文中呈现的实施方式使用两个分支历史记录表:大分支历史记录表1108和小分支历史记录表1110。小分支历史记录表1110和大分支历史记录表1108存储预测执行的程序代码中分支的分支方向的值。小分支历史记录表1110的条目比大分支历史记录表1108的条目少,因此,历史记录较短,即,更擅长捕捉仅需要最近的分支成果的分支之间的相互关系。大分支历史记录表1108的条目比小分支历史记录表的条目多,并且较长的历史记录获取分支之间更复杂的相互关系。如下参考图16描述用于更新大分支历史记录表1108和小分支历史记录表1110中的值的状态机。
复用器1116基于从混合选择表1112中的条目中读取的选择值在从大分支历史记录表1108和小转移历史记录表1110中读取出的分支方向之间进行选择。将每个获取的分支映射至大分支历史记录表1108、小分支历史记录表1110中的条目以及使用散列模块1104的混合选择表1112中的选择条目。如果混合选择器表1112中的选择条目的值大于或等于2,则来自大分支历史记录表1108的预测被用于预测分支的方向,否则,使用小分支历史记录表的预测。只要在预测该分支时大分支历史记录表1108是正确的,与分支对应的混合选择表1112中的选择条目的值增加。只要在预测该分支时小分支历史记录表1110是正确的,则递减对应该分支的混合选择器表1114中的选择条目的值。如果大分支历史记录表1108和小分支历史记录表1110为分支做出相同的预测,则选择条目中的值不会改变。
更新计数器表1114被用于确定是否抑制大分支历史记录表1108中的条目的更新。更新计数器表1114存储每个条目中的更新值。更新值表示在特定分支的预测中大分支历史记录表1108或小分支历史记录表1110是否更准确。根据本公开的实施方式,如果在分支的分支方向的预测上更新计数器表1114中的相应更新值表示小分支历史记录表1110比大分支历史记录表1108更准确则不更新对应分支指令的大分支历史记录表1108中的值。如果对应于更新计数器表1114中的特定分支的更新值是零,则不管大分支历史记录表1108还是小分支历史记录表1110是否正确预测特定分支都会抑制更新大分支历史记录表1108,否则允许更新。当小分支历史记录表1110错误预测特定分支时,将对应更新计数器表1114中的特定分支的更新值设置为11。此后每次,如果大分支历史记录表1108错误预测特定分支,则递减对应于特定分支的更新值。以这种方式,当小分支历史记录表1108最近错误预测特定分支时,仅用特定分支的正确预测更新大分支历史记录表1108。这防止过度更新大分支历史记录表1108,从而导致相对于特定分支的大分支历史记录表1108的更好训练。
图12示出了根据本公开实施方式的更新全局分支历史记录寄存器1106的实例。图12示出了不同的指令以及当获取指令时全局分支历史记录寄存器1106产生的更新。在实施例中,可以初始化全局分支历史记录寄存器1106以在启动时存储所有的零。在另一实例中,全局分支历史记录寄存器可在启动时存储随机值。仅为条件分支指令更新全局分支历史记录寄存器1106。例如,条件分支指令是基于条件为真还是假跳到地址的分支指令。如果等于零的分支(BREQZ)指令、如果不等于零的分支(BRNEZ)指令、如果小于或等于零指令的分支(BRLEZ)、以及如果大于零的分支(BRGTZ)指令是条件分支指令的实例。非条件分支指令是始终将程序执行转换为在分支指令中说明的指令的地址的分支指令。例如,BR X是将程序执行转换至存储在地址X的指令的非条件分支指令。而且不为不是条件分支的指令(诸如,加法(ADD)指令、减法(SUB)指令、乘法(MUL)指令、除法(DIV)指令、加载(LD)、或存储(ST)指令)更新全局分支历史记录寄存器1106,。当获取指令时,例如,获取加法指令402,将不会对全局分支历史记录寄存器1106进行改变因为其不是条件分支指令。因此,任何运算、加载、存储、或非条件分支指令都不会更新全局分支历史记录寄存器1106。
再参考图12,当接收BR指令1204时,未更新全局分支历史记录寄存器1106因为BR指令1204不是条件分支指令。当获取SUB指令1206和MUL指令1208时,不更新全局分支历史记录寄存器1106。当接收条件分支指令BREQZ 1210时,将更新全局分支历史记录寄存器1106。在这个实例中,假定预测BREQZ指令1210作为被采用的,则通过将位“1”移动至全局分支历史记录寄存器1106的最低有效位位置以表示其被采用来更新全局分支历史记录寄存器1106。在实施方式中,如果当通过随后在分支单元118中执行来解析BREQZ指令1210时确定预测是不正确的,则利用BREQZ指令1210的正确预测来更新全局分支历史记录寄存器1106。
在获取DIV指令1212时,未更新全局分支历史记录寄存器1106,因为DIV 1212指令不是条件分支指令。当接收到BRNEZ指令1214时,将更新全局分支历史记录寄存器1106,因为BRNEZ指令1214是条件分支指令。假定预测BRNEZ指令1214为所采用的,则通过将位“1”移动至如图12所示的全局分支历史记录寄存器1106的最低有效位位置来更新全局分支历史记录寄存器1106。BRLEZ指令1216引起全局分支历史记录寄存器1106的更新,因为其是条件分支指令。假如不采用BRLEZ指令1216,则将位“0”移动至全局分支历史记录寄存器1106的最低有效位位置。对于下一指令,分支大于零(BRGTZ)1218,将再次更新全局分支历史记录寄存器1106。假如采用分支大于零1218,则将1移动至全局分支历史记录寄存器1106的最低有效位位置。
程序可以包括多个进程。进程是在执行“调用”指令时访问的程序内的代码部分。调用指令可包括在调用指令之后将程序执行返回至下一指令的指令。调用令的实例是参考以下提供的示例性程序代码所进一步描述的“带链接的分支”指令:
程序代码:
Figure BDA0001578504810000421
Figure BDA0001578504810000431
在以上的示例性程序代码中,0xXXX表示指令存储在指令高速缓存102中的地址。具有链接指令的分支(A branch with link instruction)是将程序执行转移至程序代码中的特定进程的指令。本文中,执行具有链接指令的分支被称作“调用进程”,具有链接指令的分支将程序执行转移至进程。具有链接指令的分支包括在具有链接指令的分支之后将程序执行返回至下一指令的指令(未示出)。
诸如存储在全局分支历史记录寄存器1106中的全局分支历史记录用作访问大分支历史记录表1108和小分支历史记录表1110中的预测条目的索引,因为分支常与之前执行的分支有关。较长的分支历史记录使预测器能够浏览之前执行的分支的更大窗口并基于与那些分支的相互关系了解。对于与最近分支历史记录高度相关的分支,全局历史记录可提供关键的预测信息。传统分支预测器可仅依赖全局分支历史记录来产生分支预测。然而,并非程序中所有的分支都与最近执行的分支相关。对于与最近执行的分支不相关的那些分支,在全局经历中编码的额外信息在预测分支时带来的伤害确实大于好处。训练分支预测器的时间也增加了并且明显扩大了混淆分支预测表的级别,从而降低了当前分支和其他分支的预测的准确度。较长的全局分支历史记录寄存器1106实现更远的分支之间的相关,而且也增大分支历史记录中包括的不相关分支的数目。当预测分支时那些不相关的分支可产生明显的噪声。考虑15位的全局分支历史记录寄存器1106。与3个先前的分支高度相关的分支将会充分利用相关预测器,即使在这种情形中,历史记录包含12位的无用噪声。这意味着在最坏的情况下,可能需要212倍以上的条目来预测分支,从而大大增大了分支预测器的训练周期,也增大了与其他分支的混淆。对于与先前的分支不相关的分支,整个15位是噪声。进程调用通常表示程序流的中断。在进程调用之前的分支趋向于与进程调用内的分支相关性较小。因此,提供了允许一些分支受益于大历史记录但消除或减少噪声无用的那些区域中的历史记录噪声的架构。
为了提供使用全局分支历史记录寄存器1106的分支的更好的预测,在做出对进程的分支时,用第一指令的起始地址重写全局分支历史记录寄存器1106中的值。在本文中,用被调用的进程的起始地址的地址重写全局分支历史记录寄存器1106的值被称作“预设置”。如果进程的分支是投机性的并是错误预测的,则重写的全局分支历史记录寄存器1106中的值被恢复至全局分支历史记录寄存器1106。使用进程中第一指令的起始地址为预设全局分支历史记录寄存器1106的每个点提供唯一的历史记录,从而消除程序代码中不同的预先设定点之间的混淆并确保当程序执行再次调用过程时,将全局分支历史记录寄存器1106预置到相同的值。因为全局分支历史记录寄存器1106被用作大分支历史记录表1108和小分支历史记录表1106的索引以确定分支的方向,将全局分支历史记录寄存器1106预设为相同的值(即,进程中第一指令的起始地址)确保从大分支历史记录表1108和小分支历史记录表1106检索的分支预测对于被调用并会更准确的进程来说是本地的。
图13示出了根据本公开实施方式的全局分支历史记录寄存器1106的预设置。预设置模块1102耦接至程序计数器1002和全局分支历史记录寄存器1106。当具有链接指令的分支,诸如,具有到进程1的链接的分支,使程序执行跳转到进程1时,预设置模块1102将全局分支历史记录寄存器1106中的值重写为进程1的起始地址。进程1的起始地址是进程中第一指令的地址,例如,以上程序代码中的0x014。可从例如程序计数器1002获取进程1中的第一指令的起始地址。应理解可从处理程序计数器1002以外的源接收进程开始的地址。不管随后是否跳转到进程1,都将全局分支历史记录寄存器1106中的值预置为0x014。这不仅提供进程1内的分支的更好的相互关系,其也将加速大分支历史记录表1108和小分支历史记录表1110的训练。类似地,无论何时调用进程2,都将全局分支历史记录寄存器1106预置为进程2中第一指令的地址,即,0x024。在进程调用时预置全局分支历史记录寄存器1106的另一好处是其允许疏散的大分支历史记录表1108和小分支历史记录表1110。这取得存储器节省的结果。此外,当与传统系统相比时需要全局分支历史记录寄存器1106中小散列的值以如下参考图14所述的访问大分支历史记录表1108中的条目。
图14示出了根据本公开实施方式的提供索引以访问大分支历史记录表1108的条目的示例性系统。在图14的实例中,程序计数器1002和全局分支历史记录寄存器1106耦接至散列模块1104。将散列模块1104耦接至大分支历史记录表1108并提供读取或写入在大分支历史记录表1108中的条目的索引。散列模块1104包括异或门1400和散列函数1402、1404和1406。全局分支历史记录寄存器中的值是15位宽并使用散列模块1104下散列至12位。例如,散列函数1402、1404、和1406将全局分支历史记录寄存器中的值从15位下散列至12位。程序计数器1002的12最低有效位使用异或门1400与全局分支历史记录寄存器1106的12位散列值异或以产生用于访问大分支历史记录表1108中的条目的12位索引。
图15示出了根据本公开实施方式提供索引以访问小分支历史记录表1110中、混合选择器1112,以及更新计数器1114的每个中的条目的系统。全局分支历史记录寄存器1106和程序计数器1002耦接至散列模块1104。散列模块1104耦接至小分支历史记录表1110、混合选择表1112和更新计数器表1114。根据本公开的实施方式,散列模块1104包括异或函数1400。异或函数1400将程序计数器1002中的32位程序计数值散列到10位值。由散列函数1400生成的10位与全局分支历史记录寄存器1106的最低有效位结合以形成11位索引。该11位索引用于访问小分支历史记录表1110、混合选择器1112、以及更新计数器表1114中的条目。
图16示出了根据本公开实施方式的示例性状态机,其用于更新存储于大分支历史记录表1108和小分支历史记录表1110中的分支预测条目。在初始化过程中,随机值可存储于大分支历史记录表1108和小分支历史记录表310中的条目。如果第一次执行时采取分支,则对应分支的条目与“弱采用(weakly taken)”状态1602相关并用位00更新。如果目前分支的条目处于弱采用状态1602,并且如果下次执行分支再次采用,则条目与“强采用”状态1604相关并用位01更新。如果分支的当前状态是弱采用状态1602,则如果下次执行时未采用分支,其转换到“弱不采用状态”1606并且用10更新条目。如果目前分支与弱不采用状态1606相关并在下一次执行时采用,则该分支的状态转换到弱采用状态1602并且用00更新其相应的条目。如果分支处于弱不采用状态1606,在下次执行时又没采用,则状态转换到“强不采用”状态1608并且用11更新条目。如果分支处于强不采用状态1608,并且随后被采用,则其转换到弱不采用状态1606并且用10更新条目。如果分支处于强采用状态1604并且然后下一次执行时再次采用,则其将停留在强采用状态1604。如果分支处于强采用状态1604,随后在下次执行时未被采用,则其转换到弱采用状态1602并且用00更新条目。如果分支处于弱不采用状态10,随后下次执行时被采用,则其转换到弱采用状态00。
零开销循环
“循环”通常是响应于“循环指令”或“循环操作”重复特定次数的一个或多个指令的序列。重复的指令序列通常称作“循环体”。循环起始地址是指循环体中第一指令的地址,即,开始新循环迭代的分支的地址。循环结束地址是指在循环体后第一指令的地址,即,用于自然退出循环的分支的地址。循环体也可被称为始于循环起始地址并终于循环匹配地址的指令。如下示出循环的示例性伪代码:
Figure BDA0001578504810000471
在以上的实例中,“For(i>0;i<n,i++)”可称为循环指令。循环体包括指令INST 1、INST 2以及INST 3。应当理解即使在以上实例中仅示出三个指令,循环体中指令的数目是任意的。在以上实例中,“n”是“循环计数”,其指示在循环体中执行的指令次数。在实例中,n可以是立即值,例如,n=5,在循环指令本身中编码并表示必须执行循环体5次。在另一实例中,从处理器的通用寄存器文件或指令流水线中的另一地方获得n的值。如果在不知道“n”的值的情况下获取、解码、并执行循环指令和循环体,则循环计数n已知为“投机计数”。当通过从通用寄存器文件或处理器中另一位置访问确定其值时可被称为解析循环计数“n”。可投机地执行循环指令。当确定假设执行或未执行循环指令时,则循环指令被称为“解析”循环指令。
在传统架构中,编译器可合成并执行等同于以上示出的循环示例的以下汇编语言:
Figure BDA0001578504810000472
Figure BDA0001578504810000481
在以上的实例中,为了执行循环,编译器首先生成移动(MOV)指令,该指令将循环计数n(如果可获得)移动到寄存器中,例如,寄存器R0。编译器还生成其他指令,诸如,等于零的分支(BREQZ)、减法(SUB)、以及分支(BR)指令。BREQZ、SUB、以及BR指令通过三个指令增大原始循环体的大小。
编译器在循环起始地址插入BREQZ R0、Loop end。在以上实例中,“Loop start”是“标记”。标记是分配到代码内的固定位置的名称或数值,并且可通过在代码中其它地方出现的其他指令引用。标记只是标记指令在代码内的位置而没有其他作用。如在本文中使用的“Loop start”或“loop start address地址”是指循环体中第一指令的地址。在该实例中,循环起始地址参考由编译器生成的BREQZ指令。如在本文中使用的“Loop end”或“Loopend地址”是指循环体之后第一指令的地址。在以上的实例中,循环结束是指循环体之后的第一指令INST4。当R0中的值不等于0时,BREQZ指令将退出循环并在循环结束地址将程序执行转移至INST4。可替换地,如果投机地执行循环并随后确定流水线中不应当执行,则将程序执行再次转移至INST4。在另一实例中,如果R0中的初始值是0(即,是空循环),则程序执行再次转移至INST4。
除了MOV和BREQZ指令以外,编译器生成减法(SUB)指令:sub R0,R0,#1,每次执行循环体时将R0中的值递减立即值“1”。此外,在INST3之后,编译器还生成分支指令BR Loopstart。BR Loop start将程序执行转移到循环起始地址。在传统汇编语言代码的该实例中,BREQZ指令、SUB指令、以及BR指令用于执行循环所需的额外指令或“开销”。这些开销指令用于保持执行循环、转移到循环开始、以及当循环退出时的次数。
BREQZ、SUB、以及BR指令是每次执行循环体时需要执行的开销指令。在传统处理器中,每次执行循环体时这些开销指令额外增加三次循环。对于短循环,诸如,以上示出的仅具有三个指令INST1、INST2、以及INST3的一个短循环,这种开销指令几乎使执行循环体所需的循环数目加倍。因此,在本文中呈现的实施方式提供明显减少执行循环所需的开销的称作“ZLOOP”的零开销循环指令。根据本公开的实施方式,如下示出了使用ZLOOP指令的可由编程器写入的示例性高级程序代码:
Figure BDA0001578504810000491
根据本公开的实施方式,将由在以下汇编语言等同物中示出的由处理器合成并执行的以上高级程序代码:
Figure BDA0001578504810000492
示例性合成代码中的“:”是指将在相同的循环中获取由“:”分开的指令。当与以上传统汇编语言相比时,以上的代码仅具有循环开始地址之前的MOV和BREQZ指令的一次性执行开销。BREQZ指令检查循环是否是空的,即,R0等于0,并不应当执行。以上指令中的“loopcount”是指如下进一步描述的图17中的循环计数寄存器1700,其存储循环计数值(在具有循环计数的立即值或解析值的循环指令的情况下)或投机循环计数值(在未解析循环计数的情况下)。
在示例性实施方式中,由编译器生成指示循环中的最后一个指令“loop match”标记或循环匹配地址。循环匹配地址是指循环体中的最后一个指令(即,INST3)的地址。在流水线的DE1阶段中,与程序编译器相比,指令解码器106在检测到表示最后一个指令在循环体中的循环匹配地址时生成并排队分支预约队列112中BRNEZ循环计数、循环开始指令同时将INST3和SUB R0,R0,#1排列到一个或多个预约队列114A-D。可替换地,INST3可排在加载/存储预约队列116中。由于与编译器或编程相比,由指令解码器106生成该分支指令,在本文中相当于“合成”分支。因为合成的BRNEZ指令连同SUB指令一起与INST3同时排队,不需要额外时钟周期来对生成BRNEZ指令和SUB指令进行排队,从而取得循环指令的零开销处理的效果。在实例中,循环体中的最后一个指令,即,以上实例中的INST3不能是另一分支指令。虽然在上文提供的实例中的DE1阶段中生成合成分支指令,应当理解可在流水线的其他阶段发生并通过除了指令解码器以外的其他单元生成合成分支指令。
根据本公开另一实施方式,如果循环计数未被解析,则将继续获取循环体并投机地执行直至解析为止。如果要执行的循环体(即,循环计数)的次数小于循环体的获取迭代的数目,则取消与循环体的过度获取迭代相关的指令。取消指令必然从流水线对它们进行刷新(flush),并且不会把它们产生的任何结果提交至处理器的结构状态。基本上,取消指令意味着从流水线移除就好像从没获取或执行一样。如果指令中的循环计数被编码为立即值,则循环计数是已知的并不需要解析。在该实例中,将不会存在循环体的过度获取迭代。在本文中,这种包括立即循环计数值的循环指令称作“LOOP”指令。如果循环计数是非立即的有符号的值,则指令称作“ZLOOPS”指令。以下参考图17和图18中的实例提供实施在本文中呈现的实施方式的更多细节。
图17示出了根据本公开的实施方式的实施零开销循环的架构的一部分。图17示出指令获取单元1701、指令解码器106、SIN分配器107、程序计数寄存器1703、分支预约队列112、以及分支单元118。指令获取单元1701耦接至指令解码器106、SIN分配器107、程序计数寄存器1703、以及分支单元118。在实例中,程序计数寄存器1703存储可替换地称作“程序计数器值”的“程序计数器”。在可替换实施方式中,可从除了程序计数寄存器1703以外的流水线中的其他位置接收程序计数器值。分支单元118耦接至指令解码器106。
指令获取单元1701包括指令高速缓存(Icache)102、循环计数寄存器1700、循环开始寄存器1702、以及循环匹配寄存器1704。循环计数寄存器1700存储循环计数值(在具有立即值或循环计数的解析值的循环指令的情况下)或投机循环计数值(在未解析循环计数时的情况下)。当解析循环计数时用循环计数替换投机循环计数值(例如,当在EX1阶段中在分支单元118中执行分支时)。循环启动寄存器1702存储循环起始地址并且循环匹配寄存器1704存储循环匹配地址。
现将结合图18描述图17。图18中的列是流水线阶段(pipeline stage)。IC1是指令获取阶段。DE1和DE2是解码阶段。RS1和RS2是预约队列阶段。EX1是执行阶段。应理解可能存在一个以上的IC、DE、RS、以及EX阶段。图18中的行表示时钟周期。术语X:Y代表流水线阶段:时钟周期。
在IC1:0中,例如,通过指令获取单元1701从Icache102获取ZLOOP指令。在DE1:1中,由指令解码器106接收ZLOOP指令。在收到ZLOOP指令时,指令解码器106将循环开始地址存储在循环开始寄存器1702中的,将循环匹配地址存储在循环匹配寄存器1704中,并将循环计数寄存器1700中的值设置为-1。计数目前是负的以指示在未知实际循环计数时投机地执行循环体。这是因为循环计数可存储在寄存器R0中或处理器中的另一地方并还不能用或不可访问。可能不会解析循环计数直至在分支单元118中解析循环。在实例中,指令解码器106使用图17中的Zloop_detect信号1706设置循环计数寄存器1700、循环开始寄存器1702和循环匹配寄存器1704中的值。在DE1:1中,指令解码器106还向SIN分配器107发送SIN_generate信号1712以为ZLOOP指令和循环体中的指令生成SIN号。虽然循环计数是投机性的,指令获取单元1701还断定(assert)指示SIN分配器107在循环计数是投机性时应当持续生成SIN号的loop_count_speculative信号1714。
在DE2:2中,由于由指令获取单元1701投机地获取ZLOOP指令本身,所以ZLOOP指令被分配SIN#0。针对第一迭代的循环体,通过SIN分配器107生成的SIN#1分配给循环体(即,INST 1、INST 2、以及INST3)中的指令。例如,当INST1到达DE2:3时,SIN#1被分配至INST1,当INST2到达DE2:4时,SIN#1被分配给INST2,并且当INST到达DE2:4时,SIN#1被分配给INST3。
当循环匹配标记和INST3到达DE1:4时,指令获取单元1701通过将其与存储在循环匹配寄存器1704中的值进行比较并将循环匹配信号1710发送至指令解码器106以生成合成BRNEZ来检测循环匹配标记。如上所述,循环匹配标记是指循环体中的最后一个指令(即,INST 3)。响应于接收到循环匹配信号1710,在将INST 3排到预约队列114A-D之一的相同周期中,指令解码器106生成排到分支预约队列112的合成分支指令BRNEZ。可替换地,INST可排在加载/存储预约队列116中。在实例中,指令解码器106使用信号1720将合成分支指令排到分支预约队列112中。例如,如果INST 3是运算指令,其将被排到预约队列114A-D之一,如果其是加载/存储指令,其将被排到加载/存储预约队列116之一,而合成BRNEZ指令将同时排到分支预约队列112中。应当理解虽然在本文中呈现的实例中,合成分支BRNEZ是不等于零的分支,在其他实例中,可产生等于零的分支(BREQZ)、小于零的分支(BRLEZ)、或大于零的分支(BRGTZ)指令。
在DE1:4中,在检测到指代循环体中的最后一个指令(即,在该实例中的INST 3)的循环匹配标记时,指令解码器106再次设置Zloop检测信号1706以将循环计数寄存器1700中的值设置为-2以指示发生循环体的第二投机获取和执行。
当响应于循环匹配标记,INST 3与循环匹配标记一起到达DE2:5时,指令解码器106再次将SIN_generate信号1712发送至SIN分配器107以生成要分配给循环体的第二投机执行的指令的SIN#2。
当ZLOOP指令到达EX1:5时,由分支单元118执行并解析循环。如果循环是空的,即,确定实际循环计数(用R0的实际值表示)为0,则退出循环并且通过分支单元118使用重定向信号1717将程序计数器的方向改为通过循环结束标记表示的指令,即,INST 4,并取消从循环体的所有投机获取的指令。如果循环不是空的,即,R0大于0,则经由loop_count_actual信号1715将R0的值发送至指令获取单元1701,其中,该值被加到存储于循环计数寄存器1700中的值以确定循环计数。在该实例中,R0是10,其被加到-2并且所得的值是循环计数8。这表示已经执行两次循环并且仍要执行循环体的8次以上的迭代。
一旦通过确定EX1:5中R0的值已解析计数,则使loopmatch_speculative信号1714无效(de-asserted)。响应于被无效的loopmatch_speculative信号1714,SIN分配器107停止分配另外的SIN号。因此,在该实例中,仅产生两个SIN号。如果循环计数(由R0表示的)是指示空循环的0,则与投机获取的具有SIN号#0的ZLOOP指令一起取消具有SIN号#1和#2的所有指令。如果在另一实例中,确定R0为1,则循环的第一投机迭代是有效的并且具有SIN#2的循环的第二迭代是无效的并从流水线刷新。
在EX1:5中,INST 3与BRNEZ循环计数一起,在分支单元118中执行循环开始指令以确定是否应执行分支。例如,如果由R0指示的循环计数是0或小于0或者如果ZLOOP本身是错误投机地执行的,则分支单元118可发送重定向信号1717以将程序计数寄存器1703重定向到由循环结束地址指示的指令(即,INST 4)并取消与SIN#1和#2相关的所有指令以及与SIN#0相关的ZLOOP指令。如果确定要执行分支并且由R0表示的循环计数不是0,则相应SIN号被“发放(release)”。如本文中提到的发放SIN号意味着将执行具有发方的SIN号的循环体中的指令并且不会从流水线中刷新它们的值。在该实例中,如果R0是2或大于2,则将发放SIN#1和#2两者。如果R0是1,则将发放SIN#1并且SIN#2将无效从而刷新与SIN#2相关的指令。
总结
应当理解,具体实施方式部分而非摘要部分旨在用于解释权利要求。本公开的摘要可阐述一个或多个而不是所有的示例性实施方式,并且因此并不旨在以任何方式限制所附权利要求的范围。
对相关领域的技术人员将显而易见的是,在不偏离本公开的精神和范围的情况下,可对形式和细节上做出各种改变。

Claims (11)

1.一种用于分支预测的方法,包括:
执行程序,所述程序包括进程;
在分支历史记录寄存器中设置位以指示在执行所述程序中的进程期间是否采用了一分支;
调用所述程序中的所述进程;
响应于调用所述进程,将所述分支历史记录寄存器中的内容重写为所述进程的开始地址。
2.根据权利要求1所述的方法,进一步包括:
基于所述分支历史记录寄存器和程序计数器寄存器中的内容访问第一分支历史记录表。
3.根据权利要求2所述的方法,其中,访问所述第一分支历史记录表包括:
基于所述分支历史记录寄存器和所述程序计数器寄存器中的内容产生索引以访问所述第一分支历史记录表中的条目,其中所述条目指示对是否将采用当前分支的预测。
4.根据权利要求2所述的方法,其进一步包括:
基于所述分支历史记录寄存器和所述程序计数器寄存器中的内容存取第二分支历史记录表,其中所述第一分支历史记录表具有比所述第二分支历史记录表多的条目。
5.根据权利要求4所述的方法,其中存取所述第二分支历史记录表进一步包括:
基于所述分支历史记录寄存器和所述程序计数器寄存器中的内容产生索引以访问所述第二分支历史记录表中的条目,其中所述条目包括指示了是否将采用当前分支的预测值。
6.根据权利要求5所述的方法,其进一步包括:
使用所述索引以存取更新计数器表中的更新条目,所述更新计数器表存储了指示所述第一分支历史记录表和所述第二分支历史记录表哪一者在预测是否应采用分支上更准确的更新值;以及
如果所述更新值指示所述第二分支历史记录表比所述第一分支历史记录表在预测是否应采用所述分支上更准确,则抑制在所述第一分支历史记录表中更新对应于所述分支的预测值。
7.一种用于分支预测的装置,包括:
指令高速缓存;
分支预测单元,耦接至所述指令高速缓存并被配置为向所述指令高速缓存提供投机性地址,所述分支预测单元包括:
分支历史记录寄存器,其经配置以存储位,所述位指示在程序的进程执行期间是否采用了一分支;以及
预设模块,其经配置以将所述分支历史记录寄存器中的内容重写为所述进程的开始地址。
8.根据权利要求7所述的装置,其中所述分支预测单元包括:
第一分支历史记录表;以及
第二分支历史记录表,
其中所述第一分支历史记录表和所述第二分支历史记录表存储分支方向的值,且所述第一分支历史记录表具有比所述第二分支历史记录表多的条目。
9.根据权利要求8所述的装置,其中,所述分支预测单元还包括更新计数器表,所述更新计数器表存储了指示所述第一分支历史记录表和所述第二分支历史记录表哪一者在预测是否应采用分支上更准确的更新值。
10.根据权利要求9所述的装置,如果所述更新值指示所述第二分支历史记录表比所述第一分支历史记录表在预测是否应采用所述分支上更准确,则抑制在所述第一分支历史记录表中更新对应于所述分支的预测值。
11.一种用于执行根据权利要求1所述的方法的处理器。
CN201810144683.6A 2014-04-25 2015-04-24 利用生成重命名的计算机信息处理器 Active CN108196884B (zh)

Applications Claiming Priority (5)

Application Number Priority Date Filing Date Title
US201461984711P 2014-04-25 2014-04-25
US61/984,711 2014-04-25
US14/530,038 US10209992B2 (en) 2014-04-25 2014-10-31 System and method for branch prediction using two branch history tables and presetting a global branch history register
US14/530,038 2014-10-31
CN201510203229.XA CN105045562A (zh) 2014-04-25 2015-04-24 利用生成重命名的计算机信息处理器

Related Parent Applications (1)

Application Number Title Priority Date Filing Date
CN201510203229.XA Division CN105045562A (zh) 2014-04-25 2015-04-24 利用生成重命名的计算机信息处理器

Publications (2)

Publication Number Publication Date
CN108196884A CN108196884A (zh) 2018-06-22
CN108196884B true CN108196884B (zh) 2022-05-31

Family

ID=53039259

Family Applications (2)

Application Number Title Priority Date Filing Date
CN201510203229.XA Pending CN105045562A (zh) 2014-04-25 2015-04-24 利用生成重命名的计算机信息处理器
CN201810144683.6A Active CN108196884B (zh) 2014-04-25 2015-04-24 利用生成重命名的计算机信息处理器

Family Applications Before (1)

Application Number Title Priority Date Filing Date
CN201510203229.XA Pending CN105045562A (zh) 2014-04-25 2015-04-24 利用生成重命名的计算机信息处理器

Country Status (4)

Country Link
US (1) US10209992B2 (zh)
EP (1) EP2937777A3 (zh)
CN (2) CN105045562A (zh)
HK (1) HK1215610A1 (zh)

Families Citing this family (13)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
GB2528676B (en) * 2014-07-25 2016-10-26 Imagination Tech Ltd Conditional Branch Prediction Using A Long History
US9639370B1 (en) * 2015-12-15 2017-05-02 International Business Machines Corporation Software instructed dynamic branch history pattern adjustment
EP3291082B1 (en) * 2016-08-30 2019-10-09 Advanced Micro Devices, Inc. Method and device for determining branch history for branch prediction
US10698691B2 (en) * 2016-08-30 2020-06-30 Advanced Micro Devices, Inc. Method and device for determining branch prediction history for branch prediction by partially combining shifted branch prediction history with branch signature
CN106528049B (zh) * 2016-11-17 2019-06-11 上海兆芯集成电路有限公司 在多存储体条件分支预测器中用于更新事件的随机数产生
US10437592B2 (en) * 2017-08-24 2019-10-08 Qualcomm Incorporated Reduced logic level operation folding of context history in a history register in a prediction system for a processor-based system
US11269642B2 (en) 2019-09-20 2022-03-08 Microsoft Technology Licensing, Llc Dynamic hammock branch training for branch hammock detection in an instruction stream executing in a processor
CN111506347B (zh) * 2020-03-27 2023-05-26 上海赛昉科技有限公司 一种基于指令写后读相关假设的重命名的方法
CN111782273B (zh) * 2020-07-16 2022-07-26 中国人民解放军国防科技大学 一种提高重复程序执行性能的软硬件协同缓存装置
CN112433765B (zh) * 2020-11-26 2023-09-08 海光信息技术股份有限公司 一种数据存储方法、装置、处理器及电子设备
US11630670B2 (en) 2021-07-21 2023-04-18 Apple Inc. Multi-table signature prefetch
CN113626084B (zh) * 2021-09-03 2023-05-19 苏州睿芯集成电路科技有限公司 一种tage分支预测算法针对超大循环次数指令流优化的方法
US11928474B2 (en) 2022-06-03 2024-03-12 Microsoft Technology Licensing, Llc Selectively updating branch predictors for loops executed from loop buffers in a processor

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101819522A (zh) * 2009-03-04 2010-09-01 威盛电子股份有限公司 微处理器以及相关指令解析的方法
CN102754069A (zh) * 2010-02-18 2012-10-24 国际商业机器公司 加载/存储分离设施及其指令

Family Cites Families (30)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5724536A (en) 1994-01-04 1998-03-03 Intel Corporation Method and apparatus for blocking execution of and storing load operations during their execution
TW260765B (zh) 1994-03-31 1995-10-21 Ibm
US5634026A (en) 1995-05-12 1997-05-27 International Business Machines Corporation Source identifier for result forwarding
US5996063A (en) 1997-03-03 1999-11-30 International Business Machines Corporation Management of both renamed and architected registers in a superscalar computer system
EP0863460B1 (en) 1997-03-03 2005-08-24 International Business Machines Corporation Management of renamed registers in a superscalar computer system
US6240509B1 (en) 1997-12-16 2001-05-29 Intel Corporation Out-of-pipeline trace buffer for holding instructions that may be re-executed following misspeculation
US6370637B1 (en) 1999-08-05 2002-04-09 Advanced Micro Devices, Inc. Optimized allocation of multi-pipeline executable and specific pipeline executable instructions to execution pipelines based on criteria
KR100317240B1 (ko) * 1999-10-21 2001-12-22 윤종용 분기 예측 정확도 히스토리를 이용한 분기 예측기
US7441110B1 (en) * 1999-12-10 2008-10-21 International Business Machines Corporation Prefetching using future branch path information derived from branch prediction
US6658621B1 (en) * 2000-06-30 2003-12-02 Intel Corporation System and method for silent data corruption prevention due to next instruction pointer corruption by soft errors
US6886093B2 (en) 2001-05-04 2005-04-26 Ip-First, Llc Speculative hybrid branch direction predictor
US7069411B1 (en) 2003-08-04 2006-06-27 Advanced Micro Devices, Inc. Mapper circuit with backup capability
US7043626B1 (en) 2003-10-01 2006-05-09 Advanced Micro Devices, Inc. Retaining flag value associated with dead result data in freed rename physical register with an indicator to select set-aside register instead for renaming
US7421698B2 (en) 2003-12-22 2008-09-02 Sun Microsystems, Inc. System and method for dynamically and persistently tracking incremental profiling data in a process cloning application environment
US8019981B1 (en) 2004-01-06 2011-09-13 Altera Corporation Loop instruction execution using a register identifier
US7444501B2 (en) * 2006-11-28 2008-10-28 Qualcomm Incorporated Methods and apparatus for recognizing a subroutine call
US7856548B1 (en) * 2006-12-26 2010-12-21 Oracle America, Inc. Prediction of data values read from memory by a microprocessor using a dynamic confidence threshold
JP4980751B2 (ja) * 2007-03-02 2012-07-18 富士通セミコンダクター株式会社 データ処理装置、およびメモリのリードアクティブ制御方法。
US7941627B2 (en) 2008-02-01 2011-05-10 International Business Machines Corporation Specialized memory move barrier operations
CN101763248A (zh) * 2008-12-25 2010-06-30 世意法(北京)半导体研发有限责任公司 用于多模式分支预测器的系统和方法
US20100332812A1 (en) * 2009-06-24 2010-12-30 Doug Burger Method, system and computer-accessible medium for low-power branch prediction
WO2011065145A1 (ja) 2009-11-24 2011-06-03 日本電気株式会社 プロセッサ、プロセッサによるループ回数制御方法
US8752047B2 (en) 2010-05-28 2014-06-10 Bromium, Inc. Automated management of virtual machines to process untrusted data based on client policy information
US20130086669A1 (en) 2011-09-29 2013-04-04 Oracle International Corporation Mobile application, single sign-on management
WO2013071087A1 (en) 2011-11-09 2013-05-16 Unisys Corporation Single sign on for cloud
US8863297B2 (en) 2012-01-06 2014-10-14 Mobile Iron, Inc. Secure virtual file management system
MX342909B (es) 2012-02-21 2016-10-18 Zih Corp Metodos, aparatos y productos de programas para computadora para implementar impresoras conectadas a la nube y un marco adaptable de aplicacion basado en la impresora.
US20130275492A1 (en) 2012-04-13 2013-10-17 Microsoft Corporation Enabling Web Clients to Provide Web Services
JP6053364B2 (ja) 2012-07-19 2016-12-27 キヤノン株式会社 情報処理システム、サーバ装置、クライアント装置および制御方法
CN103593166A (zh) * 2012-08-17 2014-02-19 刘书 一种同时线程处理器的分支预测器设计

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101819522A (zh) * 2009-03-04 2010-09-01 威盛电子股份有限公司 微处理器以及相关指令解析的方法
CN102754069A (zh) * 2010-02-18 2012-10-24 国际商业机器公司 加载/存储分离设施及其指令

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
可扩展、周期精确、快速多核模拟器研究;胡益斌;《中国优秀硕士学位论文全文数据库 (信息科技辑)》;20130415;I137-14 *

Also Published As

Publication number Publication date
HK1215610A1 (zh) 2016-09-02
CN105045562A (zh) 2015-11-11
US20150309794A1 (en) 2015-10-29
CN108196884A (zh) 2018-06-22
EP2937777A3 (en) 2016-03-02
US10209992B2 (en) 2019-02-19
EP2937777A2 (en) 2015-10-28

Similar Documents

Publication Publication Date Title
CN108196884B (zh) 利用生成重命名的计算机信息处理器
US7263600B2 (en) System and method for validating a memory file that links speculative results of load operations to register values
US9710272B2 (en) Computer processor with generation renaming
US7028166B2 (en) System and method for linking speculative results of load operations to register values
US6721874B1 (en) Method and system for dynamically shared completion table supporting multiple threads in a processing system
US6163839A (en) Non-stalling circular counterflow pipeline processor with reorder buffer
US7721071B2 (en) System and method for propagating operand availability prediction bits with instructions through a pipeline in an out-of-order processor
US7415597B2 (en) Processor with dependence mechanism to predict whether a load is dependent on older store
US6845442B1 (en) System and method of using speculative operand sources in order to speculatively bypass load-store operations
US5931957A (en) Support for out-of-order execution of loads and stores in a processor
US7711934B2 (en) Processor core and method for managing branch misprediction in an out-of-order processor pipeline
US20090037697A1 (en) System and method of load-store forwarding
JP2014002735A (ja) ゼロサイクルロード
US10310859B2 (en) System and method of speculative parallel execution of cache line unaligned load instructions
US10776123B2 (en) Faster sparse flush recovery by creating groups that are marked based on an instruction type
US9841974B2 (en) Renaming with generation numbers
US20100306513A1 (en) Processor Core and Method for Managing Program Counter Redirection in an Out-of-Order Processor Pipeline
US7937569B1 (en) System and method for scheduling operations using speculative data operands
US10346165B2 (en) Resource locking for load store scheduling in a VLIW processor
US7222226B1 (en) System and method for modifying a load operation to include a register-to-register move operation in order to forward speculative load results to a dependent operation
US7266673B2 (en) Speculation pointers to identify data-speculative operations in microprocessor
US20030061465A1 (en) Issue and retirement mechanism in processor having different pipeline lenghths
US10241788B2 (en) Method and system for determining instruction conflict states for issuance of memory instructions in a VLIW processor
WO2007084202A2 (en) Processor core and method for managing branch misprediction in an out-of-order processor pipeline
US20040128482A1 (en) Eliminating register reads and writes in a scheduled instruction cache

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
TA01 Transfer of patent application right

Effective date of registration: 20181018

Address after: Singapore Singapore

Applicant after: Annwa high tech Limited by Share Ltd

Address before: Singapore Singapore

Applicant before: Avago Technologies Fiber IP Singapore Pte. Ltd.

TA01 Transfer of patent application right
GR01 Patent grant
GR01 Patent grant