CN111971654A - 用于指令预提取的分支目标缓冲器布置 - Google Patents

用于指令预提取的分支目标缓冲器布置 Download PDF

Info

Publication number
CN111971654A
CN111971654A CN201980025659.3A CN201980025659A CN111971654A CN 111971654 A CN111971654 A CN 111971654A CN 201980025659 A CN201980025659 A CN 201980025659A CN 111971654 A CN111971654 A CN 111971654A
Authority
CN
China
Prior art keywords
btb
branch
instruction
instructions
entry
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.)
Pending
Application number
CN201980025659.3A
Other languages
English (en)
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.)
University of Edinburgh
Original Assignee
University of Edinburgh
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 University of Edinburgh filed Critical University of Edinburgh
Publication of CN111971654A publication Critical patent/CN111971654A/zh
Pending legal-status Critical Current

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/3854Instruction completion, e.g. retiring, committing or graduating
    • 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/3854Instruction completion, e.g. retiring, committing or graduating
    • G06F9/3858Result writeback, i.e. updating the architectural state or memory

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

本发明涉及一种分支目标缓冲器BTB,用于在计算机程序的机器可读指令序列中存储与控制流程中的相应分支相对应的至少一个BTB条目。所述BTB具有与提取地址产生器的程序计数器进行比较的标签字段、以及存储通过对应的标签字段识别的分支指令的信息特征并且允许将条件分支与无条件分支指令区分开的至少一个另外的字段。所述BTB具有预定的存储容量,并且被利用以使得相对于条件分支指令,无条件分支指令被优先分配了所述BTB中的存储空间。

Description

用于指令预提取的分支目标缓冲器布置
技术领域
本文中描述的例子总体上涉及用于数据处理设备的分支预测,更具体地涉及用于缓冲分支指令的电路系统。
背景技术
诸如服务器工作负荷的处理工作负荷可以涉及由于可能具有包括数兆字节的指令的作用指令工作集的、深度分层的软件堆栈而具有大的指令占用区的软件。大的指令占用区和有限的可用高速缓存容量可以导致以下高速缓存问题,即,许多高速缓存未命中在执行期间发生,由于从下级(更慢的)存储器提取指令,导致处理延迟。
分支目标缓冲器(BTB)可以用于允许在指令提取阶段预测分支目标地址,而不是等待分支目标在分支指令解码之后变为可用。因此,BTB可以用于缩短与分支指令相关联的浪费的处理周期,但是对于大的指令占用区,并非所有的分支指令都可以在固定容量的BTB中具有条目。
大的指令占用区还可以引起BTB问题,即,对于正被提取的一些分支指令,在BTB中找不到用于指令的匹配条目,导致线性序列中的下一个顺序的指令被错误地提取。这个错误的提取可以涉及随后刷新指令流水线和相关联的延迟。为了捕捉在例如服务器工作负荷中可以找到的数万个分支目标,100千字节以上的BTB存储可能是期望的。
对于高速缓存问题和BTB问题的解决方案可能提高处理器性能。
附图说明
以下参照附图来进一步描述本技术的例子,在附图中:
图1示意性地例示说明根据本技术的执行分支预测和指令提取的数据处理设备;
图2示意性地例示说明示例程序控制流程,其包括无条件分支的分支目标附近的由无条件分支规定的全局控制流程和条件分支规定的局部控制流程;
图3A示意性地例示说明根据本技术的一个例子的具有分支目标缓冲器的分支预测单元,所述分支目标缓冲器具有包括无条件BTB、条件BTB和返回指令缓冲器的三个组件;
图3B示意性地例示说明当对于无条件分支的分支目标缓冲器命中发生时、使用空间占用区既用于高速缓存、又用于条件分支预提取的工作例子;
图4是示意性地例示说明具有专用的无条件BTB、条件BTB和返回指令缓冲器的BTB如何被利用的流程图;
图5示意性地例示说明提供最先进的统一前端预提取器与服务器工作负荷上的理想前端的比较的仿真结果;
图6示意性地例示说明示出累积访问概率和与区域进入点的距离(在块中)对比的绘图的仿真结果以示出某些代码区域内部的指令高速缓存块访问分布;
图7示意性地例示说明动态分支覆盖与静态分支的数量(以上千个分支为单位)对比的绘图、以及示出静态分支对于用于Oracle和DB2程序应用的动态分支执行的贡献的仿真结果;
图8示意性地例示说明两个表格,包括示出图5至图16的仿真中使用的工作负荷的第一个表格和示出用于仿真的微架构参数的第二个表格;
图9示意性地例示说明示出用于若干个不同的程序应用和包括根据本公开的“Shotgun”预提取方案的三个不同的预提取方案的以百分比为单位的暂停周期覆盖的仿真结果;
图10示意性地例示说明示出不同的预提取方案对于若干个不同的程序应用的相对于非预提取基准的加速、并且包括对于本技术的结果的仿真结果;
图11示意性地例示说明通过实现本技术的不同的例子而可能实现的前端暂停周期覆盖,并且示出使用不同的空间区域预提取机制的仿真结果的比较;
图12示意性地例示说明了仿真结果,其示出了针对各种不同程序应用的、根据本技术的不同的空间区域预提取机制可实现的加速;
图13示意性地例示说明对于三个不同的空间区域预提取机制和若干个不同的程序应用的以百分比为单位的预提取准确度的仿真结果;
图14示意性地例示说明示出利用不同的空间区域预提取机制填写第1级数据高速缓存未命中所需的周期的数量的仿真结果;
图15示意性地例示说明示出使用根据本技术的使用不同的条件分支目标缓冲器大小的预提取而可能实现的加速的仿真结果;以及
图16示意性地例示说明了仿真结果,该仿真结果将本技术和更早的“Boomerang”技术针对不同的分支目标缓冲器大小进行比较并对这两种不同的技术使用相等的存储预算的。
具体实施方式
需要找到对于高速缓存问题和BTB问题的解决方案。理想地,将在不过度地增大BTB的硅占用区或高速缓存存储器的情况下、并且在不造成对于与指令控制流程相关联的元数据的繁重的存储需求的情况下实现这。
本技术可以适用于具有分支目标缓冲器的任何分支预测器。分支预测使得可以推测地提取指令。本技术适用于推测地提取指令的系统。这些系统中的一些系统还可以推测地执行指令,但是其他系统可以推测地提取,而不还推测地执行。
图1示意性地例示说明执行分支预测和指令提取的数据处理设备。所述设备包括分支预测单元110,分支预测单元110包括分支预测器112、分支目标缓冲器(BTB)114、BTB预提取缓冲器116和返回地址堆栈118。提取地址产生器120产生填充提取目标队列(FTQ)130的条目的指令地址。所述设备进一步包括预提取引擎142和提取引擎144,其中每个都从FTQ130获取指令地址。在该例子中,FTQ 130基于先进先出进行操作。
返回地址堆栈118是产生对于返回指令的预测的返回地址的固定大小的堆栈。BTB114可以用于预测条件分支和无条件分支的目标地址,但是可以利用返回指令缓冲器来处理返回。BTB 114包含指示具有匹配条目(“命中”)的指令是分支指令、并且如果是分支指令、则对应的预测的分支目标地址是什么的信息。在不存在BTB 114时,分支目标地址和指令类型(分支或非分支)在指令流水线的提取阶段将是不可用的,而是只有在解码之后才变得可用。该例子中的BTB 114相对于条件分支指令,优先将存储空间分配给无条件分支指令。在一些例子中,这可以涉及:优先将预定大小的缓冲器中的预定存储空间分配给无条件分支指令,当利用缓冲器中的该预定存储空间以使得无条件分支指令具有比条件分支指令多的BTB条目时,将用于条件分支指令和无条件分支指令这二者的条目存储在单个缓冲器中以使得例如无条件分支指令具有比条件分支指令高的加权。
在具有用于条件分支指令和无条件分支指令的共用缓冲器的一些这样的例子中,因为条件分支趋向于比无条件分支多一个很大的比率,所以可以利用预定BTB容量的一半或更少容量来捕捉应用的非常大的无条件分支集,但是仍可以使给予无条件分支的条目的数量相对于常规的BTB增加,常规的BTB不会相对于条件分支优先将BTB中的存储空间分配给无条件分支。在其他例子中,如下面描述的图3A中所示,BTB 114、314可以包括用于与无条件分支指令相对应的条目和与条件分支指令相对应的条目的单独的缓冲器352、354,以使得存在专用于这两种不同类型的分支指令中的至少一个的物理存储。另外的专用的缓冲器存储器356可以专用于返回作为无条件分支指令的子类别的指令。U-BTB可以要么大于、要么小于C-BTB,尽管优先对无条件指令分配了BTB存储。
图1的预提取引擎142和提取引擎144每个都将一个或多个信号输出到块请求复用器150,块请求复用器150提供与至少包括第1级指令高速缓存(L1 I-高速缓存)162和最后一级高速缓存(LLC)164的数据处理设备的存储器系统的接口。在该描述中,术语存储器可以是指L1高速缓存存储器、最后一级高速缓存存储器、主存储器或数据处理设备可访问的任何其他的存储器。预提取引擎142输出预提取探针143以检查与L1 I-高速缓存162中的被占据的FTQ条目相对应的指令(一个或多个)的存在。如果预提取探针143在L1 I-高速缓存162中遇到未命中,则L1 I-高速缓存162可以产生对于LLC 164的访问权以使未命中块进入L1 I-高速缓存162中。
提取引擎144将需求提取信号145输出到块请求复用器150,要求从L1 I-高速缓存162或LLC 164检索与PC相对应的指令(一个或多个)。块请求复用器150被布置为响应于BTB114输出BTB未命中信号115,从BTB未命中缓冲器172接收BTB未命中探针151的形式的输入信号。BTB未命中信号115指示BTB未命中已经被分支预测电路系统110响应于对程序计数器的当前值执行的BTB查询检测到。在该例子中,BTB未命中已知是与分支指令程序计数器(PC)相关联的真正的BTB未命中,所述真正的BTB未命中当前在BTB中没有条目,并且不是与对于非分支指令的PC的查询相关联的未命中。
预解码器180被布置为对从高速缓存存储器的块(即,从L1 I-高速缓存162或LLC164中的一个)接收的指令进行预解码,以使得能够识别检索的高速缓存块内的任何分支指令和它们的对应的目标地址。指令是否是分支指令、分支指令的类型和分支目标在不对该指令解码的情况下是未知的。在图1的例子中,BTB未命中探针151由BTB未命中缓冲器172发出,但是在替代例子中,通过BTB中的BTB未命中的检测(由BTB未命中信号115指示)而被触发的BTB未命中探针可以响应于被例如分支预测单元110(例如,直接来自BTB 114)、提取地址产生器120、预提取引擎142、专用的BTB未命中探针产生器电路、或数据处理设备中的任何方便的电路触发而被发出。
预提取缓冲器190被布置为存储响应于预提取引擎142输出的预提取探针143从LLC 164检索的指令。预提取探针143检查L1 I-高速缓存162以确立它是否包含与来自FTQ130的正被预提取的条目相对应的高速缓存块,而不需要该高速缓存块从存储器返回。如果L1 I-高速缓存162不包含正被预提取探针探测的高速缓存块,则提取请求被发给LLC 164,并且从LLC 164返回的对应的预提取的指令(一个或多个)被作为条目存储在预提取缓冲器190中。预提取缓冲器190中的这个条目随后可以应来自提取引擎144对对应的PC的需求提取请求,被移动到L1 I-高速缓存162。然而,在替代例子中,预提取缓冲器可以被省略,并且预提取的块可以被直接放置到L1-I中。
预解码器180可以对从L1 I-高速缓存162或者从预提取缓冲器190读取的指令进行解码以识别一个或多个分支指令和其中包含的对应的分支目标以用于预填写BTB 114或BTB预提取缓冲器116中的至少一个的目的。从预解码器180的输出中识别与BTB未命中被遇到的PC匹配的分支指令地址和对应的分支目标地址,并且被存储在BTB 114中。来自预解码的高速缓存块(一个或多个)的输出的任何其他的分支指令地址和对应的分支目标地址,诸如跟在存储在BTB 114中的分支指令之后的后一个分支指令,可以被存储在BTB预提取缓冲器116中。注意,BTB预提取缓冲器116是可选的,并且在不提供这的例子中,信息可以被直接存储在BTB 114、或其在其中提供单独的U-BTB、C-BTB和RIB的组件中的一个中(如下面描述的图3A中那样)。
FTQ 130包括接收与存储器中的其中存储将被预提取引擎142预提取的或者将被提取引擎144提取的单个的指令或指令“基本块”的地址相对应的条目的多个存储槽。BTB一命中,基本块的多个指令中的每个的地址就可以被录入到FTQ 130中,随后其地址被存储在FTQ中的指令被提取以供对应的数据处理设备顺序执行。为了本说明书的目的,“基本块”被定义为在分支中结束的直线指令的序列。这不同于单进入单退出直线代码的常规定义。该定义的性质意味着根据分支指令前面的指令的数量,基本块可以是可变的大小。基本块是与“原子”类似的构建块,在这种意义上,如果执行控制流程执行了基本块的一个指令(第一个指令)、则一直到并且包括基本块的终止分支的所有的指令都被保证将被执行。
提取引擎144向块请求复用器150发出需求提取指令145,并且在继续从FTQ 130的顶部提取下一个指令之前等待来自L1 I-高速缓存162的提取响应。预提取引擎142从除了顶部槽132之外的FTQ槽预提取指令,以使得它在提取引擎144之前运行。预提取引擎142发出预提取探针143以确定对应的指令或基本块是否存在于包括L1 I-高速缓存162的存储器中。如果它不存在于L1 I-高速缓存162中,则数据可以从LLC 164或下一级存储器检索。在对于提取地址产生器120产生的地址检测到BTB未命中、导致输出BTB未命中信号115的情况下,块请求复用器150被布置为将不同的优先级关联到:(i)提取引擎144发出的需求提取;(ii)BTB未命中缓冲器172输出的BTB未命中探针151;以及(iii)预提取引擎142输出的预提取探针143。块请求复用器150可以被布置为分派比分派给为预提取探针143服务的优先级高的优先级来为BTB未命中探针151服务。然而,需求提取信号145可以具有比BTB未命中探针151和预提取探针143这二者高的优先级以使得提取引擎可以在没有阻碍的情况下遍历FTQ 132前进。
BTB 114是将程序计数器映射到分支目标地址的固定大小的散列表。例如,如果当前PC=10,则对BTB搜索被标记10的PC的条目。如果在BTB 114中找到匹配的条目,即,如果存在BTB“命中”,则这表明分支指令正被提取用于执行,并且给予分支的预测的目标地址。在BTB 114中没有对当前PC找到匹配的情况下,BTB 114能够可靠地区分与没有条目当前被存储在BTB中的分支指令相对应的当前PC和与非分支指令相对应的当前PC。由于存储包括指令基本块的BTB条目,而不是存储包括单个的指令的BTB条目,这是可能的。BTB 114存储关于分支指令的信息,而不是存储分支指令本身。
BTB 114还可以将指示置信水平的分支预测统计存储在存储在BTB 114中的相关联的预测的分支目标地址中。分支在流水线型处理器中在计算上是昂贵的,因为甚至是无条件分支也需要中断指令提取操作序列来从与分支目标地址相对应的新的存储器位置(PC)重启指令流。在这种情况下,可能已经从存储器提取的并且在指令缓冲器或高速缓存行中等待的指令(一个或多个)由于在分支被采取时切换到新的PC,可能必须被丢弃。
条件分支在分支的方向(即,分支是否被采取)可以被确定之前,可能必须等待操作数被产生或者状态位被设置。在知道分支是否应被采取之前,处理器可能已经提取并且部分地执行除分支之外的若干个指令。在根据本技术的例子中,这可以被避免。
存储在BTB 114中的分支目标地址可以在指令从流水线“撤离”之后基于实际的执行数据被更新,以改进BTB预测的准确性。图1的例子的BTB 114执行当前的程序计数器与指令基本块、而不是与单个的分支指令的映射,并且FTQ 130的条目也可以为基本块粒度。基本块在一些情况下可以小于高速缓存块,并且在其他情况下,大于高速缓存块。用基本块条目填充BTB 114使得数据处理设备可以更容易地区分在BTB 114中正被查找的非分支指令与“真正的”BTB未命中。BTB条目的达到基本块粒度的存储可以保证每个BTB条目包含其目标是另一个BTB条目的正好一个分支指令。这意味着如果BTB查找未能返回对于当前的程序计数器有效的条目,则查找可以被看作是真正的BTB未命中,而不是查找非分支指令的后果。
用基本块填充的BTB可以利用基本块中的第一个地址来访问。例如,考虑以下具有三个指令的基本块:
A:add
B:sub
C:branch<基本块的分支标记末尾>
D:
在这种情况下,BTB 114可以利用第一个指令的地址来访问,该地址是“A”。BTB中对于该块的命中应指示,基本块的大小是三个指令。所以,如果分支(在地址C处)被预测“不被采取”,则对于BTB 114的下一次访问将是针对地址D(C的下一个顺序地址)。在该例子中,终止基本块的分支可以是条件分支或无条件分支。
与基本块相对应的BTB条目在填写BTB 114中的BTB未命中时被创建(参见下面描述的图4的流程图中的处理元素320)。基本块也可以在已经正确地完成执行的指令被从流水线“撤离”时被创建。当分支指令被撤离时,基于基本块相对应的BTB条目被创建并且被保存,或者可替代地,如果对应的条目已经存在于BTB中,则该条目被更新。更新涉及反馈以改进分支预测的准确性的分支预测统计。
如果BTB未命中对应于当前PC的尝试的查找,则触发BTB未命中的基本块查找的分支目标是未知的。由于这个原因,PC不被插入在FTQ 130中,而是相反被存储在BTB未命中缓冲器172中,直到使用预解码器180、而且还可能使用预提取缓冲器190解决BTB未命中为止。BTB未命中探针151最终可以导致BTB未命中通过经由预解码器180识别与对于其、BTB未命中被遇到的PC相对应的适当的分支指令地址和对应的分支目标地址而被解决。
在图1例子中,FTQ 130的每个条目都可以包含关于基本块的信息,例如,基本块的起始地址、基本块中的指令的数量或基本块中的字节的数量等。因此,如果在基本块中存在三个指令,则FTQ条目可以包含第一个指令的地址,而且还可以指定存在三个指令以使得提取引擎144知道从基本块的第一个地址开始提取多少个指令。提取引擎144读取FTQ 130的包括顶部FTQ条目132的头,并且向I-高速缓存发出非零整数N个需求提取请求,其中N是指指令提取宽度。根据实现,提取引擎144在发出随后的提取请求之前可以等待响应。这对应于有序提取策略,因此如果与需求提取信号145相对应的指令在L1 I-高速缓存162中没有被找到,则提取引擎144可以暂停,直到请求的数据被从LLC 164返回并且被写入到L1 I-高速缓存162为止。在替代例子中,每个FTQ条目或FTQ条目的至少非零子集可以包括单个指令地址,但是基本块FTQ条目利用存储器中的存储空间,更加经济。
预提取引擎142执行的指令的预提取是为了适当地填充L1 I-高速缓存162以准备好使需求提取指令随后被提取引擎144发出而被执行的。根据本技术,基于FTQ 130的传入的指令预提取流的至少子集被用于以下中的至少一个的目的:(i)预填写BTB 114;或者(ii)填充BTB预提取缓冲器116。所用的预提取流的子集对应于BTB未命中探针触发的高速缓存块。因此,该例子中的基于分支预测的指令预提取被用于填充L1 I-高速缓存162,但是除了其最初预期的功能之外,预提取被进一步还用于填充BTB 114。
预提取用于填充BTB的使用可以在没有任何修改的情况下实现以容纳大量元数据的存储,并且可以使用现有的分支预测驱动的预提取电路系统。将数据处理设备修改为响应于真正的BTB未命中执行BTB填写的修改包括添加BTB未命中缓冲器172、BTB预提取缓冲器116和块请求复用器150。预解码器180使得分支指令和分支目标可以在预提取的高速缓存块中被识别。本例子与前面的例子的不同之处在于,既用于高速缓存预填写、又用于BTB填充的所用的预提取对于存储无条件分支指令给予相对于条件分支指令更高的优先级。与BTB中的无条件分支指令相对应的条目的优先存储使得能够以降低的存储成本实现有效的BTB引导的预提取。这是基于以下见解,即,当代的软件趋向于被结构化为函数集合,并且在每个函数内,在指令高速缓存块中有可能存在指令的高空间局部性。具有短的偏移的条件分支趋向于在这些高速缓存块之间操纵局部控制流程,而具有长的偏移(例如,调用和返回)的无条件分支趋向于将全局控制流程从一个函数驱动到另一个函数。因此,应用的代码占用区可以通过主要尽可能地充分地使用无条件分支集而被高效地且有效地映射。对于每个无条件分支,分支目标(诸如空间“占用区”)附近的一组指令或基于无条件分支目标确定的另一组指令可以被用于识别指令高速缓存的有可能被访问的块。因为无条件分支通常包括应用的整个分支指令集的小部分,所以无条件分支的大的部分可以在实际大小的BTB中被捕捉。如果条件分支与无条件分支在没有容量的任何优先排序或分割的情况下共享容量,则捕捉无条件分支的这样的大的部分将是不可能的。
图2示意性地例示说明示例程序控制流程,该示例程序控制流程包括无条件分支的分支目标附近的无条件分支规定的全局控制流程和条件分支规定的局部控制流程。一组实线箭头212、214、216表示无条件分支规定的全局控制流程和它们各自的目标。一组虚线箭头222、224和226表示局部控制流程。图2示出对应于第一个程序函数fn(1)210的五个存储器块A1、A2、A3、A4和A5;对应于第二个程序函数fn(2)220的两个存储器块B1和B2;以及对应于第三个程序函数fn(3)230的两个存储器块C1和C2。在该说明性例子中,每个存储器块具有四个条目,其中每个可以对应于程序指令。根据本技术,全局控制流程对应于无条件分支指令,包括块A4中的第一个调用指令“call1”、块A5中的第二个调用指令“call2”、以及块B2中的“return”指令。局部控制流程对应于条件分支指令,包括块A1中的第一个条件分支“bcc1”、块A4中的第二个条件分支“bcc 2”以及块C1中的第三个条件分支“bcc 3”。考虑包括fn1()210中的、从块A1中的第一个指令开始的指令的执行的控制流程。块A1中的指令被执行,直到第一个条件指令bcc 1为止。假定条件被满足,则控制流程经由虚线箭头222从bcc 2跳到块A3中的第二个条目,然后另外的两个指令被执行以到达第一个无条件指令“call 1”2。在执行“call 1”时,控制经由实线箭头212转到第二个函数fn(2)220并执行作为“call 1”的分支目标的块B1的第一个指令。在该例子中,分支目标是目标指令的地址,在这种情况下,目标指令的地址是B1中的第一个指令的地址。当在下一个处理周期中,BTB被用B1的第一个指令的地址搜索时,对应的BTB条目将被找到以对基本块的大小进行编码:七个指令,包括块B2的倒数第二个槽中的以“return”指令终止(无条件分支)的、B1的四个指令和B2的三个指令。call 1的分支目标的区域中的并且包括B1中的第一个指令一直到B2中的返回指令的指令可以被定义为call 1的“调用占用区(call footprint field)”,而“返回调用量”可以被定义为在执行B2中的返回指令之后、一返回到A4中的第二个指令就跟随的控制流程。调用占用区和返回占用区这二者都是定义包含分别与采取无条件分支指令调用和返回时的控制流程相关联的指令的存储器区域的空间占用区的例子。在该例子中,调用占用区和返回占用区(return footprint)具有指令级别粒度。然而,在替代例子中,空间占用区可以具有高速缓存块粒度,而不是指令粒度。就高速缓存块定义调用占用区和返回占用区的实现可能更高效,因为它使用较少的存储来定义占用区。参照如下所述的图3A来进一步讨论调用占用区和返回占用区。
返回指令一执行,全局控制流程就经由实线箭头214转回到fn(1)210中的块A4的第二个条目。因此,块A4中的第二个指令对应于无条件分支“call 1”的返回占用区中的第一个指令。因为块A4包括第三个条目中的第二个条件指令“bcc 2”,所以随后的控制流程取决于与“bcc 2”相对应的分支是否被采取,如果该条件分支事实上被采取,则与第一个条件分支指令“bcc 1”相对应的分支是否被采取。具体地说,如果“bcc 2”没有被采取,则“call1”的字段362f的返回占用区可以是A4、A5。
如果另一方面,“bcc 2”条件分支事实上被采取,则返回占用区可以是以下二者中任何一个:(i)A4、A1和A3,如果块A1中的指令一执行,“bcc 1”也被采取;或者(ii)A4、A1、A2、A3,如果“bcc 1”不被采取。在“bcc 2”被采取的两个例子中,程序控制流程从A4转到A1。没有空间占用区,哪些高速缓存块或指令在第二个条件分支bcc 2之后将是需要的是未知的。在没有空间占用区的情况下知道的是,至少一直到bcc 2的指令是需要的,因为它在返回的目标基本块中。然而,通过指定空间占用区,提供关于预计将被访问的指令的进一步的信息。具体地说,该例子中的预计将被访问的指令将是以下块中的那些指令:(i)A4和A5,如果bcc2不太可能被采取;或者(ii)A4、A1和A3,如果bcc2有可能被采取,并且bcc1随后有可能被采取;或者(iii)A4、A1、A2、A3,如果bcc2有可能被采取,但是bcc1随后不太可能被采取。空间占用区可以被用于预提取以更准确地定义在无条件分支执行之后预计将被访问的指令。
对于A5中的第二个无条件指令“call 2”,分支目标是fn(3)230中的块C1的第一个指令,并且基本块以块C1的第二个条目中的条件指令“bcc 3”终止。
在一些例子中,图3A的空间占用区字段362e和返回占用区字段362f的内容可以被用于基于将被加载到L1-I高速缓存中的预解码的指令来确定如何用条件指令填充C-BTB354。然而,在替代例子中,调用占用区362e和返回占用区362f可能并不需要。在一个这样的替代的示例预提取方案中,对于图2的第一个无条件指令“call 1”,一直到下一个无条件指令fn2()B2 220中的“return”的所有指令都可以被加载到L1-I中。这是因为call 1将总是被采取(无条件的),因此将执行到B1,因此,下一个无条件分支是B2中的return。换句话说,目标区域的进入点和退出点之间的所有的存储器块(例如,高速缓存块)都可以被加载。在还有的进一步的替代的示例预提取方案中,可配置数量的连续的高速缓存块(例如,4个、5个或6个块)或目标区域中的和无条件分支目标之后的连续的指令可以被预提取。该连续指令预提取方案比实现基于空间占用区的预提取简单,但是基于占用区的预提取可以提供提高的准确性和效率。因此,这两个不同的示例方案具有相关联的优点。
注意,因为空间占用区(调用占用区和/或返回占用区)或无条件分支指令的目标附近的其他空间区域可以包含应被执行的至少一个指令、以及将在执行控制流程中的指令,所以不应被执行的这些指令在被预提取以填充L1-I的同时,不被录入到FTQ 130中。无条件分支指令的目标的区域中的空间预提取的目的可以用于高效地填充高速缓存存储器以准备好执行FTQ 230中的预提取的指令序列。
根据本技术,无条件分支相对于条件分支被优先进行BTB存储以推动的指令的预提取,以提高适当的指令将在执行时被存储在L1-I 162中的可能性。
图3A示意性地例示说明根据本技术的一个例子的具有BTB 314的分支预测单元310。在该例子中,BTB 314具有:专用于存储用于无条件分支指令的条目的无条件BTB(U-BTB)352;专用于存储用于条件分支指令的条目的条件BTB(C-BTB)354;以及专用于跟踪与函数返回和陷阱返回相对应的返回指令的返回指令缓冲器(RIB)356。分支预测单元310还包括具有如对于图1中的对应地命名的组件描述的功能的分支预测器312和BTB预提取缓冲器316。分支预测单元310被布置为填充为排队等待执行的指令的提取目标队列330。
如图3A所示,U-BTB条目362包括标签字段362a、大小字段362b、类型字段362c、目标字段362d、调用占用区字段362e和返回占用区字段362f。标签字段362a与程序计数器(或其一部分)匹配以识别给定的程序计数器在U-BTB 352中是否具有对应的条目。可以将标签字段362a与提取地址产生器的程序计数器进行比较以确定在程序计数器和关于当前存储在BTB 314中的分支指令的信息之间是否存在匹配。该例子中的大小字段362b给予与匹配的无条件分支指令相对应的基本块的大小(指令的数量)。图3A是基本块类型BTB 314,在这种情况下,如果标签字段362a与关于其的信息被存储在BTB中的基本块的第一个指令匹配,并且该基本块内的分支指令可以经由大小字段362b找出,则标签字段362a导致BTB命中。考虑本说明书的第8页上的简单的示例基本块,基于基本块的BTB在它的索引为A(基本块中的第一个指令的PC)、而不是C(分支指令)时将示出命中。另外,使用大小字段,基于基本块的BTB可以告诉下一个分支在哪里,在这种情况下,它在2个指令之后(大小字段将为2),以使得分支可以被预测,并且PC可以被相应地更新。在通过基于指令、而不是基于基本块的BTB使用指令的替代例子中,标签字段在与PC比较时,在索引为分支的PC(即,第8页基本块中的指令C,假定BTB包含关于分支C的信息)时,将示出命中。
图3A中的类型字段362c指定分支指令的类型,诸如调用、跳转等。目标字段362d指定分支指令的目标地址,所述分支指令是在对应的分支指令执行之后将被执行的下一个指令(就条件分支来说,假定分支条件被满足)。
调用占用区字段362e识别与存储器中的与分支目标相邻的给定空间位置处的多个指令相对应的“局部函数”的程序指令在存储器中的空间占用区。返回占用区字段362f识别与从局部函数返回时以及直到后一个无条件分支指令被遇到的指令执行控制流程相对应的程序指令序列在存储器中的空间占用区。在该非限制性例子中,U-BTB条目是由38位标签、46位标签、用于基本块大小的5个位、以及用于分支类型(无条件的或调用)的1个位组成的106位条目。这两个空间占用区362e、362f可以被存储在例如两个八位矢量中。所述矢量可以指示目标地址前面和/或后面的偏移,每个矢量条目指示对应的存储器块在与分支目标相对应的“局部函数”的一次或多次先前的执行期间是否被访问。占用区矢量元素的至少子集可以表示离分支目标块的相对块距离,相对距离可以包括正相对距离、负相对距离、或正相对距离和负相对距离这二者。
图3A还示出了用于C-BTB条目364的代表性数据结构,C-BTB条目364具有标签字段364a、大小字段364b、方向字段364c和目标字段364d。标签字段364a将索引提供到C-BTB364中,并且被与传入的PC(或其一部分)进行比较,以确定该PC是否对应于包含在C-BTB354中具有条目的条件分支指令的基本块。该例子中的大小字段364b给予与对应的条件分支指令的目标相对应的基本块中的指令的数量。方向字段364c可以给予对应的分支是否有可能被采取的指示。目标字段364d给予条件分支的目标地址,所述目标地址是在该分支被采取的情况下将被跳到的PC。在图3A例子中,C-BTB条目364是70位条目,其中每个C-BTB条目包括41位标签、22位目标偏移、用于基本块大小的5个位、以及用于条件分支方向预测的2个位。注意,只有22位目标偏移被使用,而不是整个46位目标地址(如用于U-BTB 352),这是因为条件分支趋向于使用PC相对偏移。
用于RIB条目的代表性数据结构366在图3A中被示为包括标签字段366a、大小字段366b和类型字段366c。与U-BTB数据结构362相比,RIB数据结构366没有空间占用区字段,它也没有目标地址字段。与C-BTB数据结构362相比,RIB条目没有方向字段和目标字段。方向字段在RIB结构366中不是一定需要的,因为条目所对应的返回指令是无条件分支。目标字段在RIB结构366中不是一定需要的,因为目标地址改为从返回地址堆栈318获得。在该非限制性例子中,RIB数据结构366是45位条目,该标签具有39位标签、用于基本块大小的5个位以及用于分支类型(返回或陷阱返回)的1个位。当返回指令从RAS 318推导它们的目标时,RIB 356不存储目标地址。
根据本技术的BTB 314中的RIB 356的实现使得可以更高效地使用BTB 314中的存储器,因为RIB 356的条目可以排除目标字段362d、364d,因此条目占据的位少于它们否则将占据的位。在不存在RIB 356时,返回指令否则将有可能被插入在U-BTB 252中。至少一些例子中的目标字段362d、364d占据单个的U-BTB 352条目的位长度的大于一半,所以消除目标字段可以改进存储效率。此外,研究已经表明,在不存在RIB 356时,U-BTB条目的大约25%将有可能被相对于条件分支、优先缓冲无条件分支的BTB中的返回指令占据。相比而言,在常规的BTB中,少于10%的条目有可能对应于返回指令,因为70%以上的常规的BTB条目有可能被条件指令占据。RIB 356中的条目的目标可以从返回地址堆栈(RAS)318读取。
在图3A的示例BTB 314中,U-BTB 352具有比C-BTB 354相比较多的条目,RIB 356具有比C-BTB 354相比较多的条目,但是具有比U-BTB 352少的条目。例如,在一个示例实现中,U-BTB 352可以具有比C-BTB 354多至少10倍的条目,RIB 356可以具有C-BTB 354大约5倍的条目。根据本技术,相对于条件分支指令,BTB 314的容量优先被分配给无条件分支指令。这可以要么在单个缓冲器中实现,所述单个缓冲器被布置为将无条件分支指令和条件分支指令这二者存储在同一缓冲器中,但是其中无条件分支在所述单个缓冲器中被给予比条件分支大的比例的条目。可替代地,本技术可以通过提供分别专用于无条件分支和条件分支的单独的缓冲器来实现。
尽管优先权被给予无条件分支的存储,但是条件分支的适当子集可以通过使用无条件分支指令条目262的占用区字段262e、263f中的信息而被预提取到BTB 214中(例如,C-BTB 354中),所述占用区字段被用于将高速缓存线带入L1-I 162中(参见图1)。占用区362e对应于无条件分支目标附近的存储器(例如,高速缓存块)的空间编码。可以通过预提取且预解码与空间占用区相对应的高速缓存块、提取这些预提取的块中包含的条件分支、并且将它们存储在C-BTB 354中来基于空间占用区362e、362f填充C-BTB 354。
根据本技术的数据处理设备采用如图3A所示的FTQ 330来保存分支预测单元310产生的提取地址。这些地址后来被提取引擎消耗用来提取对应的指令并且将这些指令馈送到内核后端。为了填写FTQ 330,分支预测器312可以并行地查询所有三个BTB(U-BTB 352、C-BTB 354和RIB 356)。如果在BTB 352、354、356中的任何一个中存在命中,则适当的提取地址被插入到FTQ 330中。因为这些地址最终要被用于从L1-I提取指令,所以它们表示自然的预提取候选。因此,本技术通过当提取地址被插入到FTQ 330中时、遍历它们扫描来充分利用该机会,并且对对应的L1-I块发出预提取探针。
在图3A的分支预测单元310中发生U-BTB或RIB命中时,目标代码区域的空间占用区362e被读取以对适当的高速缓存块发出L1-I预提取探针。访问空间占用区对于U-BTB命中是简单的,因为它是直接从对应的U-BTB条目的占用区字段362e读取的。然而,所述机制在RIB命中时略微更多地涉及,因为所需的空间占用区没有被存储在RIB中,相反,空间占用区被存储在对应调用的U-BTB条目中。为了找到相关的U-BTB条目,相对于常规RAS扩展RAS318,以使得在调用上,除了通常被推送到RAS 318上的返回地址之外,包含该调用的基本块的地址也被推送到RAS 318上。在该例子中,因为实现基本块定向的BTB,所以它是基本块,而不是与存储在RAS 318上的调用指令相对应的PC。RAS 318通常包含少数条目(8个到32个是常见的),所以存储包含RAS 218中的调用的基本块的地址的附加的RAS存储成本是可忽略不计的。在对于返回指令发生RIB命中时,分支预测单元310从RAS 318弹出相关联的调用的基本块地址,并且使用这来给U-BTB编索引并且从返回占用区字段262f检索空间占用区。
除了使用无条件分支BTB条目的空间占用区362e、362f来将指令预提取到L1-I中之外,本技术还利用控制流程共性来还预提取到C-BTB 354中。因此,当预提取的块到达L1-I时,使用一组预解码器来从预提取的块取出分支元数据,并且在访问流之前使用这来填充C-BTB。通过经由空间占用区362e、362f预计即将来到的指令工作集,并且经由预解码将其相关联的分支工作集预提取到C-BTB 354中,提供小、但还非常有效的C-BTB 354。
图3B示意性地例示说明当U-BTB命中发生时、使用空间占用区用于L1-I和C-BTB预提取的工作例子。图3B示出L1-I 382、LLC 384、预解码器386和C-BTB 388。这些组件具有与图1中的对应地命名的组件类似的功能性。分支预测单元310(参见图3A)首先从给定的U-BTB条目370读取目标地址“A”和调用占用区“01001000”。它然后对于L1-I 382产生对于目标块“A”、以及基于U-BTB条目370中的调用占用区、对于高速缓存块“A+2”和“A+5”的预提取探针(箭头{1})。如果在L1-I 382中没有找到这些块中的任何一个,则分支预测单元310发出对于LLC 384的预提取请求(一个或多个)(箭头{2})。一旦预提取的块从LLC 384到达,则它们被安装在L1-I 382中(箭头{3}),并且还被转发给预解码器386(箭头{4})。预解码器386从预提取的块取出条件分支,并且将它们插入到C-BTB 388中(箭头{5})。
如果分支预测单元310在所有三个BTB 352、354、356中都检测到未命中,则它调用BTB填写机制(被表示为“Boomerang”)来以以下方式解决未命中:首先,如果不存在于L1-I中的话,从L1-I 382或者从高速缓存下级384访问与未命中的分支相对应的指令块。所述块然后被馈送给预解码器386,预解码器386取出未命中分支,并且根据分支类型将它存储到BTB 370、388中的一个中。预解码的分支的其余部分被存储在BTB预提取缓冲器172(参见图1)中。在对于BTB预提取缓冲器172命中时,访问的分支基于分支类型被移动到适当的BTB370、388或RIB(在图3B中没有被示出)。
图4是示意性地例示说明根据一个例子的图3A的具有不同的U-BTB 352、C-BTB354和RIB 356的BTB314如何被利用的流程图。在元素410,利用PC来访问BTB以确定当前PC是否对应于包括分支指令并且在BTB 314中具有条目的基本块中的第一个指令。在元素420,确定是否存在对于当前PC的BTB命中。如果在BTB中存在未命中,则所述处理转到元素430,在元素430,发出BTB未命中探针来从存储器检索与BTB未命中相对应的一个或多个指令,以使得它们可以被预解码并且触发用于BTB未命中相对应的条目预填写BTB以使得它随后是可用的。
如果在元素420,BTB命中发生,则后续操作取决于BTB命中的类型。在该例子中,用于优先存储无条件指令的BTB具有分别专用于无条件分支、条件分支和返回指令的U-BTB352、C-BTB 354和RIB 356。
在元素420存在BTB命中的情况下,不管它是U-BTB命中、RIB命中、还是C-BTB命中,所述处理都包括元素470,元素470涉及将与BTB命中相对应的基本块插入到FTQ中并且相应地更新PC。BTB跟踪在分支中结束的指令块。如果控制流程进入基本块,则一直到并且包括基本块的终止分支的所有的指令都被保证将被执行。因此,基本块中的所有的指令地址都在元素470被插入到FTQ中。如果基本块的终止分支指令是条件分支,则分支可以被预测,并且PC可以被相应地更新。一旦新的PC是可用的,它就可以被用于给BTB编索引,并且新的基本块就被访问。BTB经由大小字段362b、364b、366b(参见图3A)指示指令(或来自起始地址的字节)将如何经由FTQ 330被提取。
如果在图4的元素440,命中被确定在U-BTB中,则在元素442,从BTB条目读取分支目标附近的区域的空间占用区(例如,调用占用区字段362e)。可替代地,读取无条件分支目标附近的固定数量的高速缓存块或指令。在另外的替代方案中,在元素442,识别来自分支目标、一直到控制流程中的下一个无条件分支的所有指令。然后,在元素444,如果所述指令不在L1-I中,则使用空间占用区(或分支目标附近的其他指令)来从LLC或存储器预提取块。接着,出于两个不同的目的,使用预提取的空间占用区指令。首先,在元素446,将预提取的与空间占用区指令相对应的高速缓存块存储在L1-I中。第二,在元素444之后,所述处理还继续进行到元素448,在元素448,对预提取的与空间占用区相对应的高速缓存块进行预解码,然后,在元素449,从预提取的高速缓存块取出任何条件分支,并且将这些条件分支存储在BTB预提取缓冲器(图1中的116)中,或者直接存储在C-BTB中。因此,C-BTB根据最近遇到的无条件分支的分支目标被动态地更新。这使得可以通过使BTB容量的大部分专用于全局控制流程(无条件分支)、而且还促使有可能在具有比U-BTB少的条目的C-BTB中将被迫切地执行的条件分支可用来更高效地使用有限的BTB容量。
如果元素420处的BTB命中是RIB命中,而不是U-BTB命中或C-BTB命中,则所述处理从元素420转到元素450,然后转到元素452,在元素452,访问RAS 218以确定与函数调用相对应的基本块的返回地址。一旦返回地址已经被确定,它就被用于更新PC,并且所述处理继续进行到元素452,在元素452,针对给定的基本块,经由U-BTB条目362访问返回占用区(或者等同地,返回调用占用区)。一旦返回占用区362f已经被访问,这就被用于在元素444、从LLC或下级存储器预提取与该占用区相对应的块,然后被用于以下两个操作:(i)在元素446,将返回占用区指令预提取到L1-I中;以及(ii)在448,对返回占用区的预提取的高速缓存块进行预解码,并且在元素449,从它们取出条件分支,并且将这些取出的条件分支存储在C-BTB 354中。
如果在元素420,在元素460确定BTB命中在C-BTB 354中,而不是在U-BTB或RIB中,则所述处理直接继续进行到元素470,在元素470,将用于与命中相对应的基本块的指令地址插入到FTQ中,并且相应地更新PC。
在以下文本中提供根据本技术的根据基于BTB电路系统的分支预测的例子的另外的方面和特征,以下文本包括仿真结果的描述,这些仿真结果评估本技术的用于执行若干个不同的程序应用并且考虑对于根据本技术的基于分支预测的BTB预填写的若干个可替代的控制流程递送机制的性能。在以下描述中和相关联的附图中的一些附图中,本技术的一个示例实现被表示为作为标签的“Shotgun”,以便参考。与发出图1的BTB未命中探针115来预填充BTB和填充BTB未命中缓冲器172相对应的相关技术可以被称为“Boomerang”。
在以下文本中论及的标号在总结仿真结果之后、在图16的描述的末尾被列在一起,并且用方括号来指示。
“Shotgun”是本技术的非限制性例子。
前端瓶颈在服务器工作负荷中由于它们的深层软件堆栈和大型指令工作集,是得到确认的问题。尽管对于有效的L1-I和BTB预提取有多年的研究,但是最先进的技术迫使性能和元数据存储成本之间权衡。本描述引入了“Shotgun”(本技术),由可以维护应用的指令占用区的逻辑图的新的BTB组织提供技术支持的BTB引导的前端预提取器,这使得能够以低存储成本实现高功效预提取。为了映射作用的代码区域,Shotgun在一些例子中可以精确地跟踪应用的全局控制流程(例如,函数和陷阱例程进入点),并且总结每个代码区域内的局部控制流程。因为局部控制流程喜欢高空间局部性,其中大多数函数由少量指令高速缓存块组成,所以它适宜于基于紧凑区域的编码。同时,全局控制流程自然由应用的无条件分支工作集(调用、返回、陷阱)捕捉。基于这些见解,Shotgun将其BTB容量的大部分专用于负责全局控制流程的分支和它们的目标区域的空间编码。通过有效地捕捉应用在BTB中的指令占用区的映射,Shotgun使得能够非常高效地进行BTB引导的预提取。使用等同于常规BTB的存储预算,Shotgun在一组变化的商业工作负荷上比最先进的BTB引导的前端预提取器强多达14%。相对于与条件分支指令相对应的信息的存储,Shotgun优先在BTB中存储与无条件分支指令相对应的信息。Shotgun可以提供用于无条件分支指令和条件分支指令的专用BTB,或者可以可替代地实现与无条件分支指令相对应的信息在还存储与条件分支指令相对应的信息的BTB中的优先存储。
1.引言
传统的和新兴的服务器工作负荷的特征是源于深层软件堆栈的大型指令工作集。命中现代的服务器堆栈的用户请求可能经过web服务器、数据库、客户脚本、登录和监视代码、以及内核中的存储和网络I/O路径。根据服务,即使是简单的请求在触及数个MB的代码时也可能花费数十毫秒完成。
深层堆栈和它们的大的代码占用区可以容易地击败由于所谓的“前端瓶颈”、减弱服务器性能的私人指令高速缓存(L1-I)和分支预测结构。具体地说,指令高速缓存未命中可以使内核暴露于数十个周期的暂停时间,如果从最后一级高速缓存(LLC)被填写的话。同时,分支目标缓冲(BTB)未命中可能导致不可预测的控制流程转移,这在未命中推测被发现时触发流水线冲洗。
服务器中的前端瓶颈是得到确认的问题,第一个特征是晚90s[1、11、14]。多年来,该问题一直持续存在;事实上,根据来自Google[8]的最近的研究,由于商业服务器堆栈中的指令工作集大小继续扩大,它变得糟糕。作为该趋势的一个例子,Google研究调查了其多MB指令占用区一直以27%的按年计算的速率扩大的web搜索工作负荷,该速率在它们的研究的过程期间翻倍[8]。
Microarchitecture研究者近年来已经提出了若干个指令[4、5、12、15、17]和BTB[2、3]预提取器来减轻服务器中的前端瓶颈。最先进的预提取器依赖于时间流传输[5]来记录和重放指令高速缓存或BTB访问流。虽然非常有效,但是每个预提取器对于每一个内核都需要数十万个字节的元数据存储。最近的时间流传输研究一直集中于降低存储成本[9、10、12];然而,即使利用优化,对于运行几个合并的工作负荷的多核CMP,总的预提取器存储要求可能达到兆字节。
为了克服时间流传输的压倒性的元数据存储成本,最近的缓解前端瓶颈的工作利用提取引导的指令预提取(FDIP)[15],并且利用统一的预提取将它扩展到BTB中[13]。被称为Boomerang的方案在预提取路径上发现BTB未命中,并且通过提取适当的高速缓存块并提取必要的分支目标元数据来填写它们。
虽然Boomerang通过利用现有的核内结构(BTB和分支方向预测器)使预提取器成本降至几乎为零,但是它对于具有非常大的指令工作集的工作负荷具有有限的有效性。这样的工作负荷导致降低Boomerang的有效性的频繁的BTB未命中,因为每当BTB未命中正被解决以揭露随后的控制流程时,指令预提取就暂停。结果,Boomerang在具有最大的指令工作集的工作负荷上捕捉理想的前端预提取器的机会的小于50%的机会。
该工作解决了Boomerang的关键限制,该限制是有限容量的BTB根本不能跟踪足够大的控制流程工作集以保证有效的指令预提取。我们的解决方案由软件行为引导。具体地说,我们观察到当代软件被结构化为小函数的集合;在每个函数内,对于组成指令高速缓存块,存在高的空间局部性。短偏移条件分支操纵这些块之间的局部控制流程,而长偏移无条件分支(例如,调用、返回),将全局控制流程从一个函数驱动到另一个函数。
使用该直观的理解,我们提出了关键的见解,即,应用的指令占用区可以被映射为其无条件分支工作集和对于每个无条件分支、分支目标周围的高速缓存块的空间编码的组合。无条件分支和它们的对应的空间占用区的组合有效地对应用的在函数和每个函数内的指令高速缓存工作集上的控制流程进行编码。
基于这些见解,该工作引入了Shotgun,由专门用于有效预提取的新的BTB组织提供技术支持的BTB引导的前端预提取器。Shotgun将其BTB容量的大部分专用于无条件分支和它们的目标的空间占用区。使用该信息,Shotgun能够以高速缓存块粒度跟踪应用的指令工作集,这使得能够准确地且及时地进行BTB引导的预提取。而且,因为无条件分支仅包括应用的整个分支工作集的小部分,所以它们可以在实际大小的BTB中被有效地捕捉。同时,条件分支是在单独的小容量BTB中维护。通过利用先前的在指令和BTB工作集中的控制流程共性上的观察[10],Shotgun通过对通过使用空间占用区带入到L1-I中的高速缓存行进行预解码来预提取到条件分支BTB中。在这样做时,Shotgun在条件分支BTB中实现了高命中速率,尽管条件分支BTB的大小很小。
使用不同的一组服务器工作负荷,我们做出以下贡献:
-证实有限的BTB容量在现有的BTB引导的预提取器中及时地阻止指令预提取。这需要可以以有限的存储预算映射应用的指令工作集的较大部分的BTB组织。
-表明局部控制流程具有高的空间局部性和小的高速缓存占用区。给定无条件分支的目标,平均来说,80%以上的随后的访问(在下一个无条件分支之前)将块高速缓存在目标的10个块内。该观察使得能够实现代码区域的紧凑的空间编码。
-提出了新的BTB组织,在该BTB组织中,容量的大多数专用于操纵全局控制流程的无条件分支、以及它们的区域的空间编码的占用区。
通过紧凑地对整个代码区域的占用区进行编码,所提出的组织避免了跟踪这些区域内部的大量条件分支以发现它们的指令高速缓存工作集的需要。
-引入了Shotgun,由所提出的BTB组织提供技术支持的统一的指令高速缓存和BTB预提取器。通过在固定的BTB存储预算内跟踪应用的指令占用区的更大部分,Shotgun比最先进的BTB引导的前端预提取器(Boomerang)强多达14%。
2.背景
2.1时间流传输预提取
过去十年里,时间流传输[5]一直是用于对于服务器的前端预提取的主导技术。时间流传输背后的关键的原理是记录控制流程访问或未命中序列、随后重放它们以预提取必要的状态。总体构思已经被应用于指令高速缓存[6]和BTB[3]预提取这二者,并且显示对于消除这些结构中的未命中是非常有效的。
时间流传输的主要缺点是需要存储用于捕捉控制流程历史的大量元数据(每一个内核,数百个千字节)[3、6]。为了降低成本,两种互补的技术已经被提出。第一种技术是在执行共同的工作负荷的所有内核上共享元数据[9]。第二种技术是使用一个统一元数据集既用于指令高速缓存、又用于BTB预提取,从而避免维护两个单独的控制流程历史的成本和复杂度[10]。统一前端预提取背后的关键的见解是,可以从包含相关联的分支指令的高速缓存块取出填充BTB必需的元数据。因此,只需要为了指令预提取维护历史,而BTB预提取则在存储方面“自由地”发生。
时间流传输中的最先进的技术将所述两个构思组合为被称为Confluence的统一前端预提取器[10]。Confluence仅维护L1-I历史元数据用于指令和BTB预提取这二者,将它虚拟化到LLC中,并且在执行共同的工作负荷的内核上共享它。虽然有效,但是Confluence对处理器引入了很大程度的成本和复杂度。LLC虚拟化需要侵入性LLC修改,引发用于元数据移动的额外的流量,并且需要系统软件支持来将包含历史元数据的高速缓存行钉扎在LLC中。而且,当工作负荷位于同地时,元数据共享的有效性降低,在这种情况下,每个工作负荷需要它自己的元数据,这与位于同地的工作负荷的数量成比例地减小有效的LLC容量。
2.2 BTB引导的预提取
为了减小由时间流传输预提取器引发的过高的开销,最近的研究已经重新使用了BTB引导的(也被称为提取引导的)指令预提取的构思[15]。基本构思是利用BTB来发现未来的分支、使用分支方向预测器来预测条件分支、并且产生用于预提取到L1-I中的未来的指令地址的流。BTB引导的预提取的关键优点是,除了BTB和分支方向预测器(这二者已经存在于现代的服务器内核中)之外,它不需要任何元数据存储。
BTB引导的预提取上的最初的工作限于指令的预提取。最近的工作已经通过在被称为Boomerang[13]的技术中添加BTB预提取能力,解决了该限制。Boomerang使用基本块定向的BTB来检测BTB未命中,它然后通过从存储器分层结构提取必要的高速缓存行并且对这些高速缓存行进行解码来填写这些BTB未命中。通过在不引入新的存储的情况下添加BTB预提取能力,Boomerang使得能够以与基准内核相比几乎为零的硬件成本实现统一的前端预提取器。
虽然对具有较少的指令工作集的工作负荷非常有效,但是当指令工作集特别大时,Boomerang的有效性降低。这样的工作负荷中的分支占用区可以容易地超过典型的BTB的容量一个数量级,这导致频繁的BTB未命中。每当每个BTB未命中发生时,Boomerang暂停指令预提取来解决未命中和揭露随后的控制流程。当作用的分支工作集比BTB容量大得多时,BTB将颠簸,每当控制流程转移到不在BTB中的代码区域时,这都导致一连串未命中。这样的一系列BTB未命中由于频繁地不被解决的控制流程,阻碍了Boomerang发出指令高速缓存预提取的能力。因此,Boomerang的有效性与其捕捉BTB中的控制流程的能力紧密相关。
2.3竞争分析
图5比较最先进的时间流传输(Confluence)与BTB引导的(Boomerang)预提取器的性能。整个工作负荷和仿真参数可以在第5节中找到。如该图所示,对具有较小的指令工作集的工作负荷(诸如Nutch和Zeus),Boomerang通过避免Confluence依赖于元数据访问的LLC来匹配或强于Confluence。在Confluence中,这些访问的延时显露在每个L1-I未命中上,这重置预提取器,并且引发与LLC的往返以在预提取可以重新开始之前提取新的历史。
相反,对具有较大的指令工作集的工作负荷(诸如Oracle和DB2),分别地,Confluence效果好于Boomerang14%和9%。对这些工作负荷,Boomerang在评估套件中经历当中的最高的BTB未命中速率(参见表1),如前一节中所说明的,这降低了预提取有效性。
表1
工作负荷 MPKI
Nutch 2.5
Streaming 14.5
Apache 23.7
Zeus 14.6
Oracle 45.1
DB2 40.2
考虑到较大的代码基和较深的调用堆栈的方向上的软件趋势点[8],需要可以即使是对于最大的指令工作集、也可以使得能够实现预提取、而不引发过高的存储成本和复杂度成本的更好的控制流程递送架构。
3.BTB:代码满足硬件
为了使BTB引导的预提取的有效性最大化,我们接着研究软件行为和BTB之间的相互影响。
3.1理解控制流程
应用代码通常被组织为函数集合以提高代码可重用性和生产率。函数体本身可以被认为是跨越少数相邻的高速缓存块的连续的代码区域,因为小函数受到模块化设计和软件工程原理的青睐。为了实现期望的功能性,通过函数调用、系统调用和对应的返回指令在不同的代码区域之间操纵执行;共同地,我们将这些称为全局控制流程。同时,局部控制流程使用条件分支和直通(下一个顺序指令)执行的组合来指导在代码区域内的执行。
图2示出三个代码区域和两种类型的控制流程的卡通例子。在所述区域之间转移执行的全局控制流程用实线箭头描绘,这些实线箭头对应于“call”和“return”指令。同时,由于代码区域内的条件分支而导致的局部控制流程转移用虚线箭头示出。
局部控制流程趋向于具有高的空间局部性,因为代码区域内部的指令一般被存储在相邻的高速缓存块中。此外,引导局部控制流程的条件分支趋向于具有非常短的移位,通常在几个高速缓存块内[13],如图2中的虚线箭头所示。因此,即使是对于较大的函数,在函数内访问的指令高速缓存块集中存在高的空间局部性。
图6量化一组服务器工作负荷的空间局部性。该图示出访问高速缓存块的概率相对于其与到代码区域的进入点的距离,其中代码区域被定义为按动态的程序次序跨越两个无条件分支(区域进入点和退出点)的高速缓存块集。如该图所示,区域趋向于很小且具有高的空间局部性:所有的访问的90%在区域进入点的10个高速缓存块内发生。
最后,我们证实服务器工作负荷的总的分支工作集大,但是无条件分支工作集相对较小。如图7所示,对于Oracle,即使是通过跟踪8K个最热的静态分支,容纳所有的动态分支的90%也是不可能的。就2K个条目的实际大小的BTB而言,Oracle的动态分支中只有65%可以被覆盖。同时,负责全局控制流程的无条件分支工作集是相当适度的,因为引导代码区域内的应用逻辑的条件分支占主导。在Oracle上,2K条目BTB可以捕捉所有的动态发生的无条件分支的84%;将容量增大到2.75K可以覆盖动态的无条件分支执行的90%。趋势对DB2工作负荷上类似的,对于DB2工作负荷,2K个最热的静态分支只可以覆盖总的动态分支的75%,而相同数量的最热的无条件分支覆盖无条件动态分支的92%。
3.2对于BTB引导的预提取的影响
BTB引导的预提取器依赖于BTB来发现其他的顺序的代码段之间的控制流程转移点。正确地识别这些转移点对于准确的且及时的预提取是必不可少的。不幸的是,服务器工作负荷中的大的分支工作集引起频繁的BTB未命中。现有的BTB引导的预提取器以两种方式中的一种方式处理BTB未命中:
1)最初的FDIP技术[15]通过未命中推测当分支没有被检测到时有效地提取直线代码;然而,如果未命中分支是将执行重定向到新的代码区域的全局控制流程转移,则这是无效的。
2)最新近的提议Boomerang暂停预提取,并且通过探测高速缓存分层结构来解决BTB未命中。虽然对于避免由BTB未命中引起的流水线冲洗是有效的,但是如第2.2节中所说明的,Boomerang在面对代码区域内部的一系列BTB未命中时,在其发出指令预提取的能力上是有限的。
我们因此推断,有效的BTB引导的预提取涉及两个元素:(1)识别全局控制流程转移点,以及(2)畅通无阻地快速遍历局部代码区域。现有的BTB引导的预提取器只能够以这些目标中的另一个目标为代价实现这些目标中的一个目标。下一节将描述促使这两个目的的新的BTB组织。
4.Shotgun
Shotgun是统一的BTB引导的指令高速缓存和BTB预提取器。其关键创新是使用BTB来使用来自第3节的软件见解来维护程序的指令占用区的逻辑图。该图使得Shotgun在停在正确的预提取路径上时可以引发较少的BTB相关的暂停,从而克服现有的BTB引导的预提取器的关键限制。
Shotgun使其BTB容量的大部分专用于跟踪全局控制流程;这通过明确指出区域间控制流程转移的无条件分支来捕捉。对于每个无条件分支,Shotgun维护紧凑的元数据来跟踪目标区域的空间占用区,这使得能够批量地预提取该区域内的高速缓存块。相反,现有的BTB引导的预提取器必须通过一次查询BTB一个分支来发现区域内的控制流程。因为无条件分支表示动态分支工作集的小部分,并且因为空间占用区总结整个高速缓存块(很少)、而不是单个的分支(很多)的位置,所以Shotgun能够以相同的存储预算跟踪比传统的BTB多得多的指令占用区。
4.1设计概述
Shotgun依赖于专门的BTB组织,该BTB组织审慎地使用有限的BTB容量来使BTB引导的预提取的有效性最大化。Shotgun将整个BTB存储预算划分为用于捕捉全局控制流程和局部控制流程的专用BTB。全局控制流程主要是在U-BTB中维护,U-BTB跟踪无条件分支工作集,并且还存储这些分支的目标周围的空间占用区。U-BTB是Shotgun的心脏,并且驱动指令预提取引擎。条件分支是在C-BTB中维护,C-BTB仅由几百个条目组成以跟踪当前作用的代码区域内的局部控制流程。最后,Shotgun使用被称为返回指令缓冲器(RIB)的第三个结构来跟踪返回指令;虽然在技术上是全局(无条件)分支工作集的一部分,但是返回使用远少于其他无条件分支的BTB元数据,所以将它们分配给单独的结构使得可以审慎地使用有限的BTB存储预算。图3A示出三个BTB和它们中的每个中的每一条目元数据。
对于L1-I预提取,Shotgun如下扩展Boomerang来利用单独的BTB和空间占用区:每当Shotgun遇到无条件分支时,它从U-BTB读取目标区域的空间占用区,并且对于对应的高速缓存块发出预提取探针。为了填写BTB,Shotgun通过合并来自Boomerang[13]和Confluence[10]这二者的特征来采用混合方法。具体地说,在从LLC预提取指令块时,Shotgun利用Confluence的前瞻性BTB填写机制来对预提取的块进行预解码并且在条目被访问之前填写BTB。如果BTB未命中被前端遇到,尽管有前瞻性填写机制,则使用Boomerang的从存储器分层结构提取相关联的高速缓存块的反应性BTB填写机制来解决该BTB未命中,并且取出必要的分支元数据。
4.2设计细节
4.2.1 BTB组织
我们现在详细描述图3A中示出的Shotgun的三个BTB的微型架构。
无条件分支BTB(U-BTB):U-BTB跟踪无条件分支工作集、用于目标的空间占用区、以及当适用时、这些分支的返回区域。因为无条件分支和它们的空间占用区对于预提取是关键的,则Shotgun将总的BTB存储预算的大部分专用于U-BTB。
如图3A所示的每个U-BTB条目由以下字段组成:
标签:分支身份。
大小:包含分支的基本块的大小(比如Boomerang,Shotgun使用基本块定向的BTB[20])。{这里,基本块意指以分支指令结束的直行指令序列;与常规的定义略微不同的是单进入单退出直线代码}。
类型:分支指令的类型(调用、跳转等)
目标:分支指令的目标地址。
调用占用区:用于调用的目标区域或无条件跳转指令的空间占用区。
返回占用区:如接着说明的用于返回指令的目标区域的空间占用区。
因为可以从不同的地点调用函数,所以与返回指令相关联的占用区是调用地点相关的。同时,对于每个返回指令可能跟踪许多个占用区是不切实际的。为了解决该难题,Shotgun利用简单的观察,即,返回的特定实例的目标区域事实上是前一次调用的落空区域(紧接着调用之后的静态代码区域)。因此,Shotgun将返回区域的空间占用区与U-BTB中的对应的调用指令的条目相关联。为了支持该设计,每个U-BTB条目可以维护两个空间占用区;一个用于调用的目标区域,另一个用于返回区域。
返回指令缓冲器(RIB):Shotgun利用专用的存储结构RIB来跟踪与函数返回和陷阱返回相对应的返回指令。将返回与其他无条件分支一起存储在U-BTB中将导致严重的存储利用不足,因为U-BTB条目空间的大部分对于返回不是需要的。例如,返回从返回地址堆栈(RAS)、而不是U-BTB条目的目标字段读取它们的目标地址。类似地,如以上所讨论的,用于返回目标区域的空间占用区与对应的调用一起存储。这些字段(目标、调用占用区和返回占用区)共同占U-BTB条目存储的大于50%。这样的空间利用不足的影响是显著的,因为返回占据U-BTB条目的大部分。实际上,我们的研究表明,U-BTB条目的25%被返回指令占据,因此导致存储效率低下。注意,就常规的BTB而言,将返回指令分配到BTB中不会导致效率非常低下,因为BTB条目的70%以上被条件分支占据,而返回负责所有的条目的少于10%。
这些观察促进Shotgun使用专用的RIB结构来跟踪返回指令。如图3A所示,每个RIB条目只包含(1)标签、(2)类型和(3)大小字段。与U-BTB条目相比,在RIB条目中没有目标、调用占用区和返回占用区字段。因此,通过只存储必要的且足够的元数据来跟踪返回指令,RIB避免浪费U-BTB容量。
条件分支BTB(C-BTB):Shotgun合并小的C-BTB来跟踪当前作用的代码区域的局部控制流程(条件分支)。如图3A所示,C-BTB条目由(1)标签、(2)大小、(3)方向和(4)目标字段组成。C-BTB条目不包含分支类型字段,因为所有的分支都是条件的。如在第4.2.3节中所说明的,Shotgun通过利用空间占用区来积极地预提取到C-BTB中,这在只有几百个条目的容量的C-BTB中提供高的命中速率。
4.2.2记录空间占用区
Shotgun监视撤离指令流以记录空间占用区。因为无条件分支表示代码区域的进入点,所以Shotgun在遇到撤离流中的无条件分支时开始记录新的空间占用区。随后,它跟踪后面的指令的高速缓存块地址,并且将它们添加到占用区,如果还未存在的话。对于代码区域的空间占用区记录在遇到指示进入不同代码区域的入口的后一个无条件分支时终止。一旦记录终止,Shotgun就将占用区存储在与触发该记录的无条件分支相对应的U-BTB条目中。
空间占用区格式:记录空间占用区的单纯的方法将是记录在代码区域内部被访问的所有的高速缓存块的整个地址。显然,由于存储整个高速缓存块地址的空间要求,该方法将导致过大的存储开销。存储高效的替代方案将是只记录区域的进入点和退出点,并且稍后预提取这些点之间的所有的高速缓存块。然而,因为区域中的所有块在执行期间并不都被访问,所以预提取整个区域将导致过度预提取,这可能导致片上网络拥塞和高速缓存污染。
为了既实现精度、又实现存储效率,Shotgun利用以下见解,即,如第3节中所讨论的,代码区域内部的访问是以目标块(该区域中被访问的第一个块)为中心的。为了利用目标块周围的高的空间局部性,Shotgun使用短的位矢量来记录空间占用区,其中每个位对应于高速缓存块。所述矢量中的位位置表示离目标块的相对距离,位值(1或0)指示对应的块在所述区域的最后一次执行期间是否被访问。因此,通过每一个高速缓存块使用单个位,Shotgun大大地降低了存储要求,同时避免了过度预提取。
4.2.3利用Shotgun预提取
类似于FDIP[15],Shotgun还利用如图3A所示的提取目标队列(FTQ)来保存分支预测单元产生的提取地址。这些地址后来被提取引擎消耗用来提取对应的指令并且将这些指令馈送给内核后端。为了填写FTQ,Shotgun的分支预测单元并行地查询所有三个BTB(U-BTB、C-BTB和RIB)。如果在BTB中的任何一个中存在命中,则适当的提取地址被插入到FTQ中。因为这些地址最终将被用于从L1-I提取指令,所以它们表示自然的预提取候选。因此,像FDIP那样,Shotgun通过当提取地址被插入到FTQ中时、遍历它们扫描并且对于对应的L1-I块发出预提取探针来充分利用该机会。
在U-BTB或RIB命中时,Shotgun还读取目标代码区域的空间占用区以对于适当的高速缓存块发出L1-I预提取探针。访问空间占用区对于U-BTB命中是简单的,因为它是直接从对应的U-BTB条目的调用占用区字段读取的。然而,所述机制在RIB命中时略微更多地涉及,因为空间占用区(当被可选地使用时)没有被存储在RIB中,相反,被存储在对应调用的U-BTB条目中。为了找到该U-BTB条目,我们扩展RAS,以使得在调用上,除了通常被推送到RAS上的返回地址之外,包含该调用的基本块的地址也被推送。{因为Shotgun使用基本块定向的BTB,所以它是基本块地址,而不是与存储在RAS上的调用指令相对应的PC。}因为RAS通常包含少数条目(8个到32个是常见的),所以支持Shotgun的附加的RAS存储成本是可忽略不计的。在对于返回指令发生RIB命中时,Shotgun从RAS弹出相关联的调用的基本块地址来给U-BTB编索引并且从返回占用区字段检索空间占用区。
除了使用空间占用区来将指令预提取到L1-I中之外,Shotgun还利用控制流程共性[10]来还预提取到C-BTB中。因此,当预提取的块到达L1-I时,Shotgun使用一组预解码器来从它们取出分支元数据,并且在访问流之前使用它来填充C-BTB。通过经由空间占用区预计即将来到的指令工作集,并且经由预解码将其相关联的分支工作集预提取到C-BTB中,Shotgun提供非常小、但还非常有效的C-BTB。
图3A示出在U-BTB命中时使用空间占用区用于L1-I和C-BTB预提取的工作例子。Shotgun首先从U-BTB条目读取目标地址“A”和调用占用区“01001000”。它然后对于L1-I产生对于目标块“A”、以及基于U-BTB条目中的调用占用区、对于高速缓存块“A+2”和“A+5”的预提取探针(步骤{1})。如果在L1-I中没有找到这些块中的任何一个,则Shotgun发出对于LLC的预提取请求(一个或多个)(步骤{2})。一旦预提取的块从LLC到达,则它们被安装在L1-I中(步骤{3}),并且还被转发给预解码器(步骤{4})。预解码器从预提取的块取出条件分支,并且将它们插入到C-BTB中(步骤{5})。
如果Shotgun在所有三个BTB中都检测到未命中,则它调用Boomerang的BTB填写机制来以以下方式解决未命中:首先,从L1-I或者从高速缓存下级访问与未命中的分支相对应的指令块,如果不存在于L1-I中的话。所述块然后被馈送给预解码器,预解码器取出未命中分支,并且根据分支类型将它存储到BTB中的一个中。预解码的分支的其余部分被存储在BTB预提取缓冲器[13]中。在对于BTB预提取缓冲器命中时,访问的分支基于分支类型被移动到适当的BTB。
4.3讨论
类似于Shotgun,两种以前提出的技术,pTask[7]和(RDIP)[12],也利用全局控制流程信息来进行预提取;但是不同于Shotgun,它们仅以L1-I未命中为目标。而且,pTask仅在OS上下文切换时发起预提取,并且需要软件支持。RDIP更接近于Shotgun,因为它还利用RAS捕捉的全局程序上下文来进行预提取。然而,在这两种方法之间存在重要的差异。首先,RDIP为了及时地预提取,仅基于当前的上下文来预测未来的程序上下文(下一个调用/返回指令)。该方法在预测未来的执行路径时忽视局部控制流程,这自然限制了准确性。另一方面,Shotgun预测每一个分支来找出即将来到的代码区域。因此,Shotgun对于发现未来的代码区域和L1-I访问更加准确。第二,RDIP仅以总的前端瓶颈的一部分为目标,因为它仅预提取L1-I块,但是不预填写BTB。同时,Shotgun提供对于整个问题的有凝聚力的解决方案。最后,RDIP引发高的存储成本,每一个内核64KB,因为它必须维护用于L1-I预提取的专用元数据。相反,Shotgun通常没有附加的存储要求,因为它捕捉全局控制流程和常规的BTB的存储预算内部的空间占用区。
5.方法
5.1仿真基础设施
我们使用Flexus[18](全系统多处理器仿真器)来在图8中的表2中列出的一组企业和开放源向外扩展应用上评估Shotgun。对SPARC v9 ISA进行建模的Flexus利用乱序(OoO)内核、存储器分层结构和片上互连来扩展Simics函数仿真器。我们使用SMARTS[19]多处理器采样方法来进行采样的执行。对于每个应用,在320亿个采样(每一个内核,20亿个)上抽取采样。在每个采样点,我们开始从检查点循环准确的仿真,所述检查点包括由高速缓存、BTB、分支预测器和预提取历史表组成的整个架构和部分微型结构状态。我们在100K个周期内预热系统,并且在下一个50K个周期上收集统计数据。我们使用应用指令的数量与总周期数(包括花费执行操作系统内核的周期)的比率来测量性能。该度量已经被表明是服务器吞吐量的准确测度[18]。
我们的建模的处理器是16核平铺式CMP。每个内核是在微型架构上类似于ARMCortex-A57内核的3路乱序。图8中的表3中列出了建模的处理器的微型架构参数。我们采取48位虚拟地址空间。
5.2控制流程递送机制
我们比较以下最先进的控制流程递送机制的功效和存储开销。
Confluence:Confluence是使用统一的元数据来预提取到L1-I和BTB这二者中的最先进的时间流传输预提取器[10]。为了进一步降低元数据存储成本,Confluence使用SHIFT将历史元数据虚拟化到LLC中[9]。我们将Confluence建模为增加16K条目BTB的SHIFT,SHIFT被示为对Confluence的性能提供充足的上界[10]。为了提供高的L1-I和BTB未命中覆盖,Confluence至少需要32K条目指令历史和8K条目索引表,这导致存储开销高。此外,它对处理器添加了显著的复杂性,因为它需要LLC标签扩展、有效的LLC容量的减小、元数据高速缓存行在LLC中的钉扎、以及相关联的系统软件支持,这使它成为如以前的工作[13]中所示的昂贵的提议。用于存储索引表的LLC标签阵列扩展花费240KB的存储开销,而用于每个位于同地的工作负荷的历史表需要从LLC容量留出的204KB的容量。
Boomerang:如第2.2节中所描述的,Boomerang利用FDIP来进行L1-I预提取,并且利用BTB预填写来增补它。像FDIP那样,Boomerang利用32条目提取目标队列(FTQ)来在指令地址被提取引擎消耗之前缓冲它们。我们利用2K条目、基本块定向的BTB来评估Boomerang。每个BTB条目由37位标签、46位目标地址、用于基本块大小的5个位、用于分支类型(条件的、无条件的、调用、返回和陷阱返回)的3个字节、以及用于条件分支方向预测的2个位组成。总计,每个BTB条目可以包括93个位,这些位导致23.25KB的总的BTB存储成本。此外,我们的评估的Boomerang设计利用32条目BTB预提取缓冲器。
Shotgun:如第4.2节中所描述的,Shotgun使用专用的BTB用于无条件分支、条件分支和返回。为了公平地与Boomerang进行比较,我们使Shotgun中的所有的BTB组件的组合的存储预算限于与Boomerang的2K条目BTB的存储成本相同。像Boomerang那样,Shotgun还利用32条目FTQ和32条目BTB预提取缓冲器。
U-BTB存储成本:我们评估占Shotgun的BTB存储预算的大部分的1.5K(1536)条目U-BTB。每个U-BTB条目由38位标签、46位目标、用于基本块大小的5个位、以及用于分支类型(无条件的或调用)的1个位组成。此外,每个U-BTB条目还由用于存储空间占用区的两个8位矢量组成。在每个空间占用区中,所述8个位中的6个位被用于跟踪目标块后面的高速缓存块,其他两个位被用于目标块前面的块。总的来说,每个U-BTB条目花费106个位,这导致19.87KB的总存储。
C-BTB存储成本:因为Shotgun从经由U-BTB的空间占用区预提取的L1-I块填写C-BTB,所以整个BTB存储的小部分被分配了C-BTB。我们对128条目C-BTB进行建模,其中每个C-BTB条目由41位标签、22位目标偏移、用于基本块大小的5个位、以及用于条件分支方向预测的2个位组成。注意,只有22位目标偏移是需要的,而不是整个46位目标地址,因为条件分支总是使用PC相对偏移,并且SPARC v9 ISA使偏移限于22位。此外,因为C-BTB只存储条件分支,所以分支类型字段是不需要的。总的来说,128条目C-BTB对应于1.1KB的存储。
RIB存储成本:我们对512条目RIB进行建模,其中每个条目包含39位标签、用于基本块大小的5个位、以及用于分支类型(返回或陷阱返回)的1个位。因为返回指令从RAS得到它们的目标,所以RIB不存储目标地址(第4.2节)。在每一个RIB条目45个位的情况下,512条目RIB使用2.8KB的存储。
总计:U-BTB、C-BTB和RIB的组合的存储成本为23.77KB。
6评估
在本节中,我们首先评估Shotgun(即,本技术)对于消除前端暂停周期的有效性、以及与时间流传输(Confluence)和BTB引导的(Boomerang)控制流程递送机制相比的对应性能增益。接着,我们评估在Shotgun的微型架构设计中采取的关键设计决策:我们从评定空间占用区在前端预提取中的影响开始;我们然后分析使用小的C-BTB对Shotgun的性能的影响;最后,我们呈现对于BTB存储预算的敏感度研究。
6.1前端暂停周期覆盖
为了评定不同的预提取机制的功效,我们在图9中呈现被它们中的每个覆盖的前端暂停周期的数量。注意,代替使用更常见的“被覆盖的未命中”度量,我们使用“被覆盖的暂停周期”;这样,我们可以精确地捕捉“飞行中预提取”的影响:已经被发出的预提取,但是被请求的块在被提取单元需要时尚未到达L1-I中。此外,我们仅考虑正确的执行路径上的暂停周期,因为错误路径暂停不影响性能。
平均来说,如图9所示,Shotgun覆盖通过无预提取基准经历的暂停周期的68%;这比Boomerang和Confluence中的每个好8%。更为仔细的检查揭示Shotgun在所有的工作负荷上强于其直接的竞争对手Boomerang;具体地说,Shotgun在DB2和Streaming中的每个上提供大于10%覆盖改进,并且在Oracle上8%以上——这些工作负荷具有高的BTB MPKI,Shotgun旨在减轻其对前端性能的影响。Shotgun的改进的覆盖是经由U-BTB的空间占用区的不间断的L1-I预提取的直接后果;相反,Boomerang必须等待解决BTB未命中。
与Confluence相比,Shotgun在六个工作负荷中的四个上提供更好的暂停覆盖。更为仔细的检查揭示,Shotgun在Apache、Nutch和Streaming上以16%-19%的附加覆盖全面强于Confluence。如Kumar等人[13]也指出的,由于为了加载历史元数据而频繁地访问LLC,Confluence在这些应用上的性能不佳。在L1-I访问序列中的每一次未命中预测时,Confluence在开始在正确的路径上发出预提取之前需要从LLC加载正确的序列。在每个新的序列上发出预提取中的这个启动延迟有损于Confluence的覆盖。
在具有最高的BTB MPKI的工作负荷(DB2和Oracle)上,Shotgun在DB2上在Confluence的2%内,但是在Oracle上落后10%。如图7所示,Oracle的无条件分支工作集与其他工作负荷相比大得多。最频繁地执行的1.5K无条件分支(等于Shotgun的U-BTB条目的数量)仅覆盖动态无条件分支执行的78%。因此,Shotgun通常进入不被U-BTB覆盖的代码区域,由于没有从其预提取的空间占用区,这限制了覆盖。
6.2性能分析
图10示出对于不同的预先提取机制较于没有任何预提取器的基准的性能改进。性能趋势类似于覆盖趋势(图9),其中Shotgun提供平均来说、较于基准的32%性能改进、以及较于Boomerang和Confluence中的每个的5%改进。较于Boomerang的加速在高的BTB MPKI工作负荷、DB2和Oracle上尤其突出,其中Shotgun分别实现10%和8%改进。
有趣的是,图10示出Shotgun在Nutch、Apache和Zeus工作负荷上较于Boomerang实现相对适度的性能增益,尽管其覆盖改进显著。该行为背后的原因是,这些工作负荷具有相对较低的L1-I MPKI;因此,覆盖改进不转化为成比例的性能改进。类似于覆盖结果,Shotgun在Apache、Nutch、Streaming和Zeus上强于Confluence。此外,它在DB2上比得上Confluence的性能增益;然而,由于较低的暂停周期覆盖,Shotgun在Oracle上比Confluence落后7%。
6.3量化空间占用区的影响
如第4.2.2节中所讨论的,Shotgun以位矢量的形式存储空间区域占用区以降低存储要求,同时避免过度预提取。本节评估空间占用区和它们的存储格式(位矢量)对性能的影响。我们评估以下空间区域预提取机制:(1)无位矢量:不执行任何区域预提取;(2)8位矢量;(3)32位矢量;(4)整个区域:预提取目标区域的进入点和退出点之间的所有的高速缓存块;以及(5)5个块:从目标块开始预提取目标区域中的五个连续的高速缓存块。“5个块”设计点受图6驱使,图6示出被访问的块的80%-90%位于该限值内。总是预提取固定数量的块的益处是,它完全避免了存储元数据用于预提取的需要。
首先,我们集中于暂停周期覆盖和利用不同的位矢量长度的性能。对于不执行区域预提取的无位矢量设计,我们将U-BTB中的条目的数量增加到与8位矢量设计相同的存储预算。然而,对于32位矢量,不是减少U-BTB条目的数量(以在位矢量中占更多的位),而是我们简单地提供容纳更大的位矢量的附加存储。因此,对于32位矢量的结果形成在U-BTB中全局控制流程覆盖与8位矢量设计相同的情况下跟踪较大的空间区域的益处的上界。
如图11和图12所示,8位矢量提供平均来说、与无空间区域预提取相比的6%覆盖和4%性能益处。事实上,没有空间占用区,Shotgun的覆盖仅比Boomerang好2%。利用8位矢量,Shotgun改进每一个工作负荷的性能,与无位矢量相比,在Streaming和DB2上有9%的最大增益。同时,将位矢量长度增加到32位平均来说,较于8位矢量仅提供0.5%性能。这些结果表明,更长的位矢量不提供有利的成本/性能权衡。
其余的空间区域预提取机制,整个区域和5个块,导致与如图12所示的8位矢量相比的性能降低。性能惩罚在高机会工作负荷中的两个中尤其严重:DB2和Streaming。该性能降低是由过度预提取导致的,因为这些机制缺乏关于目标区域内部的哪些块应被预提取的信息。从目标区域总是预提取5个块导致显著的过度预提取和不佳的预提取准确性,如图13所示那样,因为许多区域少于5个块。预提取准确性的降低在Streaming中尤其严重,其中与利用8位矢量降至80%相比,利用5块预提取,降至仅42%。平均来说,8位矢量提供71%准确性,而整个区域和5个块预提取分别仅为56%和43%准确性。过度预提取还增大了片上网络上的压力,这继而增大了有效的LLC访问延时,如图14所示。例如,如该图所示,对于DB2,填写L1-D未命中的平均延时从利用8位矢量的54个周期增大到利用5个块预提取的65个周期。由于过度预提取而导致的不佳的准确性和增大的LLC访问延时的组合影响使得无差别区域预提取没有8位矢量设计那么有效。
6.4对于C-BTB大小的敏感度
如第4节中所讨论的,Shotgun合并小的C-BTB,并且依赖于前瞻性机制和反应性机制这二者来提前填写它。为了测量Shotgun对于预填写C-BTB的有效性,图15呈现对于C-BTB条目的数量的性能敏感度。利用附加条目的任何加速将突出Shotgun未命中的机会。
为了评定Shotgun的有效性,我们比较128条目与1K条目C-BTB的性能。如该图所示,尽管存储中有8x增加,但是1K条目C-BTB平均来说仅实现0.8%改进。该结果验证了我们的设计选择,这证实了更大的C-BTB容量不是有用的。
另一方面,使条目的数量减少到64个导致显著的性能损失,尤其是在Streaming和DB2上,与128条目C-BTB相比,有4%性能降低。平均来说,如图15所示,128条目C-BTB比64条目C-BTB强2%。
6.5对于BTB存储预算的敏感度
我们现在调查BTB存储预算对于评估的BTB引导的预提取器的有效性的影响:Boomerang和Shotgun。我们对于Boomerang将BTB容量从512个条目变为8K个条目,而对于Shotgun,使用相等的存储预算。为了在512条目到4K条目范围内匹配Boomerang的BTB存储预算,我们从第5.2节中呈现的值成比例地缩放U-BTB、RIB和C-BTB中的Shotgun的条目数量。然而,缩放U-BTB条目的数量以与8K条目Boomerang BTB存储匹配将导致6K条目U-BTB,这是过犹不及,因为4K条目U-BTB足以捕捉如图7所示的整个无条件分支工作集。因此,Shotgun使U-BTB条目的数量限于4K,并且扩大RIB和C-BTB以分别存储1K和4K个条目,以利用剩余的预算。根据经验,我们发现这对于8K条目存储预算是优选的Shotgun配置。
图16示出对于Oracle和DB2(对于基于BTB的预提取器特别有挑战性的具有最大的指令占用区的两个工作负荷)的结果。条纹条突出对于基准2K条目BTB的结果。如该图所示,给定相等的存储预算,Shotgun总是强于Boomerang。在Oracle工作负荷上,Shotgun在等于1K条目常规BTB的小的存储预算的情况下,利用8K条目BTB,强于Boomerang(较于无预提取基准的27%对26.3%性能改进)。在DB2上类似地,Boomerang需要比BTB容量多两倍来匹配Shotgun的性能。例如,利用2K条目BTB,Shotgun实现了61.5%加速,而Boomerang利用更大的4K条目BTB仅实现58.9%加速。这些结果表明,Shotgun对于BTB容量的审慎的使用在范围广泛的BTB大小上转化为更高的性能。
总结
服务器工作负荷中的前端瓶颈由于L1-I和BTB中的频繁的未命中,是得到确认的问题。预提取在缓解未命中时是有效的;然而,现有的前端预提取器迫使在覆盖和存储开销之间权衡。
本技术或“Shotgun”包括由新的BTB组织和设计哲理提供技术支持的前端预提取器。Shotgun背后的主要观察是,应用的指令占用区可以被总结为其无条件分支工作集和每个无条件分支的目标周围的空间占用区的组合。前者捕捉全局控制流程(大部分是函数调用和返回),而后者总结局部(函数内)指令高速缓存工作集。基于该见解,Shotgun将其BTB容量的大部分专用于无条件分支和它们的空间占用区。同时,条件分支可以在从预提取的指令高速缓存块填写的、小容量的专用的BTB中维护。在替代例子中,不是提供专用的无条件BTB和条件BTB,单个BTB中的存储可以相对于条件分支指令,优先被分配了无条件分支指令。通过有效地总结BTB中的应用的指令占用区,Shotgun使得能够实现非常有效的BTB引导的预提取器,该预提取器可以大大地抹去无元数据和富含元数据的最先进的预提取器之间的差距。
参考文献
[1]Anastassia Ailamaki,David J.DeWitt,Mark D.Hill和DavidA.Wood.1999.DBMSs on a Modern Processor:Where Does Time Go?.在InternationalConference on Very Large Data Bases.266-277中.
[2]J.Bonanno,A.Collura,D.Lipetz,U.Mayer,B.Prasky和A.Saporito.2013.TwoLevel Bulk Preload Branch Prediction.在International Symposium on High-Performance Computer Architecture.71-82中.
[3]Ioana Burcea和Andreas Moshovos.2009.Phantom-BTB:a virtualizedbranch target buffer design.在Proceedings of the 14th International Conferenceon Architectural Support for Programming Languages and Operating Systems,ASPLOS 2009,Washington,DC,USA,2009年3月7-11日.313-324中.DOI:http://dx.doi.org/10.1145/1508244.1508281
[4]I-Cheng K Chen,Chih-Chieh Lee和Trevor N Mudge.1997.InstructionPrefetching Using Branch Prediction Information.在International Conference onComputer Design.593-601中.
[5]Michael Ferdman,Cansu Kaynak和Babak Falsafi.2011.ProactiveInstruction Fetch.在International Symposium on Microarchitecture.152-162中.
[6]Michael Ferdman,Thomas F.Wenisch,Anastasia Ailamaki,Babak Falsafi和Andreas Moshovos.2008.Temporal Instruction Fetch Streaming.在InternationalSymposium on Microarchitecture.1-10中.
[7]P.Kallurkar和S.R.Sarangi.2016.pTask:A smart prefetching scheme forOS intensive applications.在2016年第49届Annual IEEE/ACM InternationalSymposium on Microarchitecture(MICRO).1-12.DOI:http://dx.doi.org/10.1109/MICRO.2016.7783706中.
[8]Svilen Kanev,Juan Pablo Darago,Kim M.Brooks.2015.Profilling awarehouse-scale computer.在International Symposium on ComputerArchitecture.158-169中.
[9]Cansu Kaynak,Boris Grot和Babak Falsafi.2013.SHIFT:Shared HistoryInstruction Fetch for Lean-Core Server Processors.在International Symposiumon Microarchitecture.272-283中.
[10]Cansu Kaynak,Boris Grot和Babak Falsafi.2015.Confluence:UnifiedInstruction Supply for Scale-Out Servers.在International Symposium onMicroarchitecture.166-177中.
[11]Kimberly Keeton,David A,Patterson,Yong Qiang He,Roger C.Raphael和Walter E.Baker.1998.Performance Characterization of a Quad Pentium Pro SMPusing OLTP Workloads.在International Symposium on Computer Architecture.15-26中.
[12]Aasheesh Kolli,Ali G.Saidi和Thomas F.Wenisch.2013.RDIP:return-address-stack directed instruction prefetching.在第46届Annual IEEE/ACMInternational Symposium on Microarchitecture,MICRO-46,Davis,CA,USA,2013年12月7-11日.260-271中.
[13]Rakesh Kumar,Cheng-Chieh Huang,Boris Grot和VijayNagarajan.2017.Boomerang:A Metadata-Free Architecture for Control FlowDelivery.在2017 IEEE International Symposium on High Performance ComputerArchitecture,HPCA 2017,Austin,TX,USA,2017年2月4-8日.493-504中.
DOI:http://dx.doi.org/10.1109/HPCA.2017.53
[14]Parthasarathy Ranganathan,Kourosh Gharachorloo,Sarita V.Adve和Luiz AndréBarroso.1998.Performance of Database Workloads on Shared-MemorySystems with Out-of-Order Processors.在International Conference onArchitectural Support for Programming Languages and Operating Systems.307-318中.
[15]Glenn Reinman,Brad Calder和Todd Austin.1999.Fetch DirectedInstruction Prefetching.在International Symposium onMicorarchitecture.IEEE.16-27中.
[16]AndréSeznec和Pierre Michaud.2006.A case for(partially)TaggedGeometric history length branch prediction.J.Instruction-Level Parallelism 8(2006).
[17]L.Spracklen,Yuan Chou和S.G.Abraham.2005.Effective InstructionPrefetching in Chip Multiprocessors for Modern Commercial Applications.在第11届International Symposium on High-Performance Computer Architecture.225-236中.
[18]Thomas F.Wenisch,Roland E.Wunderlich,Michael Ferdman,AnastassiaAilamaki,Babak Falsafi和James C.Hoe.2006.SimFlex:Statistical Sampling ofComputer System Simulation.IEEE Micro 26,4(2006),18-31.
[19]Roland E.Wunderlich,Thomas F.Wenisch,Babak Falsafi和JamesC.Hoe.2003.SMARTS:Accelerating Microarchitecture Simulation via RigorousStatistical Sampling.在International Symposium on Computer Architecture.84-95中.
[20]Tse-Yu Yeh和Yale N.Patt.1992.A comprehensive instruction fetchmechanism for a processor supporting speculative execution.在InternationalSymposium on Microarchitecture.129-139中.
例子
以下编号的例子有关本技术。
例子1.一种分支目标缓冲器BTB,用于在计算机程序的机器可读指令序列中存储与控制流程中的相应分支相对应的至少一个BTB条目,所述BTB条目包括:
标签字段,用来与提取地址产生器的程序计数器进行比较以确定所述程序计数器和关于当前存储在所述BTB中的分支指令的信息之间是否存在匹配;以及
至少一个另外的字段,用来存储通过对应的标签字段识别的分支指令的信息特征,所述至少一个另外的字段允许将条件分支与无条件分支指令区分开;
其中所述BTB具有预定的存储容量,并且其中,相对于条件分支指令,无条件分支指令被优先分配了所述BTB中的存储空间。
例子2.例子1的BTB,包括无条件分支目标缓冲器U-BTB和条件分支目标缓冲器C-BTB,所述无条件分支目标缓冲器U-BTB专用于存储无条件分支指令,所述条件分支目标缓冲器C-BTB专用于存储条件分支指令。
例子3.例子1或例子2的BTB,其中所述分支指令是无条件分支指令,并且其中所述BTB的所述至少一个另外的字段包括用来识别对应的无条件分支指令的分支目标地址的目标字段。
例子4.例子3的BTB,其中,所述至少一个另外的字段进一步包括用来识别局部函数的程序指令在存储器中的空间区域的调用占用区字段,其中所述局部函数是位于所述无条件分支指令的分支目标处的指令集。
例子5.例子4的BTB,其中所述BTB条目进一步包括返回占用区字段,所述返回占用区字段在从所述局部函数直到后一个无条件分支指令返回时识别与控制流程相对应的程序指令序列在存储器中的空间占用区。
例子6.例子1至5中的任何一个的BTB,其中所述BTB条目包括指定对应的分支指令的类型的类型字段。
例子7.例子4或例子5的BTB,其中所述调用占用区字段将所述存储器中的包括所述存储器的多个块的代码区域识别为所述局部函数的空间占用区。
例子8.例子7的BTB,其中所述多个块包括以下中的至少一个:高速缓存块、主存储器块或虚拟存储器的块。
例子9.例子4至8中的任何一个的BTB,其中所述调用占用区字段包括占用区矢量,所述占用区矢量具有用于所述空间占用区的多个存储器块中的每个的条目,每个矢量条目指示对应的存储器块在对应的局部函数的前一次执行期间是否被访问。
例子10.例子9的BTB,其中所述占用区矢量元素的至少一个子集表示与所述分支目标块的相对块距离,所述相对距离包括正相对距离和负相对距离中的至少一个。
例子11.例子1至10中的任何一个的BTB,其中所述标签识别包括以分支指令终止的指令序列的指令的基本块,并且其中所述BTB条目包括用来指定以下中的一个中的至少一个的大小字段:通过所述标签识别的基本块中的若干个指令、或通过所述标签识别的基本块中的若干个字节。
例子12.例子1至11中的任何一个的BTB,其中相对于条件分支指令,实施了BTB存储优先分配到无条件分支指令,使得响应于无条件分支的BTB中的命中,将一个或多个BTB条目分配给条件分支,其中被分配BTB存储的条件分支指令对应于与导致所述BTB命中的无条件分支的分支目标相对应的代码区域中的条件分支。
例子13.例子3至5中的任何一个的BTB,其中所述BTB中的对于无条件分支的命中触发了根据分支目标地址预提取存储器区域中的多个程序指令的第1级L1指令高速缓存。
例子14.例子1至3中的任何一个的BTB,其中所述BTB中的对于无条件分支的命中。响应于所述BTB命中,触发预提取分支目标地址区域中的预定数量的连续的存储器块或分支目标地址区域中的预定数量的连续的程序指令的第1级L1指令高速缓存。
例子16.例子13的BTB,其中响应于所述BTB命中,将到目标区域的进入点和所述目标区域的退出点之间的所有的高速缓存块都预提取到L1指令高速缓存。
例子17.例子2的BTB,包括:
返回指令缓冲器RIB,所述返回指令缓冲器RIB具有至少一个RIB条目,所述至少一个RIB条目包括用来识别返回指令的返回标签字段;以及
返回地址堆栈RAS,所述返回地址堆栈RAS用来存储与包含函数调用的基本块的地址相对应的返回地址;
其中所述RIB条目省略用于返回指令的目标地址字段,并且其中所述BTB检索通过所述返回标签字段识别的返回指令、最近推送到所述RAS上的基本块地址,并且使用检索到的基本块地址来对所述U-BTB编索引。
例子18.一种包括例子1至17中的任何一个的分支目标缓冲器的数据处理设备。例子19.例子18在从属于例子2或例子17时的数据处理设备,所述数据处理设备包括:
提取目标队列FTQ,所述提取目标队列FTQ具有用来识别将被提取用于执行的指令序列的多个FTQ条目;
预提取引擎,所述预提取引擎对所述U-BTB或所述RIB中的一个中的BTB命中做出响应,以发出预提取探针来从存储器检索目标区域中与所述BTB命中相对应的一个或多个程序指令以用于存储在指令高速缓存中。
例子20.根据例子19在从属于例子17时的数据处理设备,其中当所述BTB命中为RIB命中时,执行读取操作来读取RAS以确定与先前的函数调用相对应的块地址并且访问与所述块地址相对应的U-BTB条目以确定用于所述RIB命中的空间占用区。
例子21.根据例子19中所述的数据处理设备,其中当所述BTB命中为条件BTB中的、或U-BTB中的、或RIB中的命中时,基于所述BTB的大小字段来填充FTQ。
例子22.根据例子19所述的数据处理设备,其中所述预提取引擎被布置为预提取与通过用于无条件分支指令的BTB条目的占用区字段指定的局部函数的空间占用区相对应的指令,所述空间占用区对应于程序指令在存储器中的位置,所述位置接近于所述无条件分支指令的分支目标。
例子23.根据例子22所述的数据处理设备,包括对预提取的与所述空间占用区相对应的指令进行解码的预解码器。
例子24.根据例子23所述的数据处理设备,其中所述预解码器识别所述空间占用区的解码的预提取的指令中的任一条件分支指令,并且使用识别的条件分支来填充所述BTB。
例子25.根据例子18所述的数据处理设备,其中所述BTB包括U-BTB、C-BTB和RIB,所述U-BTB专用于存储无条件分支指令,所述C-BTB专用于存储条件分支指令,所述RIB具有包括用来识别返回指令的返回标签字段的至少一个RIB条目,并且其中所述BTB基于由提取地址产生器输出的地址来执行U-BTB、C-BTB和RIB的并行查询。
例子26.根据例子25所述的数据处理设备,其中当由于并行查询,遇到BTB未命中时,所述数据处理设备对存储器发出BTB未命中探针以触发BTB填写来解决所述BTB未命中。
例子27.根据例子20所述的数据处理设备,被布置为在所述空间占用区的指令执行之后,基于止用的指令来更新所述空间占用区。
例子28.一种在数据处理设备的分支目标缓冲器BTB中缓冲分支指令的方法,所述方法包括:
将提取地址产生器的程序计数器与BTB条目的标签字段进行比较以确定所述程序计数器和当前存储在所述BTB中的关于分支指令的信息之间是否存在匹配;并且
使用所述BTB条目的至少一个另外的字段来存储通过对应的标签字段识别的分支指令的信息特征,所述至少一个另外的字段允许将条件分支指令与无条件分支指令区分开;并且
相对于对无条件分支指令分配存储空间,优先将所述BTB中的存储空间分配给条件分支指令。
例子29.在暂时性或非暂时性介质上提供的机器可读指令,所述指令在在执行时使至少一个处理器:
将BTB条目的标签字段与提取地址产生器的程序计数器进行比较以确定所述程序计数器和当前存储在所述BTB中的关于分支指令的信息之间是否存在匹配;
使用所述BTB条目的至少一个另外的字段来存储通过对应的标签字段识别的分支指令的信息特征,所述至少一个另外的字段允许将条件分支与无条件分支指令区分开;并且
控制所述BTB的预定存储容量的分配以相对于对无条件分支指令分配存储空间,优先将存储空间分配给条件分支指令。
根据本技术的数据处理设备可以被作为自含单元提供,诸如用于与微处理器一起使用的分支预测和指令预提取单元、或单独供应的组件,或者可以在与一个或多个微处理器相同的集成电路上制作,并且被作为整体单元供应。根据本技术的数据处理设备可以被合并在服务器微处理器中以形成服务器的一部分,或者可以被合并在要么通用的、要么专门的另一类型的微处理器或微控制器中。根据本技术的数据处理设备可以被合并到电子设备中,诸如,举例来说,服务器、工作站、大型计算机、个人计算机、平板计算机、移动电话、用于汽车或任何自主车辆的控制系统、嵌入式系统、家用设备或电器。
可以实现或利用本文中描述的例子的各种技术的一个或多个软件程序或机器可读指令可以用高级过程式或面向对象的编程语言来实现。然而,所述程序(一个或多个)可以可替代地用汇编语言或机器语言来实现。在任何情况下,所述语言可以是汇编语言或解释语言,并且与硬件实现组合。所述程序指令可以在暂时性(例如,传输)或非暂时性(例如,存储)介质或它们的组合上提供。
在设备组件已经被描述为电路系统或单元或引擎等的情况下,该电路系统或电路或引擎等可以是用程序代码配置为执行指定的处理功能的通用处理器电路系统。所述电路系统或单元或引擎等也可以通过对处理硬件做出特定的修改来配置。所述电路系统或单元或引擎等执行指定的功能的配置可以完全用硬件、完全用软件、或者使用硬件修改和软件执行的组合。机器可读指令可以被用于将通用或专用处理电路系统的逻辑门配置为执行指定的处理功能。
设备组件可以被实现为例如包括自定义VLSI电路或门阵列、现成的半导体(诸如逻辑芯片、晶体管或其他分立的组件)的硬件电路。组件也可以在可编程硬件装置(诸如现场可编程门阵列、可编程阵列逻辑、可编程逻辑器件等)中实现。识别的组件的可执行程序代码(机器可读指令)无需在物理上安置在一起,但是可以包括存储在不同的位置上的全异的指令,这些指令在在逻辑上被结合在一起时包括该组件,并且实现对于该组件陈述的目的。例子可以至少部分在云计算环境中实现,在云计算环境中,处理功能分布在不同的地理位置上。
在本描述中,措辞“A”或“B”(或“C”等)中的至少一个意图包括所有的单个的元素和陈述的列表(A、B、C等)的所有组合。例如,“A、B或C中的至少一个”意图包括以下的替代选择:只有A;只有B;只有C;A和B;A和C;B和C;或A和B和C。

Claims (28)

1.一种分支目标缓冲器BTB,用于在计算机程序的机器可读指令序列中存储与控制流程中的相应分支相对应的至少一个BTB条目,所述BTB条目包括:
标签字段,用来与提取地址产生器的程序计数器进行比较,以确定所述程序计数器和当前存储在所述BTB中的关于分支指令的信息之间是否存在匹配;以及
至少一个另外的字段,用来存储通过对应的标签字段识别的分支指令的信息特征,所述至少一个另外的字段允许将条件分支与无条件分支指令区分开;
其中,所述BTB具有预定的存储容量,并且其中,相对于条件分支指令,无条件分支指令被优先分配了所述BTB中的存储空间。
2.根据权利要求1所述的BTB,包括无条件分支目标缓冲器U-BTB和条件分支目标缓冲器C-BTB,所述无条件分支目标缓冲器U-BTB专用于存储无条件分支指令,所述条件分支目标缓冲器C-BTB专用于存储条件分支指令。
3.根据权利要求1或权利要求2所述的BTB,其中,所述分支指令是无条件分支指令,并且其中所述BTB的所述至少一个另外的字段包括用来识别对应的无条件分支指令的分支目标地址的目标字段。
4.根据权利要求3所述的BTB,其中,所述至少一个另外的字段进一步包括用来识别局部函数的程序指令在存储器中的空间区域的调用占用区字段,其中所述局部函数是位于所述无条件分支指令的分支目标处的指令集。
5.根据权利要求4所述的BTB,其中,所述BTB条目进一步包括返回占用区字段,所述返回占用区字段在从所述局部函数直到后一个无条件分支指令返回时识别与控制流程相对应的程序指令序列在存储器中的空间占用区。
6.根据权利要求1至5中任一项所述的BTB,其中,所述BTB条目包括指定对应的分支指令的类型的类型字段。
7.根据权利要求4或权利要求5所述的BTB,其中,所述调用占用区字段将所述存储器中的包括所述存储器的多个块的代码区域识别为所述局部函数的空间占用区。
8.根据权利要求7所述的BTB,其中,所述多个块包括以下中的至少一个:高速缓存块、主存储器块或虚拟存储器的块。
9.根据权利要求4至8中任一项所述的BTB,其中,所述调用占用区字段包括占用区矢量,所述占用区矢量具有用于所述空间占用区的多个存储器块中的每个的条目,每个矢量条目指示对应的存储器块在对应的局部函数的前一次执行期间是否被访问。
10.根据权利要求9所述的BTB,其中,所述占用区矢量元素的至少一个子集表示与所述分支目标块的相对块距离,所述相对距离包括正相对距离和负相对距离中的至少一个。
11.根据权利要求1至10中任一项所述的BTB,其中,所述标签识别包括以分支指令终止的指令序列的指令的基本块,并且其中所述BTB条目包括用来指定以下中的一个中的至少一个的大小字段:通过所述标签识别的基本块中的若干个指令、或通过所述标签识别的基本块中的若干个字节。
12.根据权利要求1至11中任一项所述的BTB,其中,相对于条件分支指令,实施了BTB存储优先分配到无条件分支指令,使得响应于无条件分支的BTB中的命中,将一个或多个BTB条目分配给条件分支,其中被分配BTB存储的条件分支指令对应于与导致所述BTB命中的无条件分支的分支目标相对应的代码区域中的条件分支。
13.根据权利要求3至5中任一项所述的BTB,其中,所述BTB中的对于无条件分支的命中触发了根据分支目标地址预提取存储器区域中的多个程序指令的第1级L1指令高速缓存。
14.根据权利要求1至3中任一项所述的BTB,其中,所述BTB中的对于无条件分支的命中,响应于所述BTB命中,触发预提取分支目标地址区域中的预定数量的连续的存储器块或分支目标地址区域中的预定数量的连续的程序指令的第1级L1指令高速缓存。
15.根据权利要求13所述的BTB,其中,响应于所述BTB命中,将到目标区域的进入点和所述目标区域的退出点之间的所有的高速缓存块都预提取到L1指令高速缓存。
16.根据权利要求2所述的BTB,包括:
返回指令缓冲器RIB,所述返回指令缓冲器RIB具有至少一个RIB条目,所述至少一个RIB条目包括用来识别返回指令的返回标签字段;以及
返回地址堆栈RAS,所述返回地址堆栈RAS用来存储与包含函数调用的基本块的地址相对应的返回地址;
其中,所述RIB条目省略用于返回指令的目标地址字段,并且其中所述BTB检索通过所述返回标签字段识别的返回指令、最近推送到所述RAS上的基本块地址,并且使用检索到的基本块地址来对所述U-BTB编索引。
17.一种包括根据权利要求1至16中任一项所述的分支目标缓冲器的数据处理设备。
18.根据权利要求17在从属于权利要求2或权利要求16时所述的数据处理设备,所述数据处理设备包括:
提取目标队列FTQ,所述提取目标队列FTQ具有用来识别将被提取用于执行的指令序列的多个FTQ条目;
预提取引擎,所述预提取引擎对所述U-BTB或所述RIB中的一个中的BTB命中做出响应,以发出预提取探针来从存储器检索目标区域中与所述BTB命中相对应的一个或多个程序指令以用于存储在指令高速缓存中。
19.根据权利要求18在从属于权利要求16时所述的数据处理设备,其中,当所述BTB命中为RIB命中时,执行读取操作来读取RAS以确定与先前的函数调用相对应的块地址并且访问与所述块地址相对应的U-BTB条目以确定用于所述RIB命中的空间占用区。
20.根据权利要求18所述的数据处理设备,其中,当所述BTB命中为条件BTB中的、或U-BTB中的、或RIB中的命中时,基于所述BTB的大小字段来填充FTQ。
21.根据权利要求18所述的数据处理设备,其中,所述预提取引擎被布置为预提取与通过用于无条件分支指令的BTB条目的占用区字段指定的局部函数的空间占用区相对应的指令,所述空间占用区对应于程序指令在存储器中的位置,所述位置接近于所述无条件分支指令的分支目标。
22.根据权利要求21所述的数据处理设备,包括对预提取的与所述空间占用区相对应的指令进行解码的预解码器。
23.根据权利要求22所述的数据处理设备,其中,所述预解码器识别所述空间占用区的解码的预提取的指令中的任一条件分支指令,并且使用识别的条件分支来填充所述BTB。
24.根据权利要求17所述的数据处理设备,其中,所述BTB包括U-BTB、C-BTB和RIB,所述U-BTB专用于存储无条件分支指令,所述C-BTB专用于存储条件分支指令,所述RIB具有包括用来识别返回指令的返回标签字段的至少一个RIB条目,并且其中所述BTB基于由提取地址产生器输出的地址来执行U-BTB、C-BTB和RIB的并行查询。
25.根据权利要求24所述的数据处理设备,其中,当由于并行查询而遇到BTB未命中时,所述数据处理设备对存储器发出BTB未命中探针以触发BTB填写来解决所述BTB未命中。
26.根据权利要求19所述的数据处理设备,被布置为在所述空间占用区的指令执行之后,基于止用的指令来更新所述空间占用区。
27.一种在数据处理设备的分支目标缓冲器BTB中缓冲分支指令的方法,所述方法包括:
将提取地址产生器的程序计数器与BTB条目的标签字段进行比较,以确定所述程序计数器和当前存储在所述BTB中的关于分支指令的信息之间是否存在匹配;并且
使用所述BTB条目的至少一个另外的字段来存储通过对应的标签字段识别的分支指令的信息特征,所述至少一个另外的字段允许将条件分支指令与无条件分支指令区分开;并且
相对于对无条件分支指令分配存储空间,优先将所述BTB中的存储空间分配给条件分支指令。
28.在暂时性或非暂时性介质上提供的机器可读指令,所述指令在在执行时使至少一个处理器:
将BTB条目的标签字段与提取地址产生器的程序计数器进行比较,以确定所述程序计数器和当前存储在所述BTB中的关于分支指令的信息之间是否存在匹配;
使用所述BTB条目的至少一个另外的字段来存储通过对应的标签字段识别的分支指令的信息特征,所述至少一个另外的字段允许将条件分支与无条件分支指令区分开;并且
控制所述BTB的预定存储容量的分配以相对于对无条件分支指令分配存储空间,优先将存储空间分配给条件分支指令。
CN201980025659.3A 2018-02-21 2019-02-11 用于指令预提取的分支目标缓冲器布置 Pending CN111971654A (zh)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
GBGB1802815.9A GB201802815D0 (en) 2018-02-21 2018-02-21 Branch target buffer arrangement for instruction prefetching
GB1802815.9 2018-02-21
PCT/GB2019/050359 WO2019162647A1 (en) 2018-02-21 2019-02-11 Branch target buffer arrangement for instruction prefetching

Publications (1)

Publication Number Publication Date
CN111971654A true CN111971654A (zh) 2020-11-20

Family

ID=61783758

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201980025659.3A Pending CN111971654A (zh) 2018-02-21 2019-02-11 用于指令预提取的分支目标缓冲器布置

Country Status (4)

Country Link
US (1) US11544066B2 (zh)
CN (1) CN111971654A (zh)
GB (1) GB201802815D0 (zh)
WO (1) WO2019162647A1 (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN113160363A (zh) * 2021-04-25 2021-07-23 华强方特(厦门)动漫有限公司 基于shotgun流程基础的解算缓存输出方法

Families Citing this family (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
GB201701841D0 (en) * 2017-02-03 2017-03-22 Univ Edinburgh Branch target buffer for a data processing apparatus
US11055098B2 (en) * 2018-07-24 2021-07-06 Advanced Micro Devices, Inc. Branch target buffer with early return prediction
US11403103B2 (en) * 2020-04-14 2022-08-02 Shanghai Zhaoxin Semiconductor Co., Ltd. Microprocessor with multi-step ahead branch predictor and having a fetch-target queue between the branch predictor and instruction cache
US11928472B2 (en) * 2020-09-26 2024-03-12 Intel Corporation Branch prefetch mechanisms for mitigating frontend branch resteers
US11687343B2 (en) * 2020-09-29 2023-06-27 Arm Limited Data processing apparatus and method for providing candidate prediction entries
US20220197657A1 (en) * 2020-12-22 2022-06-23 Intel Corporation Segmented branch target buffer based on branch instruction type
US11868773B2 (en) 2022-01-06 2024-01-09 International Business Machines Corporation Inferring future value for speculative branch resolution in a microprocessor

Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
EP0649084A1 (en) * 1993-10-18 1995-04-19 Cyrix Corporation Microprocessor branch processing
US5935241A (en) * 1996-12-10 1999-08-10 Texas Instruments Incorporated Multiple global pattern history tables for branch prediction in a microprocessor
WO2005060458A2 (en) * 2003-12-15 2005-07-07 Freescale Semiconductor, Inc. Method and apparatus for allocating entries in a branch target buffer
US20090222645A1 (en) * 2008-02-29 2009-09-03 Moyer William C Metric for selective branch target buffer (btb) allocation
CN101840330A (zh) * 2009-07-15 2010-09-22 威盛电子股份有限公司 一种微处理器和其信息储存方法
US20110055529A1 (en) * 2009-08-28 2011-03-03 Via Technologies, Inc. Efficient branch target address cache entry replacement

Family Cites Families (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5864707A (en) 1995-12-11 1999-01-26 Advanced Micro Devices, Inc. Superscalar microprocessor configured to predict return addresses from a return stack storage
US5734881A (en) 1995-12-15 1998-03-31 Cyrix Corporation Detecting short branches in a prefetch buffer using target location information in a branch target cache
JPH10214188A (ja) * 1997-01-30 1998-08-11 Toshiba Corp プロセッサの命令供給方法及び装置
US20050144427A1 (en) * 2001-10-23 2005-06-30 Ip-First Llc Processor including branch prediction mechanism for far jump and far call instructions
US7174444B2 (en) * 2003-03-31 2007-02-06 Intel Corporation Preventing a read of a next sequential chunk in branch prediction of a subject chunk
US8555036B1 (en) * 2010-05-17 2013-10-08 Nvidia Corporation System and method for performing predicated selection of an output register
US10114643B2 (en) * 2013-05-23 2018-10-30 Intel Corporation Techniques for detecting return-oriented programming
US10481912B2 (en) * 2016-06-24 2019-11-19 International Business Machines Corporation Variable branch target buffer (BTB) line size for compression
GB201701841D0 (en) * 2017-02-03 2017-03-22 Univ Edinburgh Branch target buffer for a data processing apparatus

Patent Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
EP0649084A1 (en) * 1993-10-18 1995-04-19 Cyrix Corporation Microprocessor branch processing
US5935241A (en) * 1996-12-10 1999-08-10 Texas Instruments Incorporated Multiple global pattern history tables for branch prediction in a microprocessor
WO2005060458A2 (en) * 2003-12-15 2005-07-07 Freescale Semiconductor, Inc. Method and apparatus for allocating entries in a branch target buffer
US20090222645A1 (en) * 2008-02-29 2009-09-03 Moyer William C Metric for selective branch target buffer (btb) allocation
CN101840330A (zh) * 2009-07-15 2010-09-22 威盛电子股份有限公司 一种微处理器和其信息储存方法
US20110055529A1 (en) * 2009-08-28 2011-03-03 Via Technologies, Inc. Efficient branch target address cache entry replacement

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN113160363A (zh) * 2021-04-25 2021-07-23 华强方特(厦门)动漫有限公司 基于shotgun流程基础的解算缓存输出方法

Also Published As

Publication number Publication date
WO2019162647A1 (en) 2019-08-29
US11544066B2 (en) 2023-01-03
US20210004233A1 (en) 2021-01-07
GB201802815D0 (en) 2018-04-04

Similar Documents

Publication Publication Date Title
EP3577553B1 (en) Branch target buffer for a data processing apparatus
CN111971654A (zh) 用于指令预提取的分支目标缓冲器布置
Kumar et al. Blasting through the front-end bottleneck with shotgun
Kumar et al. Boomerang: A metadata-free architecture for control flow delivery
Ferdman et al. Temporal instruction fetch streaming
US8255633B2 (en) List based prefetch
US10698827B2 (en) Dynamic cache replacement way selection based on address tag bits
US9811468B2 (en) Set associative cache memory with heterogeneous replacement policy
Kaynak et al. Confluence: unified instruction supply for scale-out servers
US9798668B2 (en) Multi-mode set associative cache memory dynamically configurable to selectively select one or a plurality of its sets depending upon the mode
US10719434B2 (en) Multi-mode set associative cache memory dynamically configurable to selectively allocate into all or a subset of its ways depending on the mode
Ansari et al. Divide and conquer frontend bottleneck
US20160350227A1 (en) Cache memory budgeted by chunks based on memory access type
US20170090935A1 (en) Unified prefetching into instruction cache and branch target buffer
US20170315921A1 (en) Cache memory budgeted by ways based on memory access type
Ishii et al. Re-establishing fetch-directed instruction prefetching: An industry perspective
Ros et al. A cost-effective entangling prefetcher for instructions
US11249762B2 (en) Apparatus and method for handling incorrect branch direction predictions
Asheim et al. A storage-effective BTB organization for servers
US6272622B1 (en) Method of and circuit for instruction/data prefetching using non-referenced prefetch cache
Shukla et al. Register file prefetching
Kumar et al. Shooting down the server front-end bottleneck
Ansari et al. Mana: Microarchitecting an instruction prefetcher
US20220197662A1 (en) Accessing A Branch Target Buffer Based On Branch Instruction Information
US20220197657A1 (en) Segmented branch target buffer based on branch instruction type

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