一种实现处理器预执行的方法及相应的装置转让专利

申请号 : CN201110131830.4

文献号 : CN102184127B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 程旭党向磊王箫音佟冬陆俊林易江芳王克义

申请人 : 北京北大众志微系统科技有限责任公司

摘要 :

本发明提供了一种实现处理器预执行的方法及相应的装置,方法包括:处理器在正常执行指令期间,当检测到发生长延时缓存失效时备份寄存器;在预执行指令期间,对预执行的每一指令标记预执行结果的状态;对引发长延时缓存失效的Load指令进行值预测,并使用经该值预测的预测值预执行与该Load指令数据相关的后续指令;按程序顺序将预执行结果保存在指令复用队列IRQ,并根据标记的状态设置相应的标志。本发明结合值预测和指令复用两种技术,充分发挥了各自的优势,在提高处理器性能的同时降低其预执行的能耗开销,因此提高处理器的能效性。

权利要求 :

1.一种实现处理器预执行的方法,其特征在于,包括处理器执行的以下步骤:

在正常执行指令期间,当检测到发生长延时缓存失效时,建立检查点备份寄存器堆,并为所述寄存器堆中的寄存器配置状态标志域;

在预执行指令期间,对预执行的每一指令通过所述状态标志域标记预执行结果的状态,包括无效状态、预测可复用状态、预测不可复用状态以及有效状态中的一种;对于引发所述预执行的Load指令且成功地从Load值预测器LVP获得预测值,则将该预测值作为值预测结果写入目标寄存器,并标记该目标寄存器为所述预测可复用状态,以及将使用该值预测结果对与该Load指令数据相关的指令预执行的结果标记为所述预测可复用状态;若引发所述预执行的不是所述Load指令,或者是所述Load指令但未成功地从所述LVP获得预测值,则标记所述目标寄存器为所述无效状态;对于在所述预执行期间引发所述长延时缓存失效的Load指令,通过查询所述LVP预测该Load指令的读数据,作为值预测结果写入目标寄存器,并标记该目标寄存器为所述预测不可复用状态,以及将使用该值预测结果对与该Load指令数据相关的指令预执行的结果标记为所述预测不可复用状态;按程序顺序将所述预执行结果保存在指令复用队列IRQ,并根据标记的所述状态设置相应的标志。

2.按照权利要求1所述的方法,其特征在于,通过所述LVP对符合Stride模式和/或AVD模式的引发所述长延时缓存失效的Load指令的读数据进行捕获和值预测,所述LVP包括多个表项,每一表项包括:标签域,用于通过保存指令地址的高位值标识所述Load指令;

表项有效标识域,用于标识本表项是否有效;

最近读值域、读值差域和预测阶段标识域用于实现所述Stride模式的值预测,其中:最近读值域,用于记录所述Load指令最近一次执行的读数据;

读值差域,用于记录所述Load指令相邻两次执行的读数据之差;

预测阶段标识域,用于标识所述Stride模式的值预测当前是处于训练阶段或预测阶段;

AVD域、可信度域用于实现所述AVD模式的值预测,其中:

AVD域,用于记录所述Load指令最近一次执行的访存地址与读数据之差;

可信度域,用于表示所述AVD模式的值预测的可信度值,当该可信度值高于可信度阈值上,进行所述AVD模式的值预测。

3.按照权利要求2所述的方法,其特征在于,通过所述LVP对符合Stride模式和/或AVD模式的引发所述长延时缓存失效的Load指令的读数据进行捕获和值预测,具体包括:对于所述引发所述长延时缓存失效的Load指令,用该Load指令的地址查询所述LVP的标签域,若有命中表项,且所述预测阶段标识域标识出是处于所述预测阶段,则用所述最近读值域的值与所述读值差域的值之和作为预测值读取;若所述预测阶段标识域标识出是处于所述训练阶段,则查询所述可信度域的可信度值,若该可信度值大于所述可信度阈值,则用该Load指令的访存地址与所述AVD域的值之和作为预测值读取;若所述可信度值不大于所述可信度阈值,则表明该Load指令不可值预测;若所述查询没有未命中表项,则为该Load指令在所述LVP创建新的表项,并初始化所述LVP的各域;

对于成功读取所述预测值的所述Load指令,用所述预测值更新相应的目标寄存器,并且,对于所述引发预执行的Load指令标记该目标寄存器为所述预测可复用状态,对于所述在预执行期间引发所述长延时缓存失效的Load指令标记该目标寄存器为所述预测不可复用状态;对于不可值预测的所述Load指令以及所述查询没有命中表项,则标记相应的目标寄存器为所述无效状态;

在所述Load指令获取真实的读数据时,使用该Load指令的地址查询所述LVP的标签域,若有命中表项,则用该Load指令的访存地址和获取的所述读数据对所述LVP中所述Stride模式的值预测和所述AVD模式的值预测的相应域进行更新,以对该两种模式的值预测进行训练和预测结果反馈。

4.按照权利要求1所述的方法,其特征在于,在所述预执行指令期间,还包括:

对于Store指令,使用预先配置的Store Cache保存所述Store指令要存储的操作数作为所述Store指令的预执行结果,并通过在所述Store Cache中预先配置的状态标志域标记所述Store指令的预执行结果的状态,以传递给后续的与所述Store指令存储相关的Load指令。

5.按照权利要求1所述的方法,其特征在于,所述按程序顺序将所述预执行结果保存在IRQ,并根据标记的所述状态设置相应的标志,具体包括:按所述程序顺序将所述预执行结果保存在所述IRQ的指令结果域,根据所述预执行结果的所述有效状态或所述无效状态置位或复位所述IRQ的Valid域的标志,根据所述预测可复用状态或所述预测不可复用状态置位或复位所述IRQ的VP_R域的标志。

6.按照权利要求5所述的方法,其特征在于,还包括:在预执行阶段结束时检查所述引发预执行的Load指令的所述值预测结果是否正确,并结合所述IRQ中设置的所述标志生成相应的复用标志,即:对所述Valid域和所述VP_R域进行或操作,若所述或操作在检查所述值预测结果正确时为真,或者所述Valid域为真,则置位所述IRQ的复用标志域内的复用标志;否则,复位所述复用标志。

7.按照权利要求6所述的方法,其特征在于,还包括:根据所述IRQ内每个表项的所述复用标志确定针对相应指令是复用所述预执行结果或是重新执行,即当所述复用标志被置位时对相应指令复用所述预执行结果,反之则重新执行相应指令。

8.一种处理器的预执行装置,其特征在于,至少包括Load值预测器、指令复用队列、为寄存器堆分别设置的检查点和状态标志域以及与所述指令复用队列连接的Store Cache,其中:检查点,用于所述处理器在正常执行指令期间检测到发生长延时缓存失效时对所述寄存器堆的寄存器进行备份;

状态标志域,用于所述处理器在预执行指令期间标记预执行结果寄存器的状态,包括无效状态、预测可复用状态、预测不可复用状态以及有效状态中的一种;

Load值预测器,与所述寄存器堆连接,用于所述处理器在预执行指令期间保存引发长延时缓存失效的Load指令的历史信息,并依据所述历史信息对所述Load指令进行值预测;

指令复用队列,分别与所述Load值预测器和所述寄存器堆连接,用于保存每一预执行指令的结果并设置相应的状态;

Store Cache,用于所述处理器在所述预执行指令期间保存Store指令要存储的操作数,作为所述Store指令的预执行结果,并通过在所述Store Cache中预先设置的状态标志域标记所述Store指令的预执行结果的状态,以传递给后续的与所述Store指令的存储相关的Load指令。

9.按照权利要求8所述的装置,其特征在于,所述Load值预测器包含多个表项,每个表项保存一条Load指令的历史信息,包含以下各域:标签域,用于通过保存指令地址的高位值标识所述Load指令;

表项有效标识域,用于标识本表项是否有效;

最近读值域、读值差域和预测阶段标识域用于实现Stride模式的值预测,其中:最近读值域,用于记录所述Load指令最近一次执行的读数据;

读值差域,用于记录所述Load指令相邻两次执行的读数据之差;

预测阶段标识域,用于标识所述Stride模式的值预测当前是处于训练阶段或预测阶段;

AVD域、可信度域用于实现AVD模式的值预测,其中:

AVD域,用于记录所述Load指令最近一次执行的访存地址与读数据之差;

可信度域,用于表示所述AVD模式的值预测的可信度值,当该可信度值高于可信度阈值上,进行所述AVD模式的值预测。

10.按照权利要求8或9所述的装置,其特征在于,所述指令复用队列包含多个表项,每个表项用于保存一条指令的预执行结果及其状态,包含以下各域:指令结果域,用于保存相应指令的预执行结果;

Valid域、VP_R域,分别对应于所述预执行指令结果的所述有效状态和所述预测可复用状态,用于组合表示预执行结果是否可能被复用;

复用标志域,用于表示所述预执行指令的结果是否可被复用的标志。

说明书 :

一种实现处理器预执行的方法及相应的装置

技术领域

[0001] 本发明涉及现代微处理器及其应用系统的设计,尤其涉及实现现代处理器预执行的方法及相应的装置。

背景技术

[0002] 随着集成电路制造工艺的飞速发展,处理器设计将面临日趋严重的功耗、线延迟和设计复杂度等挑战,按序执行处理器凭借其在能耗、面积以及复杂度等方面的优势,获得了广泛的应用。但是,按序执行流水线在遇到缓存失效等事件时将被迫停顿,从而限制了处理器的性能,尤其是单线程性能。随着处理器与存储器之间速度差距的日益扩大,访存延时逐渐成为制约处理器单线程性能的主要瓶颈。
[0003] 预执行技术是一种典型的对访存延时包容的技术。当发生长延时缓存失效时,预执行技术利用处理器等待访存完成的空闲周期预先执行发生长延时缓存失效的访存指令(以下简称失效访存指令)的后续指令,通过将多个访存延时相重叠来提升访存性能。 [0004] 根据预执行过程中指令提交方式的不同,预执行技术可主要分为以下两类: [0005] 第一类为非阻塞执行技术,即在预执行过程中,与失效访存指令数据无关的指令能够继续执行并提交,与失效访存指令数据相关的指令则退出流水线并被单独保存,等到访存完成后再重新进入流水线执行并提交。由于要实现指令的乱序提交,该类技术需要处理器支持访存指令重执行、寄存器相关和存储相关跟踪等机制以确保程序执行的正确性,这大大增加了设计复杂度和硬件开销。
[0006] 第二类技术以Runahead(意指预先运行)技术为典型代表,即在预执行 过程中,与失效访存指令数据无关的指令能够继续执行,并提前发起存储访问或产生有效的计算结果,与失效访存指令数据相关的指令则直接被移出流水线;所有预执行的指令均不提交。当引发预执行的失效访存指令完成访存后,处理器退出预执行,并从该失效访存指令开始重新执行并提交所有预执行指令。可以看出,该类技术不需要改变原处理器的执行与提交机制,设计复杂度较低,在能耗和硬件开销方面更有优势。
[0007] 从以上两类技术的预执行过程可以看出,与失效访存指令数据相关的后续指令因操作数未就绪无法预先执行。在链表、树等链式数据结构较多的程序中存在大量的指针型Load指令,该类Load指令的读数据被用于计算后续Load指令的访存地址。若失效访存指令为指针型Load指令,预执行技术无法对与其数据相关的失效访存指令提前发起存储访问,影响了对处理器性能的优化效果。
[0008] 已有研究通过值预测技术来提前获得发生缓存失效的指针型Load指令的读数据,以预先执行与该Load指令数据相关的后续指令,特别是其中的长延时访存指令,从而进一步提高处理器的性能。常见的针对指针型Load指令的值预测方法包括Stride和AVD(Address-Value Delta)等方法。通常,对链式数据结构最频繁的操作是遍历各节点。Stride预测方法主要面向许多链式数据结构节点大小相同且地址连续的情景,对相邻节点的起始地址之差是常值时获取节点地址的指针型Load指令进行值预测;AVD预测方法则主要面向节点大小不同或地址不连续的情况,它对访存地址与读数据之差为常值时获取节点地址的指针型Load指令进行值预测。可以看出,两种值预测方法具有一定的互补性。 [0009] 已有研究在Runahead技术的基础上提出了基于AVD值预测的Runahead-AVD方法,在预执行过程中对失效访存Load指令进行值预测,并使用预测值执行与该Load指令数据相关的后续指令,以对其中的长延时访存指令提前发起存储访问。由于Runahead方法在预执行过程中不提交指令,故即使值预测错误,也不影响程序执行的正确性。因此,Runahead-AVD方法不需要错误恢复机制,从而能够以较低的复杂度进一步提高处理器性能。
[0010] 对于Runahead方法以及基于Runahead的Runahead-AVD方法,在退出 预执行后,需重新执行所有预执行指令,包括已产生有效结果的指令,造成了性能和能耗的浪费。已有研究在Runahead中结合指令复用技术来解决该问题,即处理器在预执行过程中保存产生的有效结果,并在退出预执行后复用保存的有效结果,以避免重复执行已正确完成的指令,从而降低预执行的能耗开销。
[0011] 由上述分析可以看出,值预测技术侧重于提高预执行的性能,而复用技术则侧重于降低预执行的能耗开销。
[0012] 现有的预执行方法均未在预执行中同时结合两种技术,而仅在Runahead技术中结合两种技术中的一种,因此未能充分发挥两者的优势。

发明内容

[0013] 本发明所要解决的技术问题是提供实现处理器预执行的方法及相应的装置,能够进一步取得处理器的能效优化效果。
[0014] 为了解决上述技术问题,本发明提供了一种实现处理器预执行的方法,其特征在于,包括处理器执行的以下步骤:
[0015] 在正常执行指令期间,当检测到发生长延时缓存失效时,建立检查点备份寄存器堆,并为该寄存器堆中的寄存器配置状态标志域;
[0016] 在预执行指令期间,对预执行的每一指令通过状态标志域标记预执行结果的状态,包括无效状态、预测可复用状态、预测不可复用状态以及有效状态中的一种;对于引发预执行的Load指令且成功地从Load值预测器LVP获得预测值,则将该预测值作为值预测结果写入目标寄存器,并标记该目标寄存器为预测可复用状态,以及将使用该值预测结果对与该Load指令数据相关的指令预执行的结果标记为预测可复用状态;若引发预执行的不是Load指令,或者是Load指令但未成功地从LVP获得预测值,则标记所述目标寄存器为无效状态;对于在预执行期间引发长延时缓存失效的Load指令,通过查询LVP预测该Load指令的读数据,作为值预测结果写入目标寄存器,并标记该目标寄存器为预测不可复用状态,以及将使用该值预测结果对与该Load指令数据相关的指令预执行的结果标记为预测不可复用状态;按程序顺序将 预执行结果保存在指令复用队列IRQ,并根据标记的状态设置相应的标志。
[0017] 进一步地,通过LVP对符合Stride模式和/或AVD模式的引发长延时缓存失效的Load指令的读数据进行捕获和值预测,LVP包括多个表项,每一表项包括: [0018] 标签域,用于通过保存指令地址的高位值标识Load指令;
[0019] 表项有效标识域,用于标识本表项是否有效;
[0020] 最近读值域、读值差域和预测阶段标识域用于实现Stride模式的值预测,其中: [0021] 最近读值域,用于记录Load指令最近一次执行的读数据;
[0022] 读值差域,用于记录Load指令相邻两次执行的读数据之差;
[0023] 预测阶段标识域,用于标识Stride模式的值预测当前是处于训练阶段或预测阶段:
[0024] AVD域、可信度域用于实现AVD模式的值预测,其中:
[0025] AVD域,用于记录Load指令最近一次执行的访存地址与读数据之差; [0026] 可信度域,用于表示AVD模式的值预测的可信度值,当该可信度值高于可信度阈值上,进行AVD模式的值预测。
[0027] 进一步地,通过LVP对符合Stride模式和/或AVD模式的引发长延时缓 存失效的Load指令的读数据进行捕获和值预测,具体包括:
[0028] 对于引发长延时缓存失效的Load指令,用该Load指令的地址查询LVP的标签域,若有命中表项,且预测阶段标识域标识出是处于预测阶段,则用最近读值域的值与读值差域的值之和作为预测值读取;若预测阶段标识域标识出是处于训练阶段,则查询可信度域的可信度值,若该可信度值大于可信度阈值,则用该Load指令的访存地址与AVD域的值之和作为预测值读取;若可信度值不大于所述可信度阈值,则表明该Load指令不可值预测;若查询没有未命中表项,则为该Load指令在LVP创建新的表项,并初始化LVP的各域; [0029] 对于成功读取预测值的Load指令,用该预测值更新相应的目标寄存器,并且,对于引发预执行的Load指令标记该目标寄存器为所述预测可复用状态,对于在预执行期间引发长延时缓存失效的Load指令标记该目标寄存器为预测不可复用状态;对于不可值预测的Load指令以及查询没有命中表项,则标记相应的目标寄存器为无效状态; [0030] 在Load指令获取真实的读数据时,使用该Load指令的地址查询LVP的标签域,若有命中表项,则用该Load指令的访存地址和获取的读数据对LVP中Stride模式的值预测和AVD模式的值预测的相应域进行更新,以对该两种模式的值预测进行训练和预测结果反馈。
[0031] 进一步地,在预执行指令期间,还包括:
[0032] 对于Store指令,使用预先配置的Store Cache保存Store指令要存储的操作数作为Store指令的预执行结果,并通过在Store Cache中预先配置的状态标志域标记Store指令的预执行结果的状态,以传递给后续的与Store指令存储相关的Load指令。 [0033] 进一步地,按程序顺序将所述预执行结果保存在IRQ,并根据标记的状态设置相应的标志,具体包括:
[0034] 按程序顺序将预执行结果保存在IRQ的指令结果域,根据预执行结果的有效状态或无效状态置位或复位IRQ的Valid域的标志,根据预测可复用状态或预测不可复用状态置位或复位IRQ的VP_R域的标志。
[0035] 进一步地,该方法还包括:在预执行阶段结束时检查引发预执行的Load指令的值预测结果是否正确,并结合IRQ中设置的标志生成相应的复用标志,即: [0036] 对Valid域和VP_R域进行或操作,若或操作在检查值预测结果正确时为真,或者Valid域为真,则置位IRQ的复用标志域内的复用标志;否则,复位复用标志。 [0037] 进一步地,该方法还包括:根据IRQ内每个表项的复用标志确定针对相应指令是复用所述预执行结果或是重新执行,即当复用标志被置位时对相应指令复用预执行结果,反之则重新执行相应指令。
[0038] 为了解决上述技术问题,本发明提供了一种处理器的预执行装置,至少 包括Load值预测器、指令复用队列、为寄存器堆分别设置的检查点和状态标志域以及与所述指令复用队列连接的Store Cache,其中:
[0039] 检查点,用于处理器在正常执行指令期间检测到发生长延时缓存失效时对寄存器堆的寄存器进行备份;
[0040] 状态标志域,用于处理器在预执行指令期间标记预执行结果寄存器的状态,包括无效状态、预测可复用状态、预测不可复用状态以及有效状态中的一种; [0041] Load值预测器,与寄存器堆连接,用于处理器在预执行指令期间保存引发长延时缓存失效的Load指令的历史信息,并依据历史信息对Load指令进行值预测; [0042] 指令复用队列,分别与Load值预测器和所述寄存器堆连接,用于保存每一预执行指令的结果并设置相应的状态;
[0043] Store Cache,用于处理器在预执行指令期间保存Store指令要存储的操作数,作为Store指令的预执行结果,并通过在Store Cache中预先设置的状态标志域标记Store指令的预执行结果的状态,以传递给后续的与Store指令的存储相关的Load指令。 [0044] 进一步地,Load值预测器包含的多个表项,每个表项保存一条Load指 令的历史信息,包含以下各域:
[0045] 标签域,用于通过保存指令地址的高位值标识Load指令;
[0046] 表项有效标识域,用于标识本表项是否有效;
[0047] 最近读值域、读值差域和预测阶段标识域用于实现Stride模式的值预测,其中: [0048] 最近读值域,用于记录Load指令最近一次执行的读数据;
[0049] 读值差域,用于记录Load指令相邻两次执行的读数据之差;
[0050] 预测阶段标识域,用于标识Stride模式的值预测当前是处于训练阶段或预测阶段;
[0051] AVD域、可信度域用于实现AVD模式的值预测,其中:
[0052] AVD域,用于记录Load指令最近一次执行的访存地址与读数据之差; [0053] 可信度域,用于表示AVD模式的值预测的可信度值,当该可信度值高于可信度阈值上,进行AVD模式的值预测。
[0054] 进一步地,指令复用队列包含多个表项,每个表项用于保存一条指令的预执行结果及其状态,包含以下各域:
[0055] 指令结果域,用于保存相应指令的预执行结果;
[0056] Valid域、VP_R域,分别对应于预执行指令结果的有效状态和预测可复用状态,用于组合表示预执行结果是否可能被复用;
[0057] 复用标志域,用于表示预执行指令的结果是否可被复用的标志。 [0058] 本发明通过在Runahead技术中同时结合值预测和指令复用两种技术,充分发挥了两者的优势,在提高处理器性能的同时降低其预执行的能耗开销,因此提高处理器的能效性。此外,由于能够复用预执行期间使用正确的预测值产生的结果,从而进一步降低了预执行的能耗开销。通过使用一种混合的值预测器,同时对符合Stride和AVD模式的Load读数据进行捕获和预测,则使得两者所具有的互补性能够被充分利用,从而取得了更好的值预测效果。

附图说明

[0059] 图1为本发明的实现处理器预执行的方法实施例流程图;
[0060] 图2为本发明实现处理器预执行的指令复用队列(IRQ)实施例的结构示意图; [0061] 图3为对图1所示的方法实施例中三个阶段的详细流程;
[0062] 图4为本发明的采用基于值预测和指令复用的预执行机制的处理器实施例的结构框图;
[0063] 图5为本发明的处理器实现预执行的Load值预测器(LVP)实施例的结构示意图。 具体实施方式
[0064] 以下结合附图和优选实施例对本发明的技术方案进行步详细地说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明的技术方案。 [0065] 如图1所示,是本发明的处理器实现预执行的方法实施例的流程,包括如下步骤: [0066] 110:处理器在正常执行指令时若检测到发生失效访存,则对寄存器进行数据备份;
[0067] 在初始时刻,处理器处于正常执行程序指令阶段,逐条执行指令并获得有效结果。当检测到数据访问发生长延时缓存失效(以下简称失效访存)时,处理器对寄存器堆中所有的寄存器进行备份,并建立用于寄存器数据备份的检查点(Checkpoint),可参见图4;之后进入预执行阶段。
[0068] 120:在依次对指令预执行的过程中,标记每一指令预执行结果的状态,通过LVP对引发失效访存的Load指令进行值预测,并使用预测值预执行与该Load指令数据相关的后续指令;
[0069] 在预执行指令期间,指令预执行结果的状态会随着指令间的数据相关关系传递,具体表现为由源操作数传递给目标操作数,可参见图3。因此,本 发明为寄存器堆中每个寄存器增加状态标志域(Status Flag,譬如为2位),用于操作数状态的传递,可参见图4。根据指令的预执行情况和执行结果复用情况,通过状态标志域可标记以下四种中的一种: [0070] 第一种为无效状态(INV),表示当前指令的预执行结果为无效值; [0071] 第二种为预测可复用状态(VP_R),表示当前指令与引发预执行的Load指令数据相关,且预执行结果由该Load指令的预测值产生,在值预测被判断为正确时可复用; [0072] 第三种为预测不可复用状态(VP_P)表示当前指令与预执行期间发生失效访存的Load指令数据相关,且结果由该Load指令的预测值产生,不可复用;
[0073] 第四种为有效状态(VALID),表示当前指令预执行结果为有效值;譬如对预执行与失效访存指令数据无关的后续指令可标记为此。
[0074] 在预执行阶段,处理器不用等待失效访存指令完成主存访问便可预执行后续指令,其中包括:
[0075] 对于与失效访存指令数据无关的后续指令可正常预执行并获得有效结果,将预执行结果标记为有效状态(VALID)。
[0076] 对于与失效访存指令数据相关的后续指令则需分情况处理:若引发预执行的是Load指令且成功地从Load值预测器(LVP)获得预测值,则将预测值写入目标寄存器并标记其为预测可复用状态(VP_R),之后使用预测值预先执行数据相关的后续指令;否则,即引发预执行的不是Load指令,或者未成功地从LVP获得预测值,将目标寄存器标记为无效状态(INV),由此,数据相关的后续指令因操作数未就绪无法预先执行而直接被移出流水线。 [0077] 由于进入预执行阶段前已对寄存器进行过备份,故在预先执行除Store指令之外的其它指令时,处理器可以将执行结果及其状态直接写入寄存器堆;对于Store指令,为避免其更新体系结构状态,使用预先配置的Store Cache保存Store指令要存储的操作数,作为Store指令的预执行结果,并通过在StoreCache中预先设置的状态标志域标记Store指令的预执行结果的状态,以传递给后续的与其存储相关的Load指令。
[0078] 对于在预执行期间引发失效访存的Load指令,处理器通过查找LVP预测其读数据,并将使用预测值预执行数据相关指令的结果标记其为预测不可复用状态(VP_P)。 [0079] 为了取得较好的值预测效果,本发明实现了一种混合的Load值预测器(LVP),可参见图5,用于对符合Stride模式和/或AVD模式的Load指令读数据进行捕获和预测。 [0080] 由于本发明只对引发失效访存的Load指令进行值预测,LVP只需记录发生过失效访存的Load指令的信息,而不需要保存所有Load指令的信息,从而可以减少硬件开销。 [0081] 130:按程序顺序将预执行指令的结果保存在IRQ,并根据结果的状态设置相应的标志;
[0082] 本发明的指令复用队列(IRQ,Instruction Reuse Queue)实施例的结构如图2所示,包含多个表项,每个表项表述一条指令的预执行结果及其状态,至少包含3个域:指令结果(Instruction Result)域、Valid(V)域、VP_R域;在IRQ中指令结果及其状态是分开存放的,即图2中纵向格子所表示的;其中:
[0083] Instruction Result域,用于保存相应指令的预执行结果;
[0084] V域和VP_R域,分别对应于预执行指令结果的VALID状态和VP_R状态,用于组合表示预执行结果是否可能被复用;
[0085] 当V域和VP_R域均为0,对应于预执行指令结果的状态为INV或者VP_P,表示预执行指令结果不能被复用;当V域或VP_R域为1,对应于预执行指令结果的状态为VALID或者VP_R,表示预执行指令结果可能被复用(取决于值预测是否正确)。
[0086] 140:在预执行阶段结束时检查引发预执行的Load指令的值预测结果是否正确,并结合IRQ中设置的标志生成相应的复用标志;
[0087] 上述IRQ内还包含复用标志Reuse(R)域,用于作为表示预执行指令的结果是否可被复用的标志。例如标志为1表示指令预执行的结果能被复用,为0则表示指令预执行的结果不能被复用。
[0088] R域是在预执行阶段向合并结果阶段转换时生成的,其生成过程如图2中所示,若引发预执行的Load指令值预测正确,则V域或VP_R域为1,通过或门将相应的R域标志置1,表示相应表项指令预执行的结果可被复用;否则,若引发预执行的Load指令值预测错误,只有V域为1将相应的R域标志置1,表示相应表项指令预执行的结果可被复用。 [0089] 在引发预执行的失效访存指令完成主存访问后,若失效访存指令为Load指令且进行了值预测,则处理器将预测值与真实的读数据进行比较,并根据预测值是否正确生成IRQ各表项的Reuse域标志。之后,处理器清空流水线,恢复备份的寄存器状态,并进入到合并结果阶段。
[0090] 150:根据IRQ内每项的复用标志确定针对相应指令是复用预执行指令的结果或是重新执行。
[0091] 在合并结果阶段,IRQ内Reuse域标志作为预执行指令的结果能否被复用的唯一依据。
[0092] 在此阶段,处理器将从引发预执行的指令开始重新执行并提交预执行指令;对于每一条预执行指令,处理器检查IRQ中的相应表项,若Reuse域标志为1,则直接复用IRQ中记录的预执行结果并更新体系结构状态,不再重复执行该条指令;若Reuse域标志为0,则重新执行该指令并更新体系结构状态;当检测到发生失效访存时,处理器对寄存器状态进行备份并建立检查点,之后重新进入预执行阶段,直至IRQ为空,处理器返回正常执行阶段。
[0093] 以上本发明的方法实施例可通过图3中表示的三个阶段的详细流程进一步得到解释,从其中的预执行流程中可以看到以下几点:
[0094] (1)处理器在发生失效访存而从正常执行阶段进入预执行阶段后,在预执行指令期间以及在合并结果重新执行指令期间仍会发生失效访存;通过本发明的基于值预测和指令复用的预执行机制有效地重叠处理器发生的多次失效访存延时,从而提高处理器的性能。
[0095] (2)处理器为引发预执行的Load指令和预执行指令期间引发失效访存的Load指令虽然均预测读数据,用以预执行后续指令,但对目标寄存器标记的状态是不同的,前者标记的是VP_R状态,后者标记的是VP_P状态;
[0096] 这是因为两类Load指令的预测值对指令复用的影响是不同的,前者,在退出预执行时其读数据已被取回,可根据判断预测值是否正确确定是否可复用该预测值产生的结果;后者,在退出预执行时其读数据可能尚未取回,无法判断预测值是否正确,因此不可复用该预测值产生的结果。
[0097] (3)预执行指令结果的状态会随着指令间的数据相关关系传递,具体表现为该状态会由源操作数传递给目标操作数;
[0098] (4)当IRQ为空时,表明正常执行已经追上了预执行(即预执行阶段完成,应回到正常执行阶段),处理器返回正常执行阶段。
[0099] 图4展示了本发明的处理器的预执行装置实施例,它基于值预测和指令复用实现预执行机制,其结构至少包括:Load值预测器(LVP)、指令复用队列(IRQ)以及为寄存器堆分别设置的检查点(Checkpoint)和状态标志域(Status Flag),其中:
[0100] 检查点,用于在处理器进入预执行阶段时对寄存器堆内寄存器进行备份; [0101] 状态标志域,用于在预执行阶段标识预执行指令结果寄存器的状态; [0102] Load值预测器,与寄存器堆连接,用于保存引发失效访存的Load指令的历史信息,并依此进行值预测;
[0103] 指令复用队列,分别与Load值预测器和寄存器堆连接,用于保存每一预执行指令的结果并设置相应的状态。
[0104] 上述装置实施例还包括与指令复用队列连接的Store Cache,用于在预执行阶段保存Store指令要存储的操作数,作为Store指令的预执行结果,并通过在Store Cache中预先设置的状态标志域标记Store指令的预执行结果的状态,以传递给后续的与存储相关的Load指令。
[0105] 上述装置实施例中,Load值预测器通过Stride模式和/或AVD模式对引发预执行的Load指令和预执行指令期间引发失效访存的Load指令进行值预测。 [0106] 为了取得更好的值预测效果,本发明采用结合Stride和AVD两种值预测 模式的Load值预测器实施例的结构如图5所示,其中的值历史记录(VHT,Value History Table)包含的多个表项采用指令地址索引的组相联结构,每个表项保存一条Load指令的历史信息,包含以下7个域:
[0107] 标签域(Tag),用于通过保存指令地址的高位值标识Load指令; [0108] 表项有效标识域(Valid),用于标识本表项是否有效;
[0109] 最近读值域(Last Value)、读值差域(Stride)和预测阶段标识域(State)各域用于实现Stride值预测方法,其中:
[0110] Last Value域,用于记录Load指令最近一次执行的读数据;
[0111] Stride域,用于记录Load指令相邻两次执行的读数据之差;
[0112] State域,用于标识Stride预测方法当前所处的阶段,包括训练阶段和预测阶段; [0113] AVD域、可信度域(Confidence)用于实现AVD值预测方法,其中: [0114] AVD域,用于记录Load指令最近一次执行的访存地址与读数据之差; [0115] Confidence域,用于表示AVD预测方法的可信度值,只有在可信度值高于可信度阈值的情况下,才进行值预测。
[0116] 对于引发预执行的Load指令以及在预执行期间发生失效访存的Load指令,处理器使用相应指令的地址查询LVP的Tag域,若查询命中表项,则尝试使用Stride值预测方法和/或AVD值预测方法对相应的Load指令进行值预测。
[0117] 譬如优先尝试使用Stride值预测方法,即若State域标识出该表项处于预测阶段,则使用Last Value域的值与Stride域的值之和作为预测值;否则,若State域标识出该表项处于训练阶段,表明用Stride值预测方法不可进行值预测,继续尝试使用AVD预测方法,即若Confidence域的可信度值大于可信度阈值,则使用该Load指令的访存地址与AVD域的值之和作为预测值;否则,Confidence域的可信度值不大于可信度阈值,表明用AVD值预测方法不可进行值预测。
[0118] 对于可值预测的Load指令,处理器将其目标寄存器更新为预测值,并设置相应的状态(对于引发预执行的Load指令设为VP_R状态,对于在预执行 期间发生失效访存的Load指令设为VP_P状态);对于用两种方法均不可值预测的Load指令以及LVP表项未命中,处理器将其目标寄存器的状态设置为INV状态。
[0119] 在每条Load指令获得真实的读数据时,处理器使用指令地址查询LVP,若查询命中表项,则用指令的访存地址和读数据信息对LVP中Stride值预测方法和AVD值预测方法的相应域进行更新,以对两种值预测方法进行训练;若查询未命中表项且该Load指令在执行时引发失效访存,则为该Load指令创建新的表项,并初始化各域。
[0120] 由于本发明的LVP只对引发失效访存的Load指令进行值预测,只需记录发生过失效访存的Load指令的信息,而并不保存所有Load指令的信息,因此能够显著减小硬件开销。
[0121] 本发明通过混合模式的LVP能够同时对读数据符合Stride和AVD模式的Load指令进行值预测,从而取得较好的值预测效果。
[0122] 本发明的基于值预测和指令复用的预执行机制,通过使用值预测技术预先执行与发生失效访存指令数据相关的指令而有效地隐藏处理器的访存延时,以及通过使用指令复用技术复用预执行指令期间的有效结果而减少预执行的能耗开销。