一种针对处理器循环体的体系结构优化方法及装置转让专利

申请号 : CN202210096815.9

文献号 : CN114116010B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 廖述京陈钦树欧艳凤朱晓明黄旭松

申请人 : 广东省新一代通信与网络创新研究院

摘要 :

本公开提供了一种针对处理器循环体的体系结构优化方法及装置,该方法包括:判断当前指令是否为短循环体指令,若是,则将当前指令缓存在短循环体缓存中;对当前指令的PC值进行查表,若表中存在有效的记录相匹配,则确定当前指令为控制循环体的条件分支指令,从表中相应的jump_pc处开始预取后续指令。本公开提供的一种针对处理器循环体的体系结构优化方法及装置,能够更低功耗且更高效快速地取出短循环体分支指令,降低了流水线中空泡的概率,从而尽可能地避免了流水线因为取指慢而造成的内核性能低的问题;实现了更准确的循环体预测,并且能够快速检测循环体控制用的条件分支指令,减少了流水线冲刷的频率,提高了处理器的性能。

权利要求 :

1.一种针对处理器循环体的体系结构优化方法,其特征在于,包括以下步骤:获取取指的当前指令;

判断当前指令是否为短循环体指令,若是,则将当前指令缓存在短循环体缓存short loop buffer中,若否,则当前指令不进行缓存;

对当前指令的PC值进行查表,判断当前指令PC值在表loop table中是否有有效的记录相匹配,所述表loop table中记录的信息包括控制循环体的条件分支指令PC值cur_br_pc、预测该条件分支指令的跳转地址jump_pc以及相应条目的有效性valid;

若表loop table中存在有效的记录相匹配,则确定当前指令为控制循环体的条件分支指令,从表中相应的jump_pc处开始预取后续指令,并对当前指令进行解码和执行,所述后续指令从icache或short loop buffer中取得;

若表loop table中不存在有效的记录相匹配,则仅对当前指令进行解码和执行;

其中,若表loop table中不存在有效的记录相匹配,则仅对当前指令进行解码和执行包括,

对当前指令进行解码,根据解码结果,判断当前指令是否为条件分支指令,若不是条件分支指令,则不对表loop table进行操作;

若是条件分支指令,则根据当前指令的执行结果,判断当前指令的跳转方向是否是PC值更小的方向;

若不是,则不对表loop table进行操作;

若是,则确定当前指令是循环体分支指令,对表loop table进行更新操作,将当前指令对应的cur_br_pc和jump_pc更新到表loop table中,并设置条目的有效性valid为有效true。

2.根据权利要求1所述的一种针对处理器循环体的体系结构优化方法,其特征在于,所述判断当前指令是否为短循环体指令包括:获取当前指令的历史执行结果;

根据当前指令的历史执行结果,判断当前指令是否为循环体指令,若当前指令为循环体指令,则判断当前指令的长度是否符合短循环体长度的要求,若当前指令的长度符合短循环体长度的要求,则确定当前指令为短循环指令。

3.根据权利要求1所述的一种针对处理器循环体的体系结构优化方法,其特征在于,确定当前指令为控制循环体的条件分支指令,从表中相应的jump_pc处开始预取后续指令包括:

判断当前指令是否命中short loop buffer,若命中short loop buffer,则从short loop buffer取出所需指令;

若未命中short loop buffer,则从icache取出所需指令。

4.一种针对处理器循环体的体系结构优化装置,用于实现权利要求1‑3中任一所述一种针对处理器循环体的体系结构优化方法,其特征在于,包括:短循环体判断模块,用于判断当前指令是否为短循环体指令;

短循环体缓存,用于当当前指令为短循环体指令时,缓存当前指令;

循环体条件分支预测模块,用于预测当前指令是否为控制循环体的条件分支指令,对当前指令的PC值进行查表,判断当前指令PC值在表loop table中是否有有效的记录相匹配,所述表loop table中记录的信息包括控制循环体的条件分支指令PC值cur_br_pc、预测该条件分支指令的跳转地址jump_pc以及相应条目的有效性valid;

指令预取模块,用于当前指令为控制循环体的条件分支指令时,根据查表所的jump_pc处开始预取后续指令,所述后续指令从icache或short loop buffer中取得;

表loop table更新模块,用于在表loop table中不存在有效的记录相匹配时,根据解码结果和执行结果判断是否对表loop table进行更新操作;

表loop table更新模块包括:条件分支指令判断子模块,用于根据解码结果,判断当前指令是否为条件分支指令,若不是条件分支指令,则不对表loop table进行操作;

循环体分支指令判断子模块,用于当当前指令为条件分支指令时,根据当前指令的执行结果,判断当前指令的跳转方向是否是PC值更小的方向;若不是,则不对表loop table进行操作;

表更新子模块,用于当当前指令是循环体分支指令时,对表loop table进行更新操作,将当前指令对应的cur_br_pc和jump_pc更新到表loop table中,并设置条目的有效性valid为有效true。

5.根据权利要求4所述的一种针对处理器循环体的体系结构优化装置,其特征在于,所述短循环体判断模块包括:

循环体判断子模块,用于获取当前指令的历史执行结果,并根据当前指令的历史执行结果判断当前指令是否为循环体指令;

短循环体判断子模块,用于当当前指令为循环体指令时,判断当前指令的长度是否符合短循环体长度的要求,若当前指令的长度符合短循环体长度的要求,则确定当前指令为短循环指令。

6.根据权利要求4所述的一种针对处理器循环体的体系结构优化装置,其特征在于,指令预取模块中还包括,

SLB命中模块,用于判断当前指令是否命中short loop buffer,若命中short loop buffer,则从short loop buffer取出所需指令;

若未命中short loop buffer,则从icache取出所需指令。

说明书 :

一种针对处理器循环体的体系结构优化方法及装置

技术领域

[0001] 本公开涉及计算机技术领域,尤其涉及一种针对处理器循环体的体系结构优化方法及装置。

背景技术

[0002] 在程序中,通常存在大量的循环语句。在C代码中,一般体现为for、while、do...while形式的语句。循环体内的内容,需要重复取指、重复执行。只是由于寄存器内容
有所区别,导致执行的结果并不一样。
[0003] 首先,在分支预测方面,目前对于循环体的分支预测行为,学术界有提出过“向后跳转,向前不跳转”的策略,这里的向后跳指跳转目标地址小于当前地址,向前跳指的是跳
转目标地址大于当前地址。但是针对循环体是如何检测的内容并没有提及。循环体中的条
件分支指令,很容易和非循环体中的条件分支指令混淆,如何快速有效且稳定的区分,这是
一个关键性的问题。
[0004] 另一方面,前端取指一般着重于指令如何快速访问icache取出以及指令预取,对于减少短循环体(循环体的指令数量较少)访问cache次数以节省功耗,并加快短循环体指
令的取出方面,这类研究很少受到重视。

发明内容

[0005] 本公开的目的是要提供一种针对处理器循环体的体系结构优化方法及装置,可以解决上述现有技术问题中的一个或者多个。
[0006] 根据本公开的一个方面,提供了一种针对处理器循环体的体系结构优化方法,包括以下步骤:
[0007] 获取取指的当前指令;
[0008] 判断当前指令是否为短循环体指令,若是,则将当前指令缓存在短循环体缓存short loop buffer中,若否,则当前指令不进行缓存;
[0009] 对当前指令的PC值进行查表,判断当前指令PC值在表loop table中是否有有效的记录相匹配,表loop table中记录的信息包括控制循环体的条件分支指令PC值cur_br_pc、
预测该条件分支指令的跳转地址jump_pc以及相应条目的有效性valid;
[0010] 若表loop table中存在有效的记录相匹配,则确定当前指令为控制循环体的条件分支指令,从表中相应的jump_pc处开始预取后续指令,并对当前指令进行解码和执行,后
续指令从icache或short loop buffer中取得;
[0011] 若表loop table中不存在有效的记录相匹配,则仅对当前指令进行解码和执行。
[0012] 在可能的实施方式中,判断当前指令是否为短循环体指令包括:
[0013] 获取当前指令的历史执行结果;
[0014] 根据当前指令的历史执行结果,判断当前指令是否为循环体指令,
[0015] 若当前指令为循环体指令,则判断当前指令的长度是否符合短循环体长度的要求,若当前指令的长度符合短循环体长度的要求,则确定当前指令为短循环指令。
[0016] 在可能的实施方式中,若表loop table中不存在有效的记录相匹配,则仅对当前指令进行解码和执行包括,
[0017] 对当前指令进行解码,根据解码结果,判断当前指令是否为条件分支指令,若不是条件分支指令,则不对表loop table进行操作;
[0018] 若是条件分支指令,则根据当前指令的执行结果,判断当前指令的跳转方向是否是PC值更小的方向;
[0019] 若不是,则不对表loop table进行操作;
[0020] 若是,则确定当前指令是循环体分支指令,对表loop table进行更新操作,将当前指令对应的cur_br_pc和jump_pc更新到表loop table中,并设置条目的有效性valid为有
效true。
[0021] 在可能的实施方式中,确定当前指令为控制循环体的条件分支指令,从表中相应的jump_pc处开始预取后续指令包括:
[0022] 判断当前指令是否命中short loop buffer,
[0023] 若命中short loop buffer,则从short loop buffer取出所需指令;
[0024] 若未命中short loop buffer,则从icache取出所需指令。
[0025] 根据本公开的另一个方面,提供了一种针对处理器循环体的体系结构优化装置,用于实现上述任一一种针对处理器循环体的体系结构优化方法,包括:
[0026] 短循环体判断模块,用于判断当前指令是否为短循环体指令;
[0027] 短循环体缓存,用于当当前指令为短循环体指令时,缓存当前指令;
[0028] 循环体条件分支预测模块,用于预测当前指令是否为控制循环体的条件分支指令,对当前指令的PC值进行查表,判断当前指令PC值在表loop table中是否有有效的记录
相匹配,表loop table中记录的信息包括控制循环体的条件分支指令PC值cur_br_pc、预测
该条件分支指令的跳转地址jump_pc以及相应条目的有效性valid;
[0029] 指令预取模块,用于当前指令为控制循环体的条件分支指令时,根据查表所的jump_pc处开始预取后续指令,后续指令从icache或short loop buffer中取得。
[0030] 在可能的实施方式中,短循环体判断模块包括:
[0031] 循环体判断子模块,用于获取当前指令的历史执行结果,并根据当前指令的历史执行结果判断当前指令是否为循环体指令;
[0032] 短循环体判断子模块,用于当当前指令为循环体指令时,判断当前指令的长度是否符合短循环体长度的要求,若当前指令的长度符合短循环体长度的要求,则确定当前指
令为短循环指令。
[0033] 在可能的实施方式中,还包括表loop table更新模块,用于在表loop table中不存在有效的记录相匹配时,根据解码结果和执行结果判断是否对表loop table进行更新操
作。
[0034] 在可能的实施方式中,表loop table更新模块包括:
[0035] 条件分支指令判断子模块,用于根据解码结果,判断当前指令是否为条件分支指令,若不是条件分支指令,则不对表loop table进行操作;
[0036] 循环体分支指令判断子模块,用于当当前指令为条件分支指令时,根据当前指令的执行结果,判断当前指令的跳转方向是否是PC值更小的方向;若不是,则不对表loop 
table进行操作;
[0037] 表更新子模块,用于当当前指令是循环体分支指令时,对表loop table进行更新操作,将当前指令对应的cur_br_pc和jump_pc更新到表loop table中,并设置条目的有效
性valid为有效true。
[0038] 在可能的实施方式中,指令预取模块中还包括,
[0039] SLB命中模块,用于判断当前指令是否命中short loop buffer,
[0040] 若命中short loop buffer,则从short loop buffer取出所需指令;
[0041] 若未命中short loop buffer,则从icache取出所需指令。
[0042] 本公开提供的一种针对处理器循环体的体系结构优化方法及装置,通过设置短循环体缓存,能够更低功耗且更高效快速地取出短循环体分支指令,降低了流水线中空泡的
概率,从而尽可能地避免了流水线因为取指慢而造成的内核性能低的问题;通过设置记录
有条件分支指令PC值和预测的跳转地址的表,进行查表操作,实现了更准确的循环体预测,
并且能够快速检测循环体控制用的条件分支指令,减少了流水线冲刷的频率,提高了处理
器的性能。
[0043] 另外,在本公开技术方案中,凡未作特别说明的,均可通过采用本领域中的常规手段来实现本技术方案。

附图说明

[0044] 为了更清楚地说明本公开实施例的技术方案,下面将对实施例描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本公开的一些实施例,对于本领
域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附
图。
[0045] 图1为本公开实施例提供的一种针对处理器循环体的体系结构优化方法的流程图。
[0046] 图2为C语言中for循环和if结构翻译成汇编的示例。
[0047] 图3为表loop table中记录的信息示例。
[0048] 图4为初始化后loop table的示例。
[0049] 图5为新增条目内容到初始化的表loop table的示例。
[0050] 图6为表looptable条目内容替换示例。
[0051] 图7为本公开实施例提供的一种针对处理器循环体的体系结构优化装置的结构示意图。

具体实施方式

[0052] 本公开说明书和权利要求书中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。此外,术语“包括”和“具有”以及他们的任何变形,
意图在于覆盖不排他的包含,例如包含了一系列的步骤或单元的过程、方法、系统、产品或
设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过
程、方法、系统、产品或设备固有的其他步骤或单元。
[0053] 为使本公开实施例的目的、技术方案和优点更加清楚,下面将结合本公开实施例中的附图,对本公开实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是
本公开一部分实施例,而不是全部的实施例。基于本公开中的实施例,本领域普通技术人员
在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本公开保护的范围。
[0054] 参考说明书附图1,提供了本公开一个实施例提供的一种针对处理器循环体的体系结构优化方法,包括以下步骤:
[0055] 步骤1:获取取指的当前指令;
[0056] 步骤2:判断当前指令是否为短循环体指令,若是,执行步骤3,若否,执行步骤4;
[0057] 步骤3:将当前指令缓存在短循环体缓存short loop buffer中,执行步骤4;
[0058] 步骤4:对当前指令的PC值进行查表,判断当前指令PC值在表loop table中是否有有效的记录相匹配,表loop table中记录的信息包括控制循环体的条件分支指令PC值cur_
br_pc、预测该条件分支指令的跳转地址jump_pc以及相应条目的有效性valid;若表loop 
table中存在有效的记录相匹配,则执行步骤5;若若表loop table中不存在有效的记录相
匹配,执行步骤6;
[0059] 步骤5:确定当前指令为控制循环体的条件分支指令,从表中相应的jump_pc处开始预取后续指令,后续指令从icache或short loop buffer中取得,并执行步骤6;
[0060] 步骤6:对当前指令进行解码和执行。
[0061] 在可选的实施例中,在步骤2中,判断当前指令是否为短循环体指令包括:
[0062] 步骤2.1:获取指令的历史执行结果;
[0063] 步骤2.2:根据指令的历史执行结果,判断当前指令是否为循环体指令;
[0064] 步骤2.3:若当前指令为循环体指令,则判断当前指令的长度是否符合短循环体长度的要求,若当前指令的长度符合短循环体长度的要求,则确定当前指令为短循环指令。
[0065] 由于循环体指令执行的规律是,循环体指令会重复取指,然后重复执行。而icache一般都是32KB/64KB这样的比较小的memory。icache利用空间局限性原理,会把最近访问的
指令数据缓存起来。memory内存大小越小,访问速度越快。循环体这样的连续高频访问
icache,会导致功耗较大。因此,设置短循环体缓存short loop buffer(后文简写成SLB),
通过循环体检测和短循环体判定,并在步骤3中将短循环体缓存在SLB中,由此,在后续指令
预取时,可直接从SLB中取出相应的指令,减少在icache中的检索时间,降低功耗,达到加速
短循环体取指,提升处理器性能的效果。
[0066] 具体的,在指令执行阶段,根据检测到的条件分支指令是否向PC值更小的方向(即向后跳),可判断执行的指令是否是循环体中的指令,并且可认定循环体的一层指令段代码
pc范围是[cur_pc,jump_pc],其中cur_pc表示当前指令的PC值,jump_pc表示当前指令跳转
地址。由此,根据指令的历史执行结果,能够对后续取出的指令是否是循环体进行判断。
[0067] 具体的,假设短循环体的首尾指令pc分别为start_pc和end_pc,那么短循环体的长度为end_pc‑start_pc。由于一个pc对应1B数据,而短循环体缓存SLB也是以pc进行索引
的,因此短循环体的长度应小于或等于SLB的大小。
[0068] 参考说明书附图2,示出了C语言中for循环和if结构翻译成汇编的示例,循环体和if结构,在编译成可执行文件后,都会包含条件分支指令,因此需要判断当前指令是否为循
环体的条件分支指令,需要说明的是,本申请中循环体的条件分支指令,指的是控制循环体
的条件分支指令。
[0069] 循环体的条件分支指令,和if结构中的条件分支指令,在汇编层次上,没有很明显的区别。两者都是比较两个寄存器中的值,并根据分支结果进行跳转。但在对for循环和if
结构的编译和反汇编中可以得到以下结论,条件满足时跳转方向为PC值更小的方向(向后
跳)的,只能是循环体的分支指令;条件满足时跳转方向为PC值更大的方向(向前跳)的,只
能是if结构体的分支指令。
[0070] 参考说明书附图2,在for循环中,以pc=12为例,当条件满足时,pc=4,pc值变小,向后跳;条件不满足时,pc=12+4,pc值变大,向前跳。在if结构中,以pc=0为例,当条件不满足
时,pc=0+4,pc值变大,向前跳;条件满足时,pc=8,pc值变大,向前跳。
[0071] 但是,由于在取指阶段还并未对条件分支指令进行执行,无法明确知道该条件分支实际上会向前跳还是向后跳,因此需要预测后续跳转方向以及跳转地址,以提前取出所
需的指令,
[0072] 因此,在步骤4中,设置表loop table用来记录控制循环体的条件分支指令PC值、预测该条件分支指令跳转地址以及该条目是否有效。参考说明书附图3,示出了表loop 
table中记录的信息。对于当前指令来说,若当前指令的PC在表loop table中存在有效的记
录相匹配,那么即可判定当前指令为控制循环体的条件分支指令,并可以预测循环体后续
将从jump_pc处开始取指,从而提前从icache或短循环体缓存short loop buffer中取指。
由此,实现对循环体段的指令以较大正确概率进行预期,减少了后端因为等待取指而造成
的性能损失。
[0073] 在可选的实施例中,在步骤5中,确定当前指令为控制循环体的条件分支指令,从表中相应的jump_pc处开始预取后续指令包括:
[0074] 步骤5.1:判断当前指令是否命中short loop buffer,若命中short loop buffer,则执行步骤5.2,若未命中short loop buffer,则执行步骤5.3;
[0075] 步骤5.2:从short loop buffer取出所需指令;
[0076] 步骤5.3:从icache取出所需指令。
[0077] 具体的,SLB作为一个缓存,涉及写操作和读操作。写操作即SLB更新,读操作即从SLB取指。
[0078] SLB的大小(SLB_SIZE),直接决定了能缓存的最大指令数量。一般来说,一个地址对应1B大小的数据,即一个pc中存放1B的数据。不过,对于rv64g,由于其指令只能为4B,因
此其pc对齐到4N,即pc只能为4N,否则内核应当报错地址未对齐。而对于rv64gc,由于其指
令可以为4B或2B,因此pc至少要对齐到2N。
[0079] 为存储两层的短循环体指令,SLB的大小应大于128B,但为了获得高速取指和低功耗有益效果,SLB最大应小于1024B。考虑到超标量处理器一般一次需要取出多个指令,如2
发射处理器,那么就需要同时从cache中取出2个指令。如果这四个指令都是32位长的标准
指令,那么一个取指地址就需要取出2*32b=64b=8B大小指令数据。
[0080] 由于指令的最小粒度为2B(即压缩指令),因此可以设计SLB每个bank中一个地址对应的数据大小为2B。本实施例以取指位宽8B为例,举例说明SLB的写操作和读操作的实
现。由于一次需要取出8B数据,而一个SLB bank只能提供2B数据,因此需要4个bank。
[0081] 为了更好地控制SLB内容读写,设计了三个关键的寄存器,功能如下:
[0082] slb_start:指示当前SLB缓存指令的pc从何处开始;
[0083] slb_end:指示当前SLB缓存指令的pc从何处结束;
[0084] slb_valid:指示当前SLB中是否有缓存有效指令,即是否存有短循环体指令。
[0085] 下面举例对两种情况下的写SLB操作进行说明。
[0086] 第一种情况,当SLB无效或覆盖SLB内容时。以前述一个取指地址需要取出2*32b=64b=8B大小指令数据为例,此时若slb_valid==false,且向后跳条件分支指令的br_pc‑
jump_pcvalid&&((br_pc>slb_end)||(jump_pc据d[63:0]缓存到SLB。
[0087] 此时,需要分四种情况,决定访问SLB各个bank的地址,以及往各个bank写入的数据:
[0088] 如果fetch_pc==4N,则:
[0089] {bank3_addr,bank2_addr,bank1_addr,bank0_addr}={N,N,N,N},
[0090] {bank3_data,bank2_data,bank1_data,bank0_data}={d[63,48],d[47,32],d[31:16],d[15:0]}。
[0091] 如果fetch_pc==4N+1,则:
[0092] {bank3_addr,bank2_addr,bank1_addr,bank0_addr}={N,N,N,N+1},
[0093] {bank3_data,bank2_data,bank1_data,bank0_data}={d[47,32],d[31:16],d[15:0],d[63,48]}。
[0094] 如果fetch_pc==4N+2,则:
[0095] {bank3_addr,bank2_addr,bank1_addr,bank0_addr}={N,N,N+1,N+1},
[0096] {bank3_data,bank2_data,bank1_data,bank0_data}={d[31:16],d[15:0],d[63,48],d[47,32]}。
[0097] 如果fetch_pc==4N+3,则:
[0098] {bank3_addr,bank2_addr,bank1_addr,bank0_addr}={N,N+1,N+1,N+1},
[0099] {bank3_data,bank2_data,bank1_data,bank0_data}={d[15:0],d[63,48],d[47,32],d[31:16]}。
[0100] 第二种情况,如果是多层循环,当外层循环已经将其指令段保存在SLB中,则内存循环无需重新保存内循环指定段代码到SLB。
[0101] 如果slb_valid&&((cur_pc≤slb_end)||(jump_pc≥slb_start)),则不做任何操作,因为内循环指令已包含在外循环代码段,因此无需重新取指填充SLB。
[0102] 下面举例对读SLB操作进行说明。
[0103] 读SLB的过程,需要判断是否命中SLB。
[0104] 具体的,判断当前指令是否命中SLB,可以根据循环体条件分支指令的当前指令PC值cur_pc和其跳转地址jump_pc判断,即判断条件为slb_valid&&(cur_pc≤slb_end)&&
(jump_pc≥slb_start)。
[0105] 在命中SLB后,则以addr=cur_pc‑slb_start索引SLB表,从4个bank中取出数据的拼接获得所需的8B指令数据。
[0106] 读出的4个2B数据按顺序拼接,具体拼接方案取决于addr值:
[0107] 如果addr=8N,则:
[0108] 访问每个bank的地址为:
[0109] {bank3_addr,bank2_addr,bank1_addr,bank0_addr}={N,N,N,N},
[0110] 从4个bank中读取的数据拼接后为:
[0111] {bank3_data,bank2_data,bank1_data,bank0_data};
[0112] 如果addr=8N+1,则:
[0113] 访问每个bank的地址为:
[0114] {bank3_addr,bank2_addr,bank1_addr,bank0_addr}={N,N,N,N+1},
[0115] 从4个bank中读取的数据拼接后为:
[0116] {bank0_data,bank3_data,bank2_data,bank1_data};
[0117] 如果addr=8N+2,则:
[0118] 访问每个bank的地址为:
[0119] {bank3_addr,bank2_addr,bank1_addr,bank0_addr}={N,N,N+1,N+1},
[0120] 从4个bank中读取的数据拼接后为:
[0121] {bank1_data,bank0_data,bank3_data,bank2_data};
[0122] 如果addr=8N+3,则:
[0123] 访问每个bank的地址为:
[0124] {bank3_addr,bank2_addr,bank1_addr,bank0_addr}={N,N+1,N+1,N+1},
[0125] 从4个bank中读取的数据拼接后为:
[0126] {bank2_data,bank1_data,bank0_data,bank3_data}。
[0127] 在可选的实施例中,若表loop table中不存在有效的记录相匹配,则对当前指令进行解码和执行后还包括,
[0128] 步骤6.1:对当前指令进行解码,根据解码结果,判断当前指令是否为条件分支指令,若不是条件分支指令,则执行步骤6.2;若是条件分支指令,则执行步骤6.3;
[0129] 步骤6.2:不对表loop table进行操作;
[0130] 步骤6.3:根据当前指令的执行结果,判断当前指令的跳转方向是否是PC值更小的方向;若不是,则执行步骤6.2;若是,则执行步骤6.4;
[0131] 步骤6.4:确定当前指令是循环体分支指令,对表loop table进行更新操作,将当前指令对应的cur_br_pc和jump_pc更新到表loop table中,并设置条目的有效性valid为
有效true。
[0132] 由此,通过表loop table来预测当前指令是否属于循环体条件分支指令;当表loop table不存在当前指令能匹配的条目时,通过检测条件分支指令执行结果是否向后跳
转,来判断当前指令是否为循环体条件分支指令。
[0133] 当表loop table不存在当前指令能匹配的条目,但根据当前指令执行的结果确定当前指令属于控制循环体的条件分支指令时,需要对表loop table进行更新。
[0134] 由于分支预测本身就是基于历史跳转行为,来预测该分支指令的后续跳转方向与跳转地址。程序在一段时间内,访问的指令具有局部性。即最近指令过的指令,相对有更高
概率会再次执行。因此,loop table中应当保存执行过的跳转指令及其预测的跳转地址,即
在进行loop table条目替换时,应当替换最古老的条目。
[0135] 具体的,可以为looptable增加一个用于指示最古老条目的索引:oldest_entry_index。next_entry_index用于指示下次往loop table新增条目内容或者替换条目内容时
的表索引。参考说明书附图4,示出了初始化后loop table的示例。此时,loop table中所有
条目都是无效的,即没有条件分支的跳转方向和跳转地址预测,next_entry_index=
oldest_entry_index=0。
[0136] 当需要新增条目内容时,保持oldest_entry_index不变,将指令执行阶段反馈的循环体条件指令的cur_br_pc1和跳转地址jump_pc1这组信息新增到索引为0的条目中,将
valid设置为true,并更新next_entry_index=next_entry_index+1=1。可以执行以上新增
条目操作,直到next_entry_index=N‑1,其中,N表示表loop table的深度。参考说明书附图
5所示,新增条目内容到初始化的表loop table的示例。
[0137] 由于表loop table深度有限,当表loop table中所有条目都存有有效的循环体条件分支指令的跳转地址时,又有新的信息需要写入时,就需要重写loop table条目。参考说
明书附图6示出的表looptable条目内容替换示例,即当表loop table的所有条目valid==
true时,将需要写入的信息替换到oldest_entry_index索引处,并更新oldest_entry_
index++,next_entry_index++。由此,可以保证loop table中一直保存的最近分支跳转地
址。
[0138] 本公开提供的一种针对处理器循环体的体系结构优化方法,通过设置短循环体缓存,能够更低功耗且更高效快速地取出短循环体分支指令,降低了流水线中空泡的概率,从
而尽可能地避免了流水线因为取指慢而造成的内核性能低的问题;通过设置记录有条件分
支指令PC值和预测的跳转地址的表,进行查表操作,实现了更准确的循环体预测,并且能够
快速检测循环体控制用的条件分支指令,减少了流水线冲刷的频率,提高了处理器的性能,
能够广泛应用于对性能有较高要求的超标量处理器中。
[0139] 实施例2:
[0140] 在本实施例中,参考说明书附图7,提供了一种针对处理器循环体的体系结构优化装置,用于实现上述方法实施例中任一一种针对处理器循环体的体系结构优化方法,一种
针对处理器循环体的体系结构优化装置至少包括:
[0141] 短循环体判断模块,用于判断当前指令是否为短循环体指令;
[0142] 短循环体缓存,用于当当前指令为短循环体指令时,缓存当前指令;
[0143] 循环体条件分支预测模块,用于预测当前指令是否为控制循环体的条件分支指令,对当前指令的PC值进行查表,判断当前指令PC值在表loop table中是否有有效的记录
相匹配,表loop table中记录的信息包括控制循环体的条件分支指令PC值cur_br_pc、预测
该条件分支指令的跳转地址jump_pc以及相应条目的有效性valid;
[0144] 指令预取模块,用于当前指令为控制循环体的条件分支指令时,根据查表所的jump_pc处开始预取后续指令,后续指令从icache或short loop buffer中取得。
[0145] 在可选的实施例中,短循环体判断模块包括:
[0146] 循环体判断子模块,用于获取当前指令的历史执行结果,并根据当前指令的历史执行结果判断当前指令是否为循环体指令;
[0147] 短循环体判断子模块,用于当当前指令为循环体指令时,判断当前指令的长度是否符合短循环体长度的要求,若当前指令的长度符合短循环体长度的要求,则确定当前指
令为短循环指令。
[0148] 在可选的实施例中,还包括表loop table更新模块,用于在表loop table中不存在有效的记录相匹配时,根据解码结果和执行结果判断是否对表loop table进行更新操
作。
[0149] 在可选的实施例中,表loop table更新模块包括:
[0150] 条件分支指令判断子模块,用于根据解码结果,判断当前指令是否为条件分支指令,若不是条件分支指令,则不对表loop table进行操作;
[0151] 循环体分支指令判断子模块,用于当当前指令为条件分支指令时,根据当前指令的执行结果,判断当前指令的跳转方向是否是PC值更小的方向;若不是,则不对表loop 
table进行操作;
[0152] 表更新子模块,用于当当前指令是循环体分支指令时,对表loop table进行更新操作,将当前指令对应的cur_br_pc和jump_pc更新到表loop table中,并设置条目的有效
性valid为有效true。
[0153] 在可选的实施例中,指令预取模块中还包括,
[0154] SLB命中模块,用于判断当前指令是否命中short loop buffer,
[0155] 若命中short loop buffer,则从short loop buffer取出所需指令;
[0156] 若未命中short loop buffer,则从icache取出所需指令。
[0157] 本公开提供的一种针对处理器循环体的体系结构优化方法及装置,通过设置短循环体缓存,能够更低功耗且更高效快速地取出短循环体分支指令,降低了流水线中空泡的
概率,从而尽可能地避免了流水线因为取指慢而造成的内核性能低的问题;通过设置记录
有条件分支指令PC值和预测的跳转地址的表,进行查表操作,实现了更准确的循环体预测,
并且能够快速检测循环体控制用的条件分支指令,减少了流水线冲刷的频率,提高了处理
器的性能。
[0158] 上述本说明书实施例先后顺序仅仅为了描述,不代表实施例的优劣。且上述对说明书特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权
利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现
期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实
现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
[0159] 本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于装置实
施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例
的部分说明即可。
[0160] 本领域普通技术人员可以理解实现上述实施例的全部或部分步骤可以通过硬件来完成,也可以通过程序来指令相关的硬件完成,程序可以存储于一种计算机可读存储介
质中,上述提到的存储介质可以是只读存储器,磁盘或光盘等。
[0161] 以上仅为本公开的较佳实施例,并不用以限制本公开,凡在本公开的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本公开的保护范围之内。