掌桥专利:专业的专利平台
掌桥专利
首页

配置方法、分支预测器、指令识别器和电子设备

文献发布时间:2024-04-18 19:58:21


配置方法、分支预测器、指令识别器和电子设备

技术领域

本公开的实施例涉及分支目标缓存的配置方法、指令识别器的配置方法、分支预测器、及指令识别器和电子设备。

背景技术

现代CPU核通过流水线技术提高指令间并行度(Instruction LevelParallelism)来达到高性能。CPU核内部一般有多个流水阶段,比如分支预测(Branchprediction)、指令提取(Instruction fetch)、指令译码(Decode)、指令分发与重命名(Dispatch and Rename)、指令执行(Execute),指令结束(Retire)等。为了支持高运行频率,每一个流水阶段又可能包含多个流水级(也就是时钟周期)。每个流水级执行有限的操作,这样每个时钟可以做到最短,通过提高CPU的运行频率来提高CPU核的性能。每个流水级也可以通过容纳更多条指令(成为超标量superscalar)来进一步提高CPU性能。

发明内容

本公开至少一个实施例提供一种分支目标缓存的配置方法,包括:获取待插入所述分支目标缓存的对象分支指令,所述分支目标缓存包括至少一个信息项;判断所述对象分支指令是否命中所述至少一个信息项中的命中信息项,所述命中信息项包括命中指令的命中指令信息;以及响应于所述对象分支指令命中所述至少一个信息项中的命中信息项且为位于所述命中指令之前的目标类型分支指令,从所述分支目标缓存删除所述命中信息项,并且将所述对象分支指令的对象指令信息插入所述分支目标缓存,所述目标类型分支指令为跳转概率大于预设阈值的条件跳转指令。

例如,在本公开一实施例提供的配置方法中,还包括:查询指令识别器获取所述对象分支指令的跳转参数,所述跳转参数用于指示所述对象分支指令的跳转概率;以及基于所述跳转参数,确定所述对象分支指令是否为所述目标类型分支指令。

例如,在本公开一实施例提供的配置方法中,将所述对象分支指令的所述对象指令信息插入所述分支目标缓存,包括:响应于所述对象分支指令为第一类型指令,将所述对象分支指令的对象指令信息以第一信息项类型插入分支目标缓存,所述第一类型指令为指令地址和跳转目标地址的高M位不相同的分支指令,所述第一信息项类型用于指示所针对的一条分支指令的完整跳转目标地址被存储于所述分支目标缓存;以及响应于所述对象分支指令为第二类型指令,将所述对象分支指令的对象指令信息以第二信息项类型插入分支目标缓存,所述第二类型指令为指令地址和跳转目标地址的高M位相同的分支指令,所述第二信息项类型用于指示所述针对的一条分支指令的跳转目标地址中除所述高M位之外的低位被存储于所述分支目标缓存;M为正整数。

例如,在本公开一实施例提供的配置方法中,还包括:响应于所述对象分支指令命中所述至少一个信息项中的命中信息项且不满足所述对象分支指令为位于所述命中指令之前的目标类型分支指令,判断所述对象分支指令是否满足所述命中信息项包括多条命中指令的命中指令信息并且所述对象分支指令位于所述多条命中指令的后面;以及响应于所述对象分支指令满足所述命中信息项包括所述多条命中指令的命中指令信息并且所述对象分支指令位于所述多条命中指令的后面,则丢弃对象分支指令的对象指令信息。

例如,在本公开一实施例提供的配置方法中,还包括:还包括:响应于所述对象分支指令不满足所述命中信息项包括所述多条命中指令的命中指令信息并且所述对象分支指令位于所述多条命中指令的后面,判断所述对象分支指令是否满足所述对象分支指令位于所述命中指令之后并且所述命中指令为无条件分支指令或者所述目标类型分支指令;以及响应于所述对象分支指令满足所述对象分支指令位于所述命中指令之后,并且所述命中指令为无条件分支指令或者所述目标类型分支指令,丢弃对象分支指令的指令信息。

例如,在本公开一实施例提供的配置方法中,命中信息项包括两条命中指令,所述方法还包括:响应于所述对象分支指令不满足所述对象分支指令位于所述命中指令之后并且所述命中指令为无条件分支指令或者所述目标类型分支指令,将所述对象分支指令与所述两条命中指令中的第一条命中指令组成指令对,并且删除所述命中信息项,所述第一条命中指令为所述两条命中指令中地址最小的指令;判断所述指令对中地址最小的分支指令是否为所述目标类型分支指令;以及响应于所述指令对中地址最小的分支指令为所述目标类型分支指令,所述指令对中地址最小的分支指令以第二信息项类型存储到所述分支目标缓存。

例如,在本公开一实施例提供的配置方法中,还包括:响应于所述指令对中地址最小的分支指令不为所述目标类型分支指令,判断所述指令对中的每条分支指令是否都是第二类型指令;以及响应于所述指令对中的每条分支指令都是第二类型指令,将所述指令对中的两条分支指令的指令信息合并后以第三信息项类型存储到所述分支目标缓存中,所述第三信息项类型用于指示所针对的多条分支指令的指令信息被存储于所述分支目标缓存。

例如,在本公开一实施例提供的配置方法中,还包括:响应于所述指令对中存在所述第一类型指令,判断所述指令对中地址最小的指令是否为所述第一类型指令;响应于所述指令对中地址最小的指令为所述第一类型指令,将所述指令对中地址最小的分支指令的指令信息以所述第一信息项类型插入所述分支目标缓存;以及响应于所述指令对中地址最小的指令不为所述第一类型指令,将所述指令对中地址最小的分支指令的指令信息以所述第二信息项类型插入所述分支目标缓存。

例如,在本公开一实施例提供的配置方法中,还包括:响应于所述对象分支指令命中所述至少一个信息项中的命中信息项且为位于所述命中指令之前的无条件分支指令,从所述分支目标缓存删除所述命中信息项,并且判断所述对象分支指令是否为所述第一类型指令;响应于所述对象分支指令为所述第一类型指令,将所述对象分支指令以所述第一信息项类型插入所述分支目标缓存;以及响应于所述对象分支指令为所述第二类型指令,将所述对象分支指令以所述第二信息项类型插入所述分支目标缓存。

例如,在本公开一实施例提供的配置方法中,还包括:响应于所述对象分支指令未命中所述至少一个信息项,判断所述对象分支指令是否为所述第一类型指令;响应于所述对象分支指令为所述第一类型指令,将所述对象分支指令以所述第一信息项类型插入所述分支目标缓存;以及响应于所述对象分支指令为所述第二类型指令,将所述对象分支指令以所述第二信息项类型插入所述分支目标缓存。

本公开提供了一种指令识别器的配置方法,所述指令识别器用于存储至少一个识别信息项,所述方法包括:获取目标条件分支指令;判断所述目标条件分支指令是否命中所述至少一个识别信息项;响应于所述目标条件分支指令命中所述至少一个识别信息项,更新所述条件分支指令命中的命中识别信息项,以根据所述至少一个识别信息项判断待插入分支目标缓存的对象分支指令是否是目标类型分支指令,所述目标类型分支指令为跳转概率大于预设阈值的条件跳转指令。

例如,在本公开一实施例提供的指令识别器的配置方法中,所述至少一个识别信息项每个包括地址域,所述地址域用于指示所述每个识别信息项对应的条件分支指令的指令地址;判断所述目标条件分支指令是否命中所述至少一个识别信息项,包括:判断所述至少一个识别信息项是否存在与所述目标条件分支指令的指令地址相同的地址;响应于所述至少一个识别信息项存在与所述目标条件分支指令的指令地址相同的地址,所述目标条件分支指令命中所述指令识别器中的至少一个识别信息项。

例如,在本公开一实施例提供的指令识别器的配置方法中,至少一个识别信息项每个包括跳转参数域,所述跳转参数域用于存储所述每个识别信息项对应的条件分支指令的跳转参数,响应于所述目标条件分支指令命中所述至少一个识别信息项,更新所述条件分支指令命中的命中识别信息项,包括:响应于所述目标条件分支指令命中所述至少一个识别信息项,更新所述命中识别信息项的当前跳转参数。

例如,在本公开一实施例提供的指令识别器的配置方法中,响应于所述目标条件分支指令命中所述至少一个识别信息项,更新所述命中识别信息项的所述当前跳转参数,包括:响应于所述目标条件分支指令跳转,所述当前跳转参数增加预设步长;或者响应于所述目标条件分支指令没有跳转,所述当前跳转参数更新为最大参数值,所述最大参数值是所述当前跳转参数与参考值之间的差值和0中的最大值,所述参考值是根据所述预设阈值确定的。

例如,在本公开一实施例提供的指令识别器的配置方法中,还包括:响应于所述目标条件分支指令未命中所述至少一个识别信息项,判断所述目标条件分支指令是否满足添加至所述指令识别器的添加条件;响应于所述目标条件分支指令满所述添加条件,将所述目标条件分支指令的指令信息作为所述指令识别器的新信息项更新所述指令识别器,所述新信息项的跳转参数为预设初始值。

例如,在本公开一实施例提供的指令识别器的配置方法中,添加条件包括:所述目标条件分支指令在执行中跳转,所述目标条件分支指令为一个地址入口对应的第一条分支指令且为可缩短类型指令,所述可缩短类型指令为指令地址和跳转目标地址的高M位相同的分支指令。

例如,在本公开一实施例提供的指令识别器的配置方法中,获取所述目标条件分支指令包括:获取执行结束的条件分支指令作为所述目标条件分支指令;或者获取进行分支预测后的条件分支指令作为所述目标条件分支指令。

本公开至少一实施例提供一种分支目标缓存的配置方法,所述分支目标缓存包括至少一个信息项,所述方法包括:获取需要访问所述分支目标缓存的当前分支指令;判断所述当前分支指令是否命中所述至少一个信息项中多分支信息类型的命中信息项,所述多分支信息类型用于指示存储多条分支指令的指令信息;响应于所述当前分支指令命中所述多分支信息类型的信息项,判断所述多条分支指令的第一条指令是否为目标类型分支指令,所述第一条指令是指所述多条分支指令中地址最小的分支指令;响应于所述第一条指令为所述目标类型分支指令,删除所述命中信息项,并且将所述第一条指令作为新信息项插入所述分支目标缓存,所述目标类型分支指令为跳转概率大于预设阈值的条件跳转指令。

例如,在本公开一实施例提供的分支目标缓存的配置方法中,判断所述当前分支指令是否命中所述至少一个信息项中多分支信息类型的命中信息项,包括:在对所述当前分支指令进行分支预测时,判断所述当前分支指令是否命中所述至少一个信息项中多分支信息类型的命中信息项;或者在所述当前分支指令执行结束后,判断判断当前分支指令是否命中所述至少一个信息项中多分支信息类型的命中信息项。

本公开至少一个实施例提供一种分支预测器,包括:分支目标缓存;分支预测控制单元,配置为判断所述对象分支指令是否命中所述至少一个信息项中的命中信息项,所述命中信息项包括命中指令的命中指令信息;以及响应于所述对象分支指令命中所述至少一个信息项中的命中信息项且为位于所述命中指令之前的目标类型分支指令,从所述分支目标缓存删除所述命中信息项,并且将所述对象分支指令的对象指令信息插入所述分支目标缓存,所述目标类型分支指令为跳转概率大于预设阈值的条件跳转指令。

例如,在本公开一实施例提供的分支预测器还包括指令识别器,配置为存储条件分支指令的跳转参数,所述跳转参数用于指示所述对象分支指令的跳转概率;所述分支预测控制单元还配置为:基于所述跳转参数,确定所述对象分支指令是否为所述目标类型分支指令。

本公开至少一个实施例提供一种指令识别器,包括:获取单元,配置为获取目标条件分支指令;判断单元,配置为判断所述目标条件分支指令是否命中所述至少一个识别信息项;以及更新单元,配置为响应于所述目标条件分支指令命中所述至少一个识别信息项,更新所述条件分支指令命中的命中识别信息项,以根据所述至少一个识别信息项判断待插入分支目标缓存的对象分支指令是否是目标类型分支指令,所述目标类型分支指令为跳转概率大于预设阈值的条件跳转指令。

本公开至少一个实施例提供一种电子设备,包括所述处理器包括本公开任一实施例提供的分支预测器或者指令识别器。

本公开至少一个实施例提供一种电子设备,包括:一个或多个处理器,存储器,所述存储器中存储有可执行指令,所述可执行指令在所述一个或多个处理器执行时实现本公开任一实施例提供的配置方法。

附图说明

为了更清楚地说明本公开实施例的技术方案,下面将对实施例的附图作简单地介绍,显而易见地,下面描述中的附图仅仅涉及本公开的一些实施例,而非对本公开的限制。

图1示出了一种CPU内部架构及流水线的示意图;

图2示出了一个分支预测器的示意图;

图3示出了本公开至少一个实施例提供的一种分支目标缓存的配置方法的流程图;

图4示出了本公开至少一个实施例提供的一条缓存行有多个跳转入口的示意图;

图5示出了本公开至少一个实施例提供的一种BTB包括的多种类型的信息项的示意图;

图6示出了本公开至少一个实施例提供的包括多个表格的BTB的示意图;

图7示出了本公开至少一个实施例提供的另一种分支目标缓存的配置方法的流程图;

图8示出了本公开至少一个实施例提供的另一种分支目标缓存的配置方法的流程图;

图9示出了本公开至少一个实施例提供的一种指令识别器的配置方法的流程图;

图10示出了本公开至少一个实施例提供的一种分支目标缓存的配置方法的流程图;

图11示出了本公开至少一个实施例提供的一种分支目标缓存的配置方法的流程图;

图12示出了本公开至少一个实施例提供的另一种分支目标缓存的配置方法的流程图;

图13示出了本公开至少一个实施例提供的一种分支预测器的示意性框图;

图14示出了本公开至少一个实施例提供的一种指令识别器的示意性框图;

图15示出了本公开至少一个实施例提供的一种电子设备的示意框图;以及

图16示出了本公开至少一个实施例提供的另一种电子设备的示意框图。

具体实施方式

为使本公开实施例的目的、技术方案和优点更加清楚,下面将结合本公开实施例的附图,对本公开实施例的技术方案进行清楚、完整地描述。显然,所描述的实施例是本公开的一部分实施例,而不是全部的实施例。基于所描述的本公开的实施例,本领域普通技术人员在无需创造性劳动的前提下所获得的所有其他实施例,都属于本公开保护的范围。

除非另外定义,本公开使用的技术术语或者科学术语应当为本公开所属领域内具有一般技能的人士所理解的通常意义。本公开中使用的“第一”、“第二”以及类似的词语并不表示任何顺序、数量或者重要性,而只是用来区分不同的组成部分。同样,“一个”、“一”或者“该”等类似词语也不表示数量限制,而是表示存在至少一个。“包括”或者“包含”等类似的词语意指出现该词前面的元件或者物件涵盖出现在该词后面列举的元件或者物件及其等同,而不排除其他元件或者物件。“连接”或者“相连”等类似的词语并非限定于物理的或者机械的连接,而是可以包括电性的连接,不管是直接的还是间接的。“上”、“下”、“左”、“右”等仅用于表示相对位置关系,当被描述对象的绝对位置改变后,则该相对位置关系也可能相应地改变。

现代高性能CPU核大都将指令译码成便于CPU微架构高速运行的微操作(MicroOperation)。一条复杂的指令有可能会被拆分成为多条微操作,每条微操作仅执行有限的功能,从而确保一个时钟周期能够完成一个微操作指定的任务。指令译码之后的流水级都仅使用微操作,而不使用指令。

图1示出了一种CPU内部架构及流水线的示意图。

如图1所示,CPU核内部包括多个流水阶段,比如,在流水线送入各种来源的程序计数器,通过多路选择器(Mux)选择出下一程序计数器(PC)之后,该程序计数器对应的指令要经过分支预测(Branch prediction)、取指(Instruction fetch)、指令译码(Decode)、指令分发与重命名(Dispatch and Rename)、指令执行(Execute)、指令结束(Retire)等。在各个流水级之间根据需要设置等待队列,这些队列通常是先入先出(FIFO)队列。例如,在分支预测单元之后,设置有分支预测(BP)FIFO队列,以存储分支预测结果;在指令提取单元之后,设置有指令缓存(Instruction Cache,IC)FIFO,以缓存所取得的指令;在指令译码单元之后,设置有译码(DE)FIFO,以缓存译码后的指令;在指令分发与重命名单元之后,设置有结束(RT)FIFO以缓存执行之后等待确认结束的指令。同时处理器核的流水线还包括指令队列,以在指令分发与重命名之后缓存等待指令执行单元执行指令。为了支持高运行频率,每一个流水阶段又可能包含多个流水级(时钟周期)。虽然每个流水级执行有限的操作,但是这样每个时钟可以做到最短,通过提高CPU的运行频率来提高CPU核的性能。每个流水级也可以通过容纳更多条指令(即超标量(superscalar)技术)来进一步提高处理器核的性能。

CPU核在微架构内将每一条架构指令(instruction)翻译为一条或者多条微操作,每条微操作只执行有限的操作,这样可以保证每个流水级很短,以提高处理器核运行频率。比如一条内存读指令(load),可以被翻译为一条地址生成微操作以及一条内存读微操作,第二条微操作会依赖第一条微操作的结果,因此只有第一条微操作执行完后,第二条微操作才会开始执行。微操作包含多个微架构相关的域,用来在流水级间传递相关信息。

预测执行(Speculative Execution)是提高处理器性能的另一种技术。该技术在一条指令还未完成执行之前,执行它后面的指令。CPU核前端的分支预测装置(也可称为分支预测单元或分支预测器),对分支指令的跳转方向进行预测,预取、执行该方向的指令;另一个预测执行的技术是在前面的所有内存写指令的地址都获得前,执行一个内存读指令。预测执行进一步提高了指令间并行度,从而大幅提高处理器核性能。当出现预测执行错误,比如发现分支预测错误,或者内存读指令前的某一条写指令改写了同一个地址,犯错指令其后的所有流水线中的指令需要被冲刷(或称为“清除”)(flush),然后程序跳转到出错点重新执行,以保证程序执行的正确性。

在多进程操作系统中,每个进程都有自己的虚拟地址空间,可以使用系统规定范围内的任意虚拟地址(Virtual Address)。CPU执行应用程序时所使用的地址是虚拟地址。操作系统给进程分配内存时,需要把使用到的虚拟地址映射到物理地址(PhysicalAddress),物理地址才是真正的物理内存访问地址。将虚拟地址转换为物理地址的过程被称为地址翻译(Address Translation)。

分支指令(Branch Instruction)是计算机指令的一种,用来控制程序指令流的流向。非分支指令仅有一个目标指令,即其后一条指令;而分支指令可以有2个甚至更多个可能的目标地址。

一个指令集(比如X86)的分支指令一般有如下子类型:无条件分支指令(例如,jmp)、条件分支指令(例如,jcc)、Call/Return分支指令、Indirect分支指令。无条件分支指令总是跳转到一个固定的、非连续的地址。条件分支指令是当条件不满足时执行下一条指令,否则跳转到一个固定的、非连续的地址。Call/Return分支指令用来实现函数调用与返回,且它们遵循后入先出的规律,CPU核一般使用一个硬件栈(例如,返回地址栈(ReturnAddress Stack,RAS))来保存Call分支指令后面指令的地址,其对应Return分支指令从RAS顶端取得跳转目标地址。Indirect分支指令总是会跳转,但是它们有超过一个可能的目标地址,程序执行中动态决定该指令跳转的地址。

分支预测(Branch Prediction)是一个高性能、多流水级的CPU核的重要组成部分。如果一个多流水级CPU核没有分支预测,它必须等到每个分支指令执行结束才知道应该跳转到哪条指令,这会造成从前端到执行的多个流水级空转,造成很大的性能损失。如图1所示,分支预测在CPU核流水线的最前端,根据上一次分支预测的结果持续预测下一次的指令起始及结束地址。分支预测大部分时间都是正确的,从而提高CPU核整体性能。当后面流水级(比如指令解码后或者指令执行完后)发现一个分支预测错误时,流水线中所有比该条预测错误分支指令年轻的指令都会被清理掉,然后分支预测器从该处继续预测指令流并填入流水线中。

图2示出了一个分支预测器的示意图。

如图2所示,该分支预测器包括分支目标缓存(Branch Target Buffer,BTB)、条件预测器、返回地址栈、Indirect预测器和判断逻辑。

分支目标缓存是分支预测器中的一个重要组件,用来保存分支指令相关信息(例如,起始地址、分支指令类型、跳转目标地址等)。它与其他分支预测器组件(例如,条件预测器、返回地址栈和Indirect(间接)预测器)合作预测当前指令地址中是否有分支指令,如果当前指令地址中有分支指令,是否跳转及相应跳转目标地址。

例如,通过条件预测器预测当前指令地址是否跳转,查看BTB是否存储有该当前指令地址的历史跳转记录、跳转的目标地址,将条件预测器和BTB的输出结果提供给判断逻辑,根据判断逻辑到跳转目标地址提取指令数据,并且将当前指令地址更新为跳转目标地址。

类似地,判断逻辑通过返回地址栈获取栈顶项中的目标地址和BTB输出的输出结果得到是否跳转到跳转目标地址,若跳转到转目标地址,则到跳转目标地址提取指令数据,并且将当前指令地址更新为跳转目标地址。

Indirect预测器和分支目标缓存的配合与上述条件预测器和分支目标缓存的配合类似,不再赘述。

分支目标缓存是现代高性能CPU核的重要组成部分,它为分支预测提供分支指令位置、类型及跳转目标地址等信息,用来帮助分支预测器准确预测当前指令流是否跳转以及在哪里跳转、跳转到哪里。分支指令预测器能准确工作的先决条件是知道一个分支指令的信息,也就是该分支指令需要在BTB中。如果一个程序出现过多BTB未命中,则会造成很多的分支预测错误,从而影响该程序运行性能。由于BTB里面保留地址信息(一般为32位或者64位),每一个BTB项所需资源也较大,因此CPU核无法支持过多项数的BTB。

新兴应用如大数据、云计算、数据中心等都有较大的指令footprint(即不同地址的指令的个数统计),也就是它们运行时有不同地址的分支指令的个数远远超过CPU核BTB的容量,这往往造成这些程序出现很多BTB未命中,从而制约它们的性能。

本公开的一个或多个实施例提供了一种分支目标缓存的配置方法,包括:获取待插入分支目标缓存的对象分支指令,分支目标缓存包括至少一个信息项;判断对象分支指令是否命中至少一个信息项中的命中信息项,命中信息项包括命中指令的命中指令信息;以及响应于对象分支指令命中至少一个信息项中的命中信息项且为位于命中指令之前的目标类型分支指令,从分支目标缓存删除命中信息项,并且将对象分支指令的对象指令信息插入分支目标缓存,目标类型分支指令为跳转概率大于预设阈值的条件跳转指令。该配置方法能够使得位于跳转概率大于预设阈值的条件跳转指令之后的分支指令不存储在分支目标缓存中,从而将BTB中的资源留给对性能影响更大的分支指令,降低整体BTB未命中个数,提高CPU性能。

图3示出了本公开至少一个实施例提供的一种分支目标缓存的配置方法的流程图。例如,该指令的配置方法适用于CPU(或CPU核),该CPU的内部架构及流水线例如可以参考图1所示的示例。

如图3所示,该分支目标缓存的配置方法包括步骤S301~S303。

步骤S301:获取待插入分支目标缓存的对象分支指令。

步骤S302:判断对象分支指令是否命中至少一个信息项。

步骤S303:响应于对象分支指令命中至少一个信息项中的命中信息项且,对象分支指令为位于命中信息项对应的为位于命中指令之前的目标类型分支指令,从分支目标缓存删除命中信息项,并且将对象分支指令的对象指令信息插入分支目标缓存。

对于步骤S301,对象分支指令作为前述操作中被描述的对象。如图1所示,在流水线送入各种来源的程序计数器,通过多路选择器(Mux)选择出下一程序计数器(PC)作为该对象分支指令。

在本公开的一个或多个实施例中,分支目标缓存包括多个信息项,每个信息项可以存储一条分支指令的信息或者多条分支指令的信息。

例如,分支预测器的一个重要参数是每时钟周期能够预测一条缓存行(cacheline)内的几条分支指令。例如,每个时钟周期预测一条缓存行内的1条分支指令,不管这条分支指令是否预测为跳转,本时钟周期都不再预测后面的分支指令。又例如,每个时钟周期预测一条缓存行内的N(N为大于1的整数),如果前面的N-1条分支指令都预测为不跳转,本时钟周期可以预测第N条分支指令;而如果第M(M

BTB索引使用的是一条缓存行的入口地址,也就是从其他缓存行跳入该缓存行的位置。

图4示出了本公开至少一个实施例提供的一条缓存行有多个跳转入口的示意图。

如图4所示,一条缓存行存储8条指令(指令1~指令8)。一条缓存行可能有多个入口地址,多个入口地址对应的一条或多条分支指令有可能不一样。例如,指令2、指令5和指令7分别为jmp(无条件)、jcc(条件)、call分支指令,其他为非分支指令。入口1为指令1,入口2为指令3,则指令2应该被插入一个信息项,指令5和指令7应该被插入另一个信息项。为了避免不同入口地址对应的分支指令被插入同一个信息项,BTB索引使用入口地址生成,而不是缓存行地址。不同入口地址对应的分支指令被插入同一个信息项称为BTB对齐(BTBaliasing)。

图5示出了本公开至少一个实施例提供的一种BTB包括的多种类型的信息项的示意图。

如图5所示,BTB中可以包括3种类型的信息项/条目(entry),分别为信息项类型502、信息项类型504和信息项类型506。

例如,每个信息项类型包括跳转目标地址域(Target)。跳转目标地址域用于指示分支指令的跳转目标地址。很多情况下,分支指令的地址与其跳转目标地址的高P位相同,因此这些跳转目标地址域无需保留高P位的信息,即跳转目标地址域存储压缩后的跳转目标地址,压缩后的跳转目标地址例如可以为跳转目标地址的低Q位,其中,P+Q=Y,Y为完整地址的长度,P、Q和Y均为正整数。除分支指令的地址与其跳转目标地址的高P位相同之外的其他情况下则可以保存完整的跳转地址。依据跳转目标地址能否压缩,可以选择合适的BTB项类型(例如,图5的信息项类型504或信息项类型506)来放置。

在本公开的实施例中,信息项类型502用于指示存储单(即,一条)分支指令的指令信息。例如,如图5所示,信息项类型502包括一个跳转目标地址域Target 0,该跳转目标地址域Target 0的值为分支指令的跳转目标地址的低Q位。

信息项类型504用于指示存储两条分支指令的指令信息。例如,如图5所示,信息项类型504包括2个跳转目标地址域,分别为Target 0和Target1,Target 0的值为两条分支指令中第一条分支指令的跳转目标地址的低Q位,Target 1的值为两条分支指令中第二条分支指令的跳转目标地址的低Q位。

信息项类型506用于指示存储一条分支指令的指令信息,信息项类型506包括一个跳转目标地址域Large Target 0,该跳转目标地址域Large Target0的值为分支指令的完整长度的跳转目标地址而不是被压缩的跳转目标地址,即Y位。

例如,每个信息项还包括标签域(Tag)和偏移值域(Offset 0)。标签域用于指示每个信息项对应的分支指令的指令地址。例如标签域存储指令地址哈希后的结果。偏移值域用于指示每个信息项对应的分支指令在缓存行中的偏移值。在支持多条分支指令的BTB项中,这些分支指令是顺序排列的,即地址值大的指令在地址值小的指令后面。在本公开的一些实施例中,偏移值域用于决定新插入的指令信息的正确信息项的位置。

例如,每个信息项还包括属性域(Attributes)和类型域(Type 0)。

属性域用于存储信息项的相关属性,例如最近最少使用(Least Recently Used,LRU)值。在一些实施例中,同一个信息项可以支持多个格式,例如同一个信息项可以支持图5的信息项类型504及信息项类型506,即一个信息项可以按照双分支信息项类型504存储指令信息也可以按照大目标信息项类型506存储指令信息,在该些实施例中,属性域可以有子域来指示当前的格式是哪种信息项类型。针对信息项类型502的属性域可以是压缩属性。压缩属性包括压缩属性值,例如通过省略属性数据来压缩属性。

类型域用于指示分支指令类型,比如Call分支指令、Return分支指令、Indirect分支指令、Jump分支指令等。

一个支持多条分支指令的信息项(例如,信息项类型504)内,每个分支指令有自己的类型域、偏移值域与跳转目标地址域。如图5所示,不同类型的信息项有不同的大小,比如信息项类型502就比信息项类型504要小。相同大小的信息项也可以依据属性域内子域的配置设置成不同的格式,比如信息项类型504与信息项类型506。

虽然图5示出了本公开的实施例提供的BTB的实现方式,但是这对本公开不具有限定作用。

对于步骤S302,例如根据对象分支指令的对象指令地址,判断对象分支指令是否命中分支目标缓存中的信息项。

例如,对对象指令地址进行哈希运算得到哈希值,将该哈希值与分支目标缓存中的多个信息项进行比较,若分支目标缓存中的多个信息项存在与标签域中的Tag值与该哈希值一致的信息项,则对象分支指令命中分支目标缓存中的信息项。在本公开的实施例中,将对象分支指令命中的信息项称为命中信息项。命中信息项存储命中指令的指令信息,在本公开的实施例中,将命中指令的指令信息称为命中指令信息。

若分支目标缓存中的多个信息项不存在与标签域中的Tag值与该哈希值一致的信息项,则对象分支指令未命中分支目标缓存中的信息项。

在本公开的一些实施例中,分支目标缓存包括多个表格,每个表格用于存储不同类型的信息项。

图6示出了本公开至少一个实施例提供的包括多个表格的BTB的示意图。

如图6所示,BTB包括多个表格,分别为表格Table 1、表格Tablel 2、……、表格Table K。不同BTB表格可以使用不同类型的信息项来保存不同个数的分支指令信息以提高存储效率。例如,所有的BTB表格都有相同项数,这样能够简化BTB索引。例如,用指令地址X检索时,先生成索引值F=IDX(X)及T=HASH(X),然后从每个BTB表格中取出第F项,再用T与这些选中项中的Tag值比较,相同的则为命中项,其项值会被传出;若所有表格都未命中,该地址未命中BTB。BTB替换算法会保证不会有多个命中项的存在,以消除BTB冗余。BTB替换算法例如可以是最近最少使用算法(Least recently used,LRU)、伪LRU(Pseudo-LRU,PLRU)、重引用间隔预测算法(Re-Reference Interval Prediction,RRIP)等,本公开的实施例对此不作限制。

例如,图6中的表格Table 1用于存储图5所示的信息项类型502的信息项。

例如,图6中的表格Table 2用于存储图5所示的信息项类型504的信息项。

例如,图6中的表格Table 3用于存储图5所示的信息项类型506的信息项。

在本公开的另一些实施例中,所有不同类型的信息项可以存储到同一表格中。

对于步骤S303,目标类型分支指令为跳转概率大于预设阈值的条件跳转指令。

例如,预设阈值为95%,若分支指令在绝大部分情况下(例如,95%的情况下)都会跳转,而在少部分情况下不跳转,则该分支指令为目标类型分支指令。

若对象分支指令命中BTB中的命中信息项,并且对象分支指令为位于所述命中指令之前的目标类型分支指令,则将对象分支指令插入BTB。

例如,通过比较对象分支指令的对象指令地址和命中指令的指令地址,判断对象分支指令是否位于所述命中指令之前。若对象分支指令的对象指令地址小于命中指令的指令地址,则对象分支指令位于所述命中指令之前;若对象分支指令的对象指令地址大于命中指令的指令地址,则对象分支指令位于所述命中指令之后。

在本公开的一些实施例中,将对象分支指令的对象指令信息插入分支目标缓存,包括:响应于对象分支指令为第一类型指令,将对象分支指令的对象指令信息以第一信息项类型插入分支目标缓存;以及响应于对象分支指令为第二类型指令,将对象分支指令的对象指令信息以第二信息项类型插入分支目标缓存。

第一类型指令为指令地址和跳转地址的高M位不相同的分支指令,第一信息项类型用于指示所针对的一条分支指令的完整跳转地址被存储于分支目标缓存。M为正整数。

第二类型指令为指令地址和跳转地址的高M位相同的分支指令,第二信息项类型用于指示针对的一条分支指令的跳转地址中除高M位之外的低位被存储于分支目标缓存。

例如,在下文中除非特别说明均以第一信息项类型为图5所示的信息项类型506,第二信息项类型为图5所示的信息项类型502为例来说明本公开的实施例。

例如,若对象分支指令的对象指令地址与跳转目标地址的高M位相同,则将对象指令信息以信息项类型502插入图6所示的表格Table 1。例如,若对象分支指令的对象指令地址与跳转目标地址的高M位不相同,则将对象指令信息以信息项类型506插入图6所示的表格Table 3。

由于目标类型分支指令不跳转的可能性很小,其后分支指令不在BTB中对性能的影响也会很小。因此,本公开的实施例对目标类型分支指令在类似图5这样的多类型BTB中进行优化配置,即避免将目标类型分支指令后同一入口的分支指令插入BTB中,而将目标类型分支指令配置在更小的例如信息项类型502项中,这样占资源更多、保存更多分支指令信息的信息项类型504项留给对性能影响更大的分支指令对,从而降低整体BTB未命中个数,提升CPU核性能。

图7示出了本公开至少一个实施例提供的另一种分支目标缓存的配置方法的流程图。

如图7所示,该配置方法除包括图3所示的步骤S301~S303之外,还包括步骤S304和步骤S305。步骤S304和步骤S305例如在步骤S303之前执行。

步骤S304:查询指令识别器获取对象分支指令的跳转参数,跳转参数用于指示对象分支指令的跳转概率。

步骤S305:基于跳转参数,确定对象分支指令是否为目标类型分支指令。

对于步骤S304,例如跳转参数为对对象分支指令跳转的计数值C,对象分支指令每跳转一次,则计数值C加1,C为正整数。若对象分支指令没有跳转,则计数值C更新为0和C-S中的最大值,S=1/(1-T)。例如,预设阈值T为95%,即T=0.95,则S=1/(1-0.95)=20。

对于步骤S305,若跳转参数C大于跳转最大值MT_Max,则对象分支指令为目标类型分支指令。

跳转最大值MT_Max是一个根据预设阈值T预设的值,通常设置为大于等于S。

在本公开的一些实施例中,分支目标缓存的配置方法还包括:响应于对象分支指令未命中至少一个信息项,判断对象分支指令是否为第一类型指令;响应于对象分支指令为第一类型指令,将对象分支指令以第一信息项类型插入分支目标缓存;以及响应于对象分支指令为第二类型指令,将对象分支指令以第二信息项类型插入分支目标缓存。该实施例请参考下文图8所示的步骤S802、步骤S806~S808。

在本公开的一些实施例中,分支目标缓存的配置方法还包括:响应于对象分支指令命中至少一个信息项中的命中信息项且为位于命中指令之前的无条件分支指令,从分支目标缓存删除命中信息项,并且判断对象分支指令是否为第一类型指令;响应于对象分支指令为第一类型指令,将对象分支指令以第一信息项类型插入分支目标缓存;以及响应于对象分支指令为第二类型指令,将对象分支指令以第二信息项类型插入分支目标缓存。该实施例请参考下文图8所示的步骤S803和步骤S805~S808。

图8示出了本公开至少一个实施例提供的另一种分支目标缓存的配置方法的流程图。

如图8所示,该配置方法包括步骤S801~S830。

步骤S801:确定新指令(即,对象分支指令)需要插入分支目标缓存(以下简称为“BTB”)。步骤S801例如类似于图3中步骤S301。

步骤S802:判断新指令是否命中BTB中的信息项。

若新指令未命中BTB中的信息项,执行步骤S806。若新指令命中BTB中的信息项,执行步骤S803。

步骤S803:响应于对象分支指令命中BTB,判断对象分支指令是否为位于命中指令之前的无条件分支指令。

若对象分支指令位于命中指令之前且为无条件分支指令,则执行步骤S805~S808。若对象分支指令不满足位于命中指令之前且为无条件分支指令,则执行步骤S804。

步骤S804:判断新指令是否为位于命中指令之前的目标类型分支指令。该步骤类似于图3中的步骤S303。

若新指令为位于命中指令之前且为目标类型分支指令,执行步骤S805~S808。若对象分支指令不满足位于命中指令之前且为目标类型分支指令,则执行步骤S809。

步骤S805,从表格中删除命中指令的命中信息项。

步骤S806:判断新指令是否是第一类型指令。如上所示,第一类型指令为指令地址和跳转地址的高M位不相同的分支指令。即,第一类型指令的跳转目标地址域的值为分支指令的完整长度的跳转目标地址而不是被压缩的跳转目标地址。

若新指令为第一类型指令,执行步骤S807,即将新指令以图5所示的信息项类型506插入表格。若新指令不为第一类型指令,执行步骤S808,即将新指令以图5所示的信息项类型502插入表格。

在本公开的一些实施例中,配置方法还可以包括:响应于对象分支指令命中至少一个信息项中的命中信息项且不满足对象分支指令为位于命中指令之前的目标类型分支指令,判断对象分支指令是否满足命中信息项包括多条命中指令的命中指令信息并且对象分支指令位于多条命中指令的后面;以及响应于对象分支指令满足命中信息项包括多条命中指令的命中指令信息并且对象分支指令位于多条命中指令的后面,则丢弃对象分支指令的对象指令信息。

例如,判断对象分支指令是否满足命中信息项包括两条命中指令的命中指令信息,并且对象分支指令位于这两条命中指令的后面(即,对象分支指令的对象指令地址大于这两条命中指令的任意一个)。该实施例请参考图8所示的步骤S809和步骤S810。

例如,如图8所示,若新指令不满足位于命中指令之前且为目标类型分支指令,则执行步骤S809。

步骤S809:判断命中信息项是否包括两条命中指令的命中指令信息,以及新指令在这两条命中指令的后面。

若命中信息项包括两条命中指令的命中指令信息,以及新指令在这两条命中指令的后面,则执行步骤S810。

步骤S810:新指令的指令信息不插入BTB,即丢弃该新指令的指令信息。

在本公开的一些实施例中,配置方法还可以包括:响应于对象分支指令不满足命中信息项包括多条命中指令的命中指令信息并且对象分支指令位于多条命中指令的后面,判断对象分支指令是否满足对象分支指令位于命中指令之后并且命中指令为无条件分支指令或者目标类型分支指令;以及响应于对象分支指令满足对象分支指令位于命中指令之后,并且命中指令为无条件分支指令或者目标类型分支指令,丢弃对象分支指令的指令信息。该实施例请参考图8所示的步骤S811和步骤S810。

例如,在图8的示例中,若步骤S809判断结果为否,即新指令不满足命中信息项包括两条命中指令的命中指令信息,以及新指令在这两条命中指令的后面,则执行步骤S811。

步骤S811:判断新指令是否满足位于命中指令之后并且命中指令为无条件分支指令或者目标类型分支指令。

若新指令满足位于命中指令之后并且命中指令为无条件分支指令或者目标类型分支指令,则执行步骤S810。

该实施例使得位于无条件分支指令或者目标类型分支指令之后的指令的指令信息不插入BTB,节约BTB资源。

在本公开的一些实施例中,若命中信息项包括两条命中指令,配置方法还可以包括:响应于对象分支指令不满足对象分支指令位于命中指令之后并且命中指令为无条件分支指令或者目标类型分支指令,将对象分支指令与两条命中指令中的第一条命中指令组成指令对,并且删除命中信息项,第一条命中指令为两条命中指令中地址最小的指令;判断指令对中地址最小的分支指令是否为目标类型分支指令;以及响应于指令对中地址最小的分支指令为目标类型分支指令,指令对中地址最小的分支指令以第二信息项类型存储到分支目标缓存。该实施例请参考图8所示的步骤S812~S815。

例如,在图8的示例中,若步骤S811判断结果为否,即新指令不满足位于命中指令之后并且命中指令为无条件分支指令或者目标类型分支指令,则执行步骤S812。

步骤S812:将新指令与两条命中指令中的第一条命中指令组成指令对。第一条命中指令是指两条命中指令中指令地址较小的命中指令。即,第一条命中指令和新指令组成一个指令对。

步骤S813:删除命中信息项。

步骤S814:判断指令对中地址最小的分支指令是否为目标类型分支指令。

例如,比较新指令的地址和第一条命中指令的地址,若新指令的地址小于第一条命中指令的地址,则判断新指令是否为目标类型分支指令。若第一条命中指令的地址小于新指令的地址,则判断第一条命中指令是否为目标类型分支指令。

若指令对中地址最小的分支指令为目标类型分支指令,则执行步骤S815。

步骤S815:指令对中地址最小的分支指令以信息项类型502插入表格。

在本公开的一些实施例中,配置方法还可以包括:响应于指令对中地址最小的分支指令不为目标类型分支指令,判断指令对中的每条分支指令是否都是第二类型指令;以及响应于指令对中的每条分支指令都是第二类型指令,将指令对中的两条分支指令的指令信息合并后以第三信息项类型存储到分支目标缓存中,第三信息项类型用于指示所针对的多条分支指令的指令信息被存储于分支目标缓存。该实施例请参考图8所示的步骤S816~S817。

例如,第三信息项类型用于存储2条分支指令的指令信息。例如,第三信息项类型为图5所示的信息项类型504。

例如,在图8的示例中,若步骤S814判断结果为否,即指令对中地址最小的分支指令不是目标类型分支指令,则执行步骤S816。

步骤S816:判断指令对中的每条分支指令是否都是第二类型指令。

例如,判断指令对中的两条分支指令各自的指令地址的高M位是否与各自跳转目标地址的高M位相同。

若每条分支指令都是第二类型指令,则执行步骤S817。

步骤S817:将指令对中的两条分支指令的指令信息合并后以信息项类型504插入表格。

在本公开的一些实施例中,配置方法还可以包括:响应于指令对中存在第一类型指令,判断指令对中地址最小的指令是否为第一类型指令;响应于指令对中地址最小的指令为第一类型指令,将指令对中地址最小的分支指令的指令信息以第一信息项类型插入分支目标缓存;以及响应于指令对中地址最小的指令不为第一类型指令,将指令对中地址最小的分支指令的指令信息以第二信息项类型插入分支目标缓存。该实施例请参考图8所示的步骤S818~S819。

例如,在图8的示例中,若步骤S816判断结果为否,则执行步骤S818。步骤S816判断结果为否是指非指令对中的每条分支指令都是第二类型指令。也就是说,指令对中存在第一类型指令,即分支指令的地址高M位和跳转目标地址的高M位不同。

步骤S818:判断指令对中地址最小的指令是否为第一类型指令。若指令对中地址最小的指令为第一类型指令,则执行步骤S819。即,若第一类型指令在指令对中另一指令的前面,则执行步骤S819。若指令对中地址最小的指令不为第一类型指令,则执行步骤S820。

步骤S819:将指令对中的在前指令以信息项类型506插入表格。

步骤S820:将指令对中的在前指令以信息项类型502插入表格。

本公开的另一方面提供了一种指令识别器的配置方法,该配置方法有利于判断分支指令是否是目标类型分支指令。

图9示出了本公开至少一个实施例提供的一种指令识别器的配置方法的流程图。指令识别器用于存储至少一个识别信息项。

如图9所示,该配置方法包括步骤S901~S903。

步骤S901:获取目标条件分支指令。

步骤S902:判断目标条件分支指令是否命中至少一个识别信息项。

步骤S903:响应于目标条件分支指令命中至少一个识别信息项,更新条件分支指令命中的命中识别信息项,以根据至少一个识别信息项判断待插入分支目标缓存的对象分支指令是否是目标类型分支指令,目标类型分支指令为跳转概率大于预设阈值的条件跳转指令。

在本公开的一些实施例中,指令识别器例如是一个表格,与大部分硬件表格相似,其组织方式可以为组相连映射结构(set associative)、全相连映射结构(full-associative)或者直接相连映射结构(directly access),其替换策略可以为最近最少使用算法(Least recently used,LRU)、伪LRU(Pseudo-LRU,PLRU)、重引用间隔预测算法(Re-Reference Interval Prediction,RRIP)等,本公开的实施例对此不作限制。如果一个入口后第一个分支指令为第二类型指令,且未命中指令识别器,则它会被插入指令识别器中。

在本公开的一些实施例中,指令识别器每一识别信息项例如包含如下域:有效域(Valid)、地址域(Tag)和跳转参数域。

有效域用于表示该识别信息是否有效;地址域例如用于指示所述每个识别信息项对应的条件分支指令的指令地址。例如,地址域中的数值为指令地址哈希后的哈希值,或者是指令地址本身。跳转参数域用于存储该识别信息项对应的条件分支指令的跳转参数。

为了节省空间,指令识别器表项中的Tag位数都要比指令地址的位数要小很多,其总项数也要比BTB总项数要少很多。具体表格参数选择由一个实现根据性能、面积等综合因素来决定。

对于步骤S901,目标条件分支指令可以是分支预测阶段的指令,或者也可以只已经执行结束(retire)的指令。

例如,获取目标条件分支指令包括:获取执行结束的条件分支指令作为目标条件分支指令。即,指令识别器可以选择在流水级的指令退出阶段(retire阶段)进行新指令插入或者命中信息项的跳转参数更新。

又例如,获取目标条件分支指令包括:获取进行分支预测后的条件分支指令作为目标条件分支指令。即,指令识别器可以选择在流水级的分支预测阶段进行新指令插入或者命中信息项的跳转参数更新。

在分支预测阶段进行新指令插入或者命中信息项的跳转参数更新使得识别信息项的信息能够较早更新。

在指令退出阶段进行新指令插入或者命中信息项的跳转参数更新,能够保证更新的信息的正确性。

在本公开的一些实施例中,可以根据性能评估选择在分支预测或是指令retire阶段来插入/更新指令识别器。

对于步骤S902,例如判断至少一个识别信息项是否存在与目标条件分支指令的指令地址相同的地址;响应于至少一个识别信息项存在与目标条件分支指令的指令地址相同的地址,目标条件分支指令命中指令识别器中的至少一个识别信息项。

例如,目标条件分支指令的指令地址为X,若指令识别器中存在一个识别信息项的指令地址为X,则目标条件指令命中指令识别器。

对于步骤S903,例如响应于目标条件分支指令命中至少一个识别信息项,更新命中识别信息项的当前跳转参数。

在本公开的一些实施例中,响应于目标条件分支指令命中至少一个识别信息项,更新命中识别信息项的当前跳转参数,包括:响应于目标条件分支指令跳转,当前跳转参数增加预设步长;或者响应于目标条件分支指令没有跳转,当前跳转参数更新为最大参数值,最大参数值是当前跳转参数与参考值之间的差值和0中的最大值,参考值是根据预设阈值确定的。

例如,预设步长为1,若目标条件分支指令跳转,则当前跳转参数C加1。若目标条件分支指令不跳转,C值更新为0与C-S两者中更大的值,即C=max{0,C–S},S为参考值。参考值S根据预设阈值T确定。例如,S=1/(1-T),比如T=0.95,S=1/(1-0.95)=20。

如图9所示,在本公开的一些实施例中,该配置方法除包括步骤S901~S903之外,还包括步骤S904和S905。

步骤S904:响应于目标条件分支指令未命中至少一个识别信息项,判断目标条件分支指令是否满足添加至指令识别器的添加条件。

步骤S905:响应于目标条件分支指令满添加条件,将目标条件分支指令的指令信息作为指令识别器的新信息项更新指令识别器,新信息项的跳转参数为预设初始值。

对于步骤S904,添加条件例如可以是上述是否是第二类型指令。本领域技术人员可以自行设置添加条件。

在本公开的一些实施例中,添加条件包括:目标条件分支指令在执行中跳转,目标条件分支指令为一个地址入口对应的第一条分支指令且为可缩短类型指令,可缩短类型指令为指令地址和跳转目标地址的高M位相同的分支指令。可缩短类型指令即为上述第二类型指令。这样能够进一步降低对指令识别器表格的压力(以减少它的面积)。

例如,为了进一步降低对指令识别器表格的压力,符合以下所有条件的分支指令才会被插入指令识别器中:该分支指令为条件分支指令、该分支指令为一个入口对应的第一条分支指令、该分支指令目标地址为可缩短类型指令以及该分支指令此次发生跳转。

本公开的另一方面提供了一种分支目标缓存的配置方法。图10示出了本公开至少一个实施例提供的一种分支目标缓存的配置方法的流程图。由于指令识别器中识别信息项是一个动态状态,一个在BTB中的分支指令也有可能变为目标类型指令,其访问时配置优化如图10所示。

如图10所示,配置方法包括步骤S1001~S1004。

步骤S1001:获取需要访问分支目标缓存的当前分支指令。

步骤S1002:判断当前分支指令是否命中至少一个信息项中多分支信息类型的命中信息项,多分支信息类型用于指示存储多条分支指令的指令信息。

步骤S1003:响应于当前分支指令命中多分支信息类型的信息项,判断多条分支指令的第一条指令是否为目标类型分支指令,第一条指令是指多条分支指令中地址最小的分支指令。

步骤S1004:响应于第一条指令为目标类型分支指令,删除命中信息项,并且将第一条指令作为新信息项插入分支目标缓存。

对于步骤S1002,BTB访问时对目标类型指令优化配置可以发生在分支预测或者指令retire时,这可以根据性能评估来做出选择。

目标类型分支指令为跳转概率大于预设阈值的条件跳转指令。

例如,在对当前分支指令进行分支预测时,判断当前分支指令是否命中至少一个信息项中多分支信息类型的命中信息项。

又例如,在当前分支指令执行结束后,判断判断当前分支指令是否命中至少一个信息项中多分支信息类型的命中信息项。

多分支信息项类型是指用于指示存储多条分支指令的指令信息的信息项类型,例如可以是图5所示的信息项类型504。

对于步骤S1003,第一条分支指令为多分支信息项类型的信息项中排在最前面的分支指令。

对于步骤S1004,关于目标分支类型指令请参考上文的描述。例如,若第一条指令为目标类型分支指令,则删除命中信息项,并且将第一条指令按照图5所示的信息项类型502插入分支目标缓存。

图11示出了本公开至少一个实施例提供的一种分支目标缓存的配置方法的流程图。

如图11所示,该配置方法包括步骤S1101~S1106。

步骤S1101:确定当前分支指令需要访问分支目标缓存。

步骤S1102:判断当前分支指令是否命中信息项类型504的信息项。若当前分支指令命中信息项类型504的信息项,执行步骤S1103;若当前分支指令未命中信息项类型504的信息项,则执行步骤S1006。步骤S1102类似于图10中的步骤S1002。

步骤S1103:判断命中信息项的第一条指令是否变成目标类型分支指令。步骤S1103类似于图10中的步骤S1003。若命中信息项的第一条指令变成目标类型分支指令,执行步骤S1104和步骤S1105。

步骤S1104:删除命中信息项。

步骤S1105:更新第一条指令信息并以信息项类型502插入表格。

步骤S1104和步骤S1105类似于图10中的步骤S1004。

步骤S1006:不更新分支目标缓存,即不对BTB进行任何操作。

在BTB中的目标类型指令变为非目标类型指令时无需改变目标类型指令本身信息,仅在其后指令被插入时,若命中指令为可缩短指令,则可以与其后的分支指令合并成为一个信息项类型504;否则它仍然保持为信息项类型506中,而不插入其后分支指令。

在本公开的上述实施例中,在访问BTB是看命中信息项中分支指令的状态(目标类型指令或者非目标类型指令)是否发生改变。在本公开的另一些实施例中,可以是在分支指令的状态发生改变时主动更改相应BTB项的配置。

在本公开的一些实施例中,BTB在流水线的分支预测阶段被访问或者更新。在分支预测阶段BTB与其他分支预测器组件会被访问,结果组合起来进行分支预测。

在本公开的一些实施例中,BTB在流水线的冲刷(flush)阶段被访问或者更新。当后端流水线发现分支预测错误时,会冲刷流水线,更新BTB及其他分支预测器组件,这时候新发现的分支指令会被插入BTB中,或者BTB命中项中信息(比如跳转地址)会被更新。

在本公开的一些实施例中,BTB在流水线的指令retire阶段被访问或者更新。指令retire阶段会对BTB命中项中信息(比如LRU、或者子类型等)更新。

图12示出了本公开至少一个实施例提供的另一种分支目标缓存的配置方法的流程图。

如图12所示,该配置方法包括步骤S01~S16。

步骤S01:确定新分支指令插入BTB。

步骤S02:判断新分支指令是否命中BTB。若新分支指令命中BTB,则执行步骤S03;若新分支指令未命中BTB,则执行步骤S05。

步骤S03:判断新分支指令是否位于命中指令之前,并且为无条件分支指令。

若新分支指令位于命中指令之前,并且为无条件分支指令,则执行步骤S04~S06。若新分支指令不满足位于命中指令之前并且为无条件分支指令,则执行步骤S08。

步骤S04:删除命中信息项。

步骤S05:判断新分支指令是否为第一类型分支指令。关于第一类型分支指令请参考上文的描述。

若新分支指令为第一类型分支指令,则执行步骤S06;若新分支指令不为第一类型分支指令,则执行步骤S07。

步骤S06:新分支指令的指令信息以图5所示的信息项类型506插入BTB。

步骤S07:新分支指令的指令信息以图5所示的信息项类型502插入BTB。

步骤S08:判断新分支指令是否满足命中的命中信息项有两条命中指令的指令信息并且新指令位于这两条命中指令之后。

若新分支指令满足命中的命中信息项有两条命中指令的指令信息并且新指令位于这两条命中指令之后,则不插入BTB。若新分支指令不满足命中的命中信息项有两条命中指令的指令信息并且新指令位于这两条命中指令之后,则执行步骤S09。

步骤S09:判断新指令是否位于命中的无条件分支指令之后。若新指令位于命中的无条件分支指令之后,则不插入BTB。若新指令不位于命中的无条件分支指令之后,则执行步骤S10。

步骤S10:新指令与命中信息项对应的第一条命中指令组成指令对。

步骤S11:删除命中信息项。

步骤S12:判断指令对中的两条指令是否都是第二类型分支指令。若指令对中的两条指令都是第二类型分支指令,则执行步骤S13。若指令对中的两条指令不都是第二类型分支指令,则执行步骤S14。

步骤S13:将指令对的指令信息以图5所示的信息项类型504插入表格。

步骤S14:在指令对中,第一类型分支指令是否在在前。若第一类型分支指令在前,则执行步骤S15;若第一类型分支指令不在前,则执行步骤S16。

步骤S15:将在前指令以图5所示的信息项类型506插入表格。

步骤S16:将在前指令以图5所示的信息项类型502插入表格。

图13示出了本公开至少一个实施例提供的一种分支预测器1300的示意性框图。

如图13所示,分支预测器1300包括分支目标缓存1310和分支预测控制单元1320。

分支目标缓存1310配置存储分支指令的指令信息。

分支预测控制单元1320配置为判断对象分支指令是否命中至少一个信息项;以及响应于对象分支指令命中至少一个信息项中的命中信息项,且对象分支指令为位于命中信息项对应的为位于命中指令之前的目标类型分支指令,从分支目标缓存删除命中信息项,并且将对象分支指令的对象指令信息插入分支目标缓存,目标类型分支指令为跳转概率大于预设阈值的条件跳转指令。

该分支预测器1300能够将紧缺的分支目标缓存的资源分配给对性能有更大提升的分支指令,从而带来系统整体性能提升。

分支预测器1300还包括指令识别器,配置为存储条件分支指令的跳转参数,跳转参数用于指示所述对象分支指令的跳转概率;所述分支预测控制单元还配置为:基于所述跳转参数,确定所述对象分支指令是否为所述目标类型分支指令。

需要说明的是,本公开的实施例中,分支预测器1300的各个单元与前述的分支目标缓存的配置方法的各个步骤对应,关于分支预测器1300的具体功能可以参考关于分支目标缓存的配置方法的相关描述,此处不再赘述。图13所示的分支预测器1300的组件和结构只是示例性的,而非限制性的,根据需要,该分支预测器1300还可以包括其他组件和结构。

图14示出了本公开至少一个实施例提供的一种指令识别器1400的示意性框图。

如图14所示,指令识别器1400包括获取单元1410、判断单元1420和更新单元1430。

获取单元1410配置为获取目标条件分支指令。

判断单元1420配置为判断目标条件分支指令是否命中至少一个识别信息项。

更新单元1430配置为响应于目标条件分支指令命中至少一个识别信息项,更新条件分支指令命中的命中识别信息项,以根据至少一个识别信息项判断待插入分支目标缓存的对象分支指令是否是目标类型分支指令,目标类型分支指令为跳转概率大于预设阈值的条件跳转指令。

需要说明的是,本公开的实施例中,指令识别器1400的各个单元与前述的指令识别器的配置方法的各个步骤对应,关于指令识别器1400的具体功能可以参考关于指令识别器的配置方法的相关描述,此处不再赘述。图14所示的指令识别器1400的组件和结构只是示例性的,而非限制性的,根据需要,该指令识别器1400还可以包括其他组件和结构。

本公开的至少一个实施例还提供了一种电子设备,该电子设备包括处理器,处理器包括本公开任一实施例提供的分支预测器和/或指令识别器。该电子设备能够将紧缺的分支目标缓存的资源分配给对性能有更大提升的分支指令,从而带来系统整体性能提升。

图15为本公开一些实施例提供的一种电子设备的示意框图。如图15所示,该电子设备1500包括处理器1510。处理器1510例如包括图12所示的分支预测器1200,处理器运行时可以执行上文所述的配置方法中的一个或多个步骤。

例如,处理器1510可以是中央处理单元(CPU)或者具有数据处理能力和/或程序执行能力的其它形式的处理单元。例如,中央处理单元(CPU)可以为X86架构、ARM架构或RISC-V架构等。处理器1510可以为通用处理器或专用处理器,可以控制电子设备1500中的其它组件以执行期望的功能。

需要说明的是,本公开的实施例中,电子设备1500的具体功能和技术效果可以参考上文中关于配置方法的描述,此处不再赘述。

图16为本公开一些实施例提供的另一种电子设备的示意框图。该电子设备1600包括一个或者多个处理器和存储器。存储器中存储有可执行指令,可执行指令在所述一个或多个处理器执行时实现本公开任一实施例提供的的配置方法。电子设备1600可以是终端设备等。需要注意的是,图16示出的电子设备1600仅仅是一个示例,其不会对本公开实施例的功能和使用范围带来任何限制。

如图16所示,电子设备1600可以包括处理装置(例如处理器或者中央处理器)1610,其可以根据存储在只读存储器(ROM)1620中的程序或者从存储装置1680加载到随机访问存储器(RAM)1630中的程序而执行各种适当的动作和处理。在RAM 1630中,还存储有电子设备1600操作所需的各种程序和数据。处理装置1610、ROM 1620以及RAM1630通过总线1640彼此相连。输入/输出(I/O)接口1650也连接至总线1640。

通常,以下装置可以连接至I/O接口1650:包括例如触摸屏、触摸板、键盘、鼠标、摄像头、麦克风、加速度计、陀螺仪等的输入装置1660;包括例如液晶显示器(LCD)、扬声器、振动器等的输出装置1670;包括例如磁带、硬盘等的存储装置1680;以及通信装置1690。通信装置1690可以允许电子设备1600与其他电子设备进行无线或有线通信以交换数据。虽然图16示出了具有各种装置的电子设备1600,但应理解的是,并不要求实施或具备所有示出的装置,电子设备1600可以替代地实施或具备更多或更少的装置。

例如,根据本公开的实施例,处理装置1610可以执行上述配置方法,可以实现本公开实施例提供的配置方法中限定的功能。

有以下几点需要说明:

(1)本公开实施例附图只涉及到本公开实施例涉及到的结构,其他结构可参考通常设计。

(2)在不冲突的情况下,本公开的实施例及实施例中的特征可以相互组合以得到新的实施例。

以上所述,仅为本公开的具体实施方式,但本公开的保护范围并不局限于此,本公开的保护范围应以所述权利要求的保护范围为准。

相关技术
  • 下发动态指令的方法及系统、配置后台服务器
  • 闪存主控装置配置状态指令轮询可调变定时器的方法
  • 服务器配置方法、装置以及电子设备
  • 分支指令的处理方法、分支预测器及处理器
  • 编码于分支指令中的双模态分支预测器
技术分类

06120116484880