CN102968293A - 基于指令队列的程序循环代码动态检测及执行方法 - Google Patents
基于指令队列的程序循环代码动态检测及执行方法 Download PDFInfo
- Publication number
- CN102968293A CN102968293A CN2012104937781A CN201210493778A CN102968293A CN 102968293 A CN102968293 A CN 102968293A CN 2012104937781 A CN2012104937781 A CN 2012104937781A CN 201210493778 A CN201210493778 A CN 201210493778A CN 102968293 A CN102968293 A CN 102968293A
- Authority
- CN
- China
- Prior art keywords
- instruction
- execution
- loop code
- redirect
- queue
- 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.)
- Granted
Links
Images
Landscapes
- Advance Control (AREA)
- Executing Machine-Instructions (AREA)
Abstract
本发明公开了一种基于指令队列的程序循环代码动态检测及执行方法,其实施步骤如下:1)从指令缓存中取指并保存到指令队列中,将指令队列中保存的指令发射到功能部件执行,当执行指令为分支指令且执行结果为跳转时获取跳转方向以及跳转目标距离,如果跳转方向为向后跳转且跳转目标距离在指令队列的长度以内则进入下一步;2)从指令缓存中取出程序循环代码对应的指令并填充在指令队列中;3)将指令缓存旁路,从指令队列中取出指令并执行,在程序循环代码的所有指令执行完毕后恢复指令缓存的工作状态。本发明具有执行效率高、处理性能好、执行功耗低、硬件开销小、支持嵌套循环、兼容性强、可扩展性好的优点。
Description
技术领域
本发明涉及微处理器代码执行方法领域,具体涉及一种基于指令队列的程序循环代码动态检测及执行方法。
背景技术
计算机程序中一般都会存在大量循环代码,用于表示需要重复多次执行的操作。循环代码的执行在微处理器中是重复的行为,尤其是对于指令读取而言,每次取指都是相同的地址和相同的指令。现代微处理器中,为了缓解处理器与外部存储访问之间的速度差异(即“存储墙”问题),都在片内集成了高速缓存(即cache),用来保存处理器运行时需要的指令和数据。高速缓存的容量较外部存储器小,读写速度快。在高速缓存中命中的读写操作,就无需再访问片外的存储器,从而在一定程度上缓解了“存储墙”问题。同时,由于高速缓存的读写端口有限,为了减少因指令和数据的读写冲突导致的停顿,大多数高性能微处理器都将高速缓存分割为指令缓存和数据缓存(称为“哈佛结构”),各自拥有独立的读写总线,提高指令读取和数据读写的并行性。在这种结构的处理器中,首先由取指部件提供指令地址,到指令缓存中读取指令。返回的指令接着进行译码、执行等操作。如果该指令是发生跳转的分支指令,则它的跳转目标指令地址根据分支指令的计算结果得到,作为后续指令地址,否则后续指令地址为当前指令地址连续的下一条指令地址。指令在执行的过程中可能由于操作数的不可用(数据相关)或执行部件的不可用(结构相关)而导致流水线停顿。为了避免流水线执行段的停顿阻塞流水线前端的取指,大多数处理器都在流水线的取指段和译码段、执行段之间增加一个指令队列,用来保存已经从指令缓存中取出但暂时无法流出到后续流水线的指令,这样流水线后端的停顿不会阻塞前端的取指,直到指令队列充满。
但是,当程序中的循环代码在这种现有技术的处理器流水线中执行时,循环代码将被展开,循环体中的指令将被重复地从指令存储器中读取,造成资源浪费。特别是在当前多核多线程处理器中,线程之间的交替执行可能会竞争高速缓存资源从而发生替换操作,在执行新的一次循环时原本已经读入指令缓存的指令仍可能发生失效,需要重新载入,导致性能降低。同时,重复的读取相同指令也会增加指令缓存访问的动态功耗,在功耗问题日益成为微处理器设计中首要挑战的情况下,这是一种功耗的浪费,存在优化的空间。
在一些处理器设计的技术方案中,也有一些技术方案通过编译手段标识循环体的起始位置、在执行时将循环指令保存在特定的存储器中、后续的循环指令从该存储器中获得,从而实现指令重用、减少指令缓存的重复访问。但是,这种方法需要增加额外的存储部件,能够检测的循环代码长度受限于存储容量,特别是在多线程处理器中,由于每个线程都需要独立的指令存储部件,因此带来的额外面积开销更大,可扩展性不好。而且,这种方法无法动态完成循环检测,不利于二进制代码的兼容性。
如图1所示,现有技术带指令队列的流水线前、后端结构,包括取指部件、指令队列、各功能部件等部分。指令队列之前的取指部件称为流水线前端,指令队列之后的各功能部件称为流水线后端;取指部件主要由程序计数器(PC)和指令缓存(指令cache)组成。取指部件根据程序计数器给出的指令地址到指令缓存中读取指令,然后根据写指针标识的位置存储到指令队列中,然后写指针递增。同时程序计数器也递增,开始读取顺序的下一条指令。如果指令不在当前的指令缓存中,则发生指令缓存失效,停顿流水线前端,直到指令从更高一级缓存或存储器中返回。指令队列判断当前读指针所标识的指令是否满足执行条件,如操作数是否就绪、功能部件是否空闲等。一旦条件满足,则将该指令发射到功能部件执行,同时读指针递增。如果指令是分支指令,则发射到分支部件执行。如果该分支指令执行的结果是跳转,则清空流水线和指令队列中的已有指令,将跳转目标地址传递给流水线前端的程序计数器,从新的指令地址开始重新取指。经典的带指令队列的流水线不支持循环检测功能,指令队列中的指令在发射到流水线后端的同时就在队列中清除,下次再执行时重新从指令缓存中读取。
发明内容
本发明要解决的技术问题是提供一种执行效率高、处理性能好、执行功耗低、硬件开销小、支持嵌套循环、兼容性强、可扩展性好的基于指令队列的程序循环代码动态检测及执行方法。
为了解决上述技术问题,本发明采用的技术方案为:
一种基于指令队列的程序循环代码动态检测及执行方法,其实施步骤如下:
1)从指令缓存中取指并保存到指令队列中,将指令队列中保存的指令发射到功能部件执行,当执行指令为分支指令且执行结果为跳转时获取跳转方向以及跳转目标距离,如果跳转方向为向后跳转且跳转目标距离在指令队列的长度以内,则预测当前执行的分支指令与跳转目标地址之间的代码为程序循环代码,并进入下一步;
2)从指令缓存中取出程序循环代码对应的指令并填充在指令队列中;
3)将指令缓存旁路,直接从指令队列中取出指令并发射到功能部件执行,在程序循环代码的所有指令执行完毕后恢复指令缓存的工作状态。
作为本发明上述技术方案的进一步改进:
所述步骤2)的详细步骤如下:
2.1)预先在指令队列中增加循环头指针,预先在分支处理部件增加循环检测标志寄存器、循环执行标识寄存器和循环代码头指令程序计数器寄存器,在预测当前执行的分支指令与跳转目标地址之间的代码为程序循环代码后将循环头指针指向为指令队列当前写指针的位置、将循环检测标志寄存器赋值为1、将循环执行标识寄存器赋值为0、将循环代码头指令程序计数器寄存器赋值为当前分支指令的跳转目标程序计数器值;
2.2)从指令缓存中取出程序循环代码对应的指令并存储在指令队列中写指针所指向的位置并顺序递增写指针的值,当写指针的下一个位置为循环头指针时暂停取指;同时在读指针指向的指令如果满足分派条件则分派到功能部件执行,保持循环头指针不变并顺序递增读指针直至读指针的下一个位置为循环头指针,此时将循环检测标志寄存器赋值为0,继续递增写指针,跳转步骤1)继续取指执行;当执行指令为分支指令且执行结果为跳转时判断跳转指令的跳转方向,如果为向前跳转则清空指令队列和流水线中的指令,将循环检测标志寄存器赋值为0,根据程序计数器中当前的分支指令跳转目标程序计数器值继续从指令缓存中取指,跳转步骤1)继续执行,流水线重新回到正常执行状态,否则跳转执行下一步;
2.3)将分支指令跳转目标程序计数器值和循环代码头指令程序计数器寄存器值进行比较,如果分支指令跳转目标程序计数器值大于循环代码头指令程序计数器寄存器值,则判定存在嵌套循环且内层循环代码已在指令队列中,清空已发射流水线中的指令,然后根据分支指令跳转目标程序计数器值和循环代码头指令程序计数器寄存器值的差值回退读指针,重新分派指令执行;如果分支指令跳转目标程序计数器值小于循环代码头指令程序计数器寄存器值,则清空指令队列和流水线中的指令,将循环检测标志寄存器赋值为0,根据程序计数器中当前的分支指令跳转目标程序计数器值继续从指令缓存中取指,跳转步骤1)继续执行,流水线重新回到正常执行状态;如果分支指令跳转目标程序计数器值等于循环代码头指令程序计数器寄存器值则判定完成了循环代码的填充,清空已发射流水线中的指令,将指令队列的读指针赋值为循环头指针、将循环检测标志寄存器赋值为0、将循环执行标识寄存器赋值为1,进入后续的将指令缓存旁路的操作。
所述步骤3)的详细执行步骤如下:
3.1)将指令缓存旁路,从指令队列中取指并发射到功能部件执行,同时将读指针逐步递增,当执行指令为分支指令且执行结果为跳转时判断跳转指令的跳转方向,如果为向前跳转则跳转执行步骤3.3),否则跳转执行步骤3.2);如果直到指令队列读写指针相等,也没有发生指令流的跳转则跳转执行步骤3.3);
3.2)将分支指令跳转目标程序计数器值和循环代码头指令程序计数器寄存器值进行比较,如果分支指令跳转目标程序计数器值等于循环代码头指令程序计数器寄存器值则清空流水线中的指令、将指令队列的读指针赋值为循环头指针,则继续下一个循环的执行;如果分支指令跳转目标程序计数器值大于循环代码头指令程序计数器寄存器值清空流水线中的指令,根据分支指令跳转目标程序计数器值和循环代码头指令程序计数器寄存器的差值回退读指针,重新分派指令执行;如果分支指令跳转目标程序计数器值小于循环代码头指令程序计数器寄存器值则跳转执行步骤3.3);
3.3)退出指令缓存旁路,清空指令队列和流水线中的指令,将循环检测标志寄存器赋值为0,将循环执行标识寄存器赋值为0,根据程序计数器中当前的分支指令程序计数器值继续从指令缓存中取指,跳转步骤1)继续执行,流水线重新回到正常执行状态。
所述步骤2.2)和步骤3.1)当执行指令为分支指令且执行结果为跳转时还包括检测跳转是否由于发生中断或者自陷导致的跳转,如果检测到跳转是由于发生中断或者自陷导致的,则清空指令队列和流水线中的指令,将循环检测标志寄存器赋值为0,将循环执行标识寄存器赋值为0,根据程序计数器中当前的分支指令跳转目标程序计数器值继续从指令缓存中取指,跳转步骤1)继续执行,流水线重新回到正常执行状态。
所述将指令缓存旁路具体是指不访问指令缓存并控制指令缓存进入休眠状态。
本发明具有下述优点:
1、本发明通过检测判断程序循环代码、从指令缓存中取出程序循环代码对应的指令并填充在指令队列中、将指令缓存旁路并直接从指令队列中取出指令发射到功能部件执行,在程序循环代码的所有指令执行完毕后恢复指令缓存的工作状态,因此使得程序循环代码直接从指令队列中读取而暂时不需要访问指令缓存,在指令队列中实现循环代码的检测和存储功能,减少了额外的存储开销,动态检测能够实现二进制代码的兼容性,从而能够实现指令重用、减少指令缓存的重复访问、降低指令缓存失效率,能够提高程序循环代码的处理速度和效率,具有执行效率高、处理性能好、执行功耗低的优点。
2、硬件开销小。本发明能够复用在处理器中普遍存在的指令队列来存储程序循环代码,不需要独立的循环代码存储器,仅在指令队列中增加循环头指针,在分支处理部件增加循环检测标志寄存器(1位)、循环执行标识寄存器(1位)和循环代码头指令程序计数器寄存器(宽度视处理器地址位宽而定),同时增加少量针对这些寄存器的控制逻辑即可,硬件开销非常小。
3、兼容性好。本发明不依赖于处理器编译器的辅助提示,使用硬件逻辑实现动态检测,对软件完全透明,已有代码可以不进行任何修改就能在实现此技术的处理器上运行,提高性能、降低功耗,能够最大程度的保证二进制代码的兼容性。
4、支持嵌套循环。本发明通过识别程序循环代码,能够自动识别代码中的嵌套循环,并且内层循环和外层循环都无需访问指令缓存,支持内层循环和外层循环同时驻留在指令队列中,只要指令队列的大小能够容纳得下整个循环体,嵌套层数不受限制。
5、可扩展性好。本发明能够检测的循环代码大小随处理器中已有的指令队列大小的增加而增加,除了循环头指针L的宽度和L相应控制逻辑略有增加外,其他需要增加的逻辑和存储资源不发生任何变化,开销趋于恒定,可扩展性好。
附图说明
图1为现有技术带有指令队列的流水线前后端结构示意图。
图2为本发明实施例的整体流程示意图。
图3为本发明实施例的初始化流程示意图。
图4为本发明实施例的循环代码填充指令队列时的流程示意图。
图5为本发明实施例的旁路指令缓存执行程序循环代码的流程示意图。
具体实施方式
如图2所示,本实施例基于指令队列的程序循环代码动态检测及执行方法的实施步骤如下:
1)从指令缓存中取指并保存到指令队列中,将指令队列中保存的指令发射到功能部件执行,当执行指令为分支指令且执行结果为跳转时获取跳转方向以及跳转目标距离,如果跳转方向为向后跳转且跳转目标距离在指令队列的长度以内,则预测当前执行的分支指令与跳转目标地址之间的代码为程序循环代码,并进入下一步;
2)从指令缓存中取出程序循环代码对应的指令并填充在指令队列中;
3)将指令缓存旁路,直接从指令队列中取出指令并发射到功能部件执行,在程序循环代码的所有指令执行完毕后恢复指令缓存的工作状态。
本实施例通过检测判断程序循环代码、从指令缓存中取出程序循环代码对应的指令并填充在指令队列中、将指令缓存旁路并直接从指令队列中取出指令发射到功能部件执行,在程序循环代码的所有指令执行完毕后恢复指令缓存的工作状态,因此使得程序循环代码直接从指令队列中读取而暂时不需要访问指令缓存,在指令队列中实现循环代码的检测和存储功能,减少了额外的存储开销,动态检测能够实现二进制代码的兼容性,从而能够实现指令重用、减少指令缓存的重复访问、降低指令缓存失效率,能够提高程序循环代码的处理速度和效率,具有执行效率高、处理性能好、执行功耗低的优点。本实施例的结构上预先在指令队列中增加循环头指针,预先在分支处理部件增加循环检测标志寄存器、循环执行标识寄存器和循环代码头指令程序计数器寄存器即可,运行时程序循环代码通过复用指令队列保存在指令队列中,不用额外设计单独的存储结构,循环的检测在分支处理部件中完成,硬件开销小。
如图3和图4所示,本实施例步骤2)的详细步骤如下:
2.1)预先在指令队列中增加循环头指针,预先在分支处理部件增加循环检测标志寄存器、循环执行标识寄存器和循环代码头指令程序计数器寄存器,在预测当前执行的分支指令与跳转目标地址之间的代码为程序循环代码后将循环头指针指向为指令队列当前写指针的位置、将循环检测标志寄存器赋值为1、将循环执行标识寄存器赋值为0、将循环代码头指令程序计数器寄存器赋值为当前分支指令的跳转目标程序计数器值;
2.2)从指令缓存中取出程序循环代码对应的指令并存储在指令队列中写指针所指向的位置并顺序递增写指针的值,当写指针的下一个位置为循环头指针时暂停取指;同时在读指针指向的指令如果满足分派条件则分派到功能部件执行,保持循环头指针不变并顺序递增读指针直至读指针的下一个位置为循环头指针,此时将循环检测标志寄存器赋值为0,继续递增写指针,跳转步骤1)继续取指执行;当执行指令为分支指令且执行结果为跳转时判断跳转指令的跳转方向,如果为向前跳转则清空指令队列和流水线中的指令,将循环检测标志寄存器赋值为0,根据程序计数器中当前的分支指令跳转目标程序计数器值继续从指令缓存中取指,跳转步骤1)继续执行,流水线重新回到正常执行状态,否则跳转执行下一步;
2.3)将分支指令跳转目标程序计数器值和循环代码头指令程序计数器寄存器值进行比较,如果分支指令跳转目标程序计数器值大于循环代码头指令程序计数器寄存器值,则判定存在嵌套循环且内层循环代码已在指令队列中,清空已发射流水线中的指令,然后根据分支指令跳转目标程序计数器值和循环代码头指令程序计数器寄存器值的差值回退读指针,重新分派指令执行;如果分支指令跳转目标程序计数器值小于循环代码头指令程序计数器寄存器值,则清空指令队列和流水线中的指令,将循环检测标志寄存器赋值为0,根据程序计数器中当前的分支指令跳转目标程序计数器值继续从指令缓存中取指,跳转步骤1)继续执行,流水线重新回到正常执行状态;如果分支指令跳转目标程序计数器值等于循环代码头指令程序计数器寄存器值则判定完成了循环代码的填充,清空已发射流水线中的指令,将指令队列的读指针赋值为循环头指针、将循环检测标志寄存器赋值为0、将循环执行标识寄存器赋值为1,进入后续的将指令缓存旁路的操作。
本实施例中,上述步骤1)为初始化阶段,步骤2)为循环代码填充阶段,步骤3)为指令缓存旁路阶段。其中步骤2.1)为循环代码填充阶段的准备步骤,因此也可归类到初始化阶段。本实施例中,2.2)当执行指令为分支指令且执行结果为跳转时还包括检测跳转是否由于发生中断或者自陷导致的跳转,如果检测到跳转是由于发生中断或者自陷导致的,则清空指令队列和流水线中的指令,将循环检测标志寄存器赋值为0,将循环执行标识寄存器赋值为0,根据程序计数器中当前的分支指令跳转目标程序计数器值继续从指令缓存中取指,跳转步骤1)继续执行,流水线重新回到正常执行状态。
为了描述方便,本实施例下文的循环头指针使用L指代,循环检测标志寄存器使用LDF(Loop Detected Flag)指代,循环执行标识寄存器使用LEF(Loop Executing Flag)指代,循环代码头指令程序计数器寄存器使用LHPC指代、分支指令程序计数器值使用BRPC指代、分支指令跳转目标程序计数器使用BTPC指代。本实施例的指令队列除了用通常的读指针(H)标识队列中的头指令、写指针(T)标识队列中的尾指令外,增加一个循环头指针(L)来标识指令队列中循环代码的起始位置;在分支处理部件增加循环检测标志寄存器(LDF)、循环执行标识寄存器(LEF)和循环代码头指令程序计数器寄存器(LHPC)即可,运行时程序循环代码通过复用指令队列保存在指令队列中,不用额外设计单独的存储结构,循环的检测在分支处理部件中完成,硬件开销小。循环检测标志寄存器(LDF)的值仅仅在循环代码填充阶段为有效。LDF用于标识检测到程序循环代码并正在进行循环代码的填充,LDF默认为0,一旦检测到程序循环代码则将LDF置为1,然后开始进行程序循环代码的填充,并在程序循环代码填充指令队列完毕后恢复默认值0。循环执行标识寄存器(LEF)的值仅在完成循环代码填充后、开始指令缓存旁路时为有效,LEF用于标识目前的指令缓存被旁路,循环指令直接从指令队列中获得,LEF默认值为0,一旦在步骤2)中循环代码填充完毕则将LEF置为1,然后开始从指令队列中取指执行,并在程序循环代码执行完毕后恢复默认值0。循环代码头指令程序计数器寄存器(LHPC)用于保存程序循环代码第一条指令对应的程序计数器值。
如图3所示,初始化阶段,初始情况下指令流水线为正常执行状态,指令队列接收从指令缓存中取出的指令,保存到写指针T对应的指令队列中的位置;条件满足时(功能部件可用及操作数就绪),指令队列将读指针H对应的指令分派到功能部件执行。当执行指令为分支指令且执行结果为跳转时,清空后续流水线及指令队列中的指令(写指针T赋值等于读指针H,简写为T<=H),根据程序计数器中分支指令跳转目标程序计数器值(BTPC)重新开始取指,并根据分支指令程序计数器值(BRPC)和分支指令跳转目标程序计数器值(BTPC)的比较结果判断其跳转方向。如果是向后跳转,且跳转目标的距离在N以内(N为指令队列的长度),则预测这条分支指令是程序循环代码的一个循环跳转指令,且指令队列的容量可以保存这一段循环代码,则将指令队列循环头指针L赋值为指令队列写指针T(L<=T),同时在循环代码头指令程序计数器寄存器LHPC中记录分支目标地址(LHPC<=BTPC),置LDF标识(LDF<=1),进入程序循环代码填充的阶段;否则,L、LHPC、LDF均保持不变,按正常分支跳转的流程处理。
如图4所示,本实施例在循环代码填充阶段将从指令缓存取出的指令存入写指针T所指的指令队列位置,并顺序递增写指针T,当T+1=L时,暂停取指。指令队列中读指针H所指的指令如果满足分派条件则分派到功能部件执行,并顺序递增H。在此过程中L保持不变。如果直到读指针H满足H+1=L(此时H=T),仍没有再次遇到指令流的跳转,则清除LDF(LDF<=0),继续从指令缓存取指,跳转步骤1)继续执行(写指针T继续递增),此时流水线重新回到了正常执行状态。当执行指令为分支指令且执行结果为跳转时,则根据跳转方向以及分支指令跳转目标程序计数器值(BTPC)和循环代码头指令程序计数器寄存器值(LHPC)的比较结果会有如下执行结果:
A1、若为向前跳转(例如if-else分支、函数调用等),则清除LDF(LDF<=0),此时流水线重新回到正常执行状态,清空指令队列(T<=H)和流水线中的指令,从BTPC处取指,跳转步骤1)继续执行;
A2、若为向后跳转,且BTPC=LHPC,则标志着完成了循环代码的填充,仅清空已发射到流水线中的指令,置LDF<=0,LEF<=1,H<=L,进入指令缓存旁路执行阶段,暂停前端取指操作,直接从指令队列中分派指令执行;
A3、若为向后跳转,且BTPC>LHPC,则认为存在嵌套循环,且内层循环代码已在指令队列中,此时跳转指令不触发指令队列的清空,仅清空已发射到流水线中的指令,然后根据BTPC与LHPC的差值将读指针H回退相应的值,重新分派指令执行;
A4、若为向后跳转,且BTPC<LHPC,则认为此次填充的不是循环代码,清除LDF(LDF<=0),此时流水线重新回到正常执行状态,清空指令队列(T<=H)和流水线中的指令,从BTPC处取指,跳转步骤1)继续执行;
A5、如果填充阶段发生因中断或自陷导致的跳转,则清除LDF(LDF<=0),流水线重新回到正常执行状态,清空指令队列(T<=H)和流水线中的指令,从中断处理入口处取指,跳转步骤1)继续执行。
如图5所示,本实施例步骤3)的详细执行步骤如下:
3.1)将指令缓存旁路,从指令队列中取指并发射到功能部件执行,同时将读指针逐步递增,当执行指令为分支指令且执行结果为跳转时判断跳转指令的跳转方向,如果为向前跳转则跳转执行步骤3.3),否则跳转执行步骤3.2);如果直到指令队列读写指针相等,也没有发生指令流的跳转则跳转执行步骤3.3);本实施例中,将指令缓存旁路具体是指不访问指令缓存并控制指令缓存进入休眠状态,因此能够降低指令缓存的功耗,能够减少微处理器执行程序循环代码的能耗。
3.2)将分支指令跳转目标程序计数器值(BTPC)和循环代码头指令程序计数器寄存器值(LHPC)进行比较,如果分支指令跳转目标程序计数器值等于循环代码头指令程序计数器寄存器值(BTPC=LHPC)则清空流水线中的指令、将指令队列的读指针赋值为循环头指针,则继续下一个循环的执行;如果分支指令跳转目标程序计数器值大于循环代码头指令程序计数器寄存器值(BTPC>LHPC)清空流水线中的指令,根据分支指令跳转目标程序计数器值和循环代码头指令程序计数器寄存器的差值回退读指针,重新分派指令执行;如果分支指令跳转目标程序计数器值小于循环代码头指令程序计数器寄存器值(BTPC<LHPC)则跳转执行步骤3.3);
3.3)退出指令缓存旁路,清空指令队列和流水线中的指令,将循环检测标志寄存器赋值为0,将循环执行标识寄存器赋值为0,根据程序计数器中当前的分支指令程序计数器值继续从指令缓存中取指,跳转步骤1)继续执行,流水线重新回到正常执行状态。
本实施例中,3.1)当执行指令为分支指令且执行结果为跳转时还包括检测跳转是否由于发生中断或者自陷导致的跳转,如果检测到跳转是由于发生中断或者自陷导致的,则清空指令队列和流水线中的指令,将循环检测标志寄存器赋值为0,将循环执行标识寄存器赋值为0,根据程序计数器中当前的分支指令跳转目标程序计数器值继续从指令缓存中取指,跳转步骤1)继续执行,流水线重新回到正常执行状态。
本实施例在指令缓存旁路阶段,LEF标志寄存器的值为1,指令队列头指针H初始设置为L,指令缓存的取指操作暂停,所有的指令都从指令队列中获得,H逐步递增。此时,指令缓存进入休眠状态(如关断电压、或者关断时钟、或者其它高级休眠功能亦可),以降低其功耗。如果在执行过程中遇到了分支指令,发生了跳转,则根据跳转方向以及BTPC和LHPC的比较结果会有如下执行结果:
B1、如果是向后跳转,且BTPC=LHPC,则清空流水线中的指令,置H<=L,(<=运算符为将右侧变量的值赋值给左侧的变量,下同)从循环代码的起始位置开始下一个循环的执行;
B2、如果是向后跳转,且BTPC>LHPC,则清空流水线中的指令,根据BTPC与LHPC的差值将队列指针H回退相应的值,重新分派指令执行;
B3、如果是向后跳转,且BTPC<LHPC,则退出指令缓存旁路阶段,置LEF<=0,清空指令队列和流水线,恢复流水线的正常执行状态,从BTPC处取指,跳转步骤1)继续执行;
B4、如果是向前跳转,则退出指令缓存旁路阶段,置LEF<=0,清空指令队列和流水线,恢复流水线的正常执行状态,从BTPC处取指,跳转步骤1)继续执行;
B5、如果由于中断或自陷导致了指令流的跳转,则退出指令缓存旁路阶段,置LEF<=0,清空指令队列和流水线,恢复流水线的正常执行状态,从中断处理入口处取指,跳转步骤1)继续执行。
如果直到H=T,仍没有发生指令流的跳转,表明循环代码已经执行完毕,则退出指令缓存旁路阶段,置LEF<=0,清空指令队列和流水线,恢复流水线的正常执行状态,继续取指,跳转步骤1)继续执行。
以上所述仅是本发明的优选实施方式,本发明的保护范围并不仅局限于上述实施例,凡属于本发明思路下的技术方案均属于本发明的保护范围。应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理前提下的若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。
Claims (5)
1.一种基于指令队列的程序循环代码动态检测及执行方法,其特征在于实施步骤如下:
1)从指令缓存中取指并保存到指令队列中,将指令队列中保存的指令发射到功能部件执行,当执行指令为分支指令且执行结果为跳转时获取跳转方向以及跳转目标距离,如果跳转方向为向后跳转且跳转目标距离在指令队列的长度以内,则预测当前执行的分支指令与跳转目标地址之间的代码为程序循环代码,并进入下一步;
2)从指令缓存中取出程序循环代码对应的指令并填充在指令队列中;
3)将指令缓存旁路,直接从指令队列中取出指令并发射到功能部件执行,在程序循环代码的所有指令执行完毕后恢复指令缓存的工作状态。
2.根据权利要求1所述的基于指令队列的程序循环代码动态检测及执行方法,其特征在于,所述步骤2)的详细步骤如下:
2.1)预先在指令队列中增加循环头指针,预先在分支处理部件增加循环检测标志寄存器、循环执行标识寄存器和循环代码头指令程序计数器寄存器,在预测当前执行的分支指令与跳转目标地址之间的代码为程序循环代码后将循环头指针指向为指令队列当前写指针的位置、将循环检测标志寄存器赋值为1、将循环执行标识寄存器赋值为0、将循环代码头指令程序计数器寄存器赋值为当前分支指令的跳转目标程序计数器值;
2.2)从指令缓存中取出程序循环代码对应的指令并存储在指令队列中写指针所指向的位置并顺序递增写指针的值,当写指针的下一个位置为循环头指针时暂停取指;同时在读指针指向的指令如果满足分派条件则分派到功能部件执行,保持循环头指针不变并顺序递增读指针直至读指针的下一个位置为循环头指针,此时循环检测标志寄存器赋值为0,继续递增写指针,跳转步骤1)继续取指执行;当执行指令为分支指令且执行结果为跳转时判断跳转指令的跳转方向,如果为向前跳转则清空指令队列和流水线中的指令,将循环检测标志寄存器赋值为0,根据程序计数器中当前的分支指令跳转目标程序计数器值继续从指令缓存中取指,跳转步骤1)继续执行,流水线重新回到正常执行状态,否则跳转执行下一步;
2.3)将分支指令跳转目标程序计数器值和循环代码头指令程序计数器寄存器值进行比较,如果分支指令跳转目标程序计数器值大于循环代码头指令程序计数器寄存器值,则判定存在嵌套循环且内层循环代码已在指令队列中,清空已发射流水线中的指令,然后根据分支指令跳转目标程序计数器值和循环代码头指令程序计数器寄存器值的差值回退读指针,重新分派指令执行;如果分支指令跳转目标程序计数器值小于循环代码头指令程序计数器寄存器值,则清空指令队列和流水线中的指令,将循环检测标志寄存器赋值为0,根据程序计数器中当前的分支指令跳转目标程序计数器值继续从指令缓存中取指,跳转步骤1)继续执行,流水线重新回到正常执行状态;如果分支指令跳转目标程序计数器值等于循环代码头指令程序计数器寄存器值则判定完成了循环代码的填充,清空已发射流水线中的指令,将指令队列的读指针赋值为循环头指针、将循环检测标志寄存器赋值为0、将循环执行标识寄存器赋值为1,进入后续的将指令缓存旁路操作。
3.根据权利要求2所述的基于指令队列的程序循环代码动态检测及执行方法,其特征在于,所述步骤3)的详细执行步骤如下:
3.1)将指令缓存旁路,从指令队列中取指并发射到功能部件执行,同时将读指针逐步递增,当执行指令为分支指令且执行结果为跳转时判断跳转指令的跳转方向,如果为向前跳转则跳转执行步骤3.3),否则跳转执行步骤3.2);如果直到指令队列读写指针相等,也没有发生指令流的跳转则跳转执行步骤3.3);
3.2)将分支指令跳转目标程序计数器值和循环代码头指令程序计数器寄存器值进行比较,如果分支指令跳转目标程序计数器值等于循环代码头指令程序计数器寄存器值则清空流水线中的指令、将指令队列的读指针赋值为循环头指针,则继续下一个循环的执行;如果分支指令跳转目标程序计数器值大于循环代码头指令程序计数器寄存器值清空流水线中的指令,则清空流水线中的指令,根据分支指令程序跳转目标计数器值和循环代码头指令程序计数器寄存器的差值回退读指针,重新分派指令执行;如果分支指令跳转目标程序计数器值小于循环代码头指令程序计数器寄存器值则跳转执行步骤3.3);
3.3)退出指令缓存旁路,清空指令队列和流水线中的指令,将循环检测标志寄存器赋值为0,将循环执行标识寄存器赋值为0,根据程序计数器中当前的分支指令跳转目标程序计数器值继续从指令缓存中取指,跳转步骤1)继续执行,流水线重新回到正常执行状态。
4.根据权利要求3所述的基于指令队列的程序循环代码动态检测及执行方法,其特征在于:所述步骤2.2)和步骤3.1)中当执行指令为分支指令且执行结果为跳转时还包括检测跳转是否由于发生中断或者自陷导致的跳转,如果检测到跳转是由于发生中断或者自陷导致的,则清空指令队列和流水线中的指令,将循环检测标志寄存器赋值为0,将循环执行标识寄存器赋值为0,根据程序计数器中当前的分支指令跳转目标程序计数器值继续从指令缓存中取指,跳转步骤1)继续执行,流水线重新回到正常执行状态。
5.根据权利要求1或2或3或4所述的基于指令队列的程序循环代码动态检测及执行方法,其特征在于:所述将指令缓存旁路具体是指不访问指令缓存并控制指令缓存进入休眠状态。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201210493778.1A CN102968293B (zh) | 2012-11-28 | 2012-11-28 | 基于指令队列的程序循环代码动态检测及执行方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201210493778.1A CN102968293B (zh) | 2012-11-28 | 2012-11-28 | 基于指令队列的程序循环代码动态检测及执行方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN102968293A true CN102968293A (zh) | 2013-03-13 |
CN102968293B CN102968293B (zh) | 2014-12-10 |
Family
ID=47798453
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201210493778.1A Active CN102968293B (zh) | 2012-11-28 | 2012-11-28 | 基于指令队列的程序循环代码动态检测及执行方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN102968293B (zh) |
Cited By (18)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103747339A (zh) * | 2013-12-23 | 2014-04-23 | 乐视致新电子科技(天津)有限公司 | 一种解决安卓设备播放在线视频出现无响应的方法和设备 |
CN104123195A (zh) * | 2013-04-23 | 2014-10-29 | 华为技术有限公司 | 一种指令清除方法及装置 |
CN104298552A (zh) * | 2013-07-15 | 2015-01-21 | 华为技术有限公司 | 多线程处理器的线程取指调度方法、系统和多线程处理器 |
CN104714779A (zh) * | 2013-12-12 | 2015-06-17 | 华为技术有限公司 | 指令处理方法及装置 |
CN104731719A (zh) * | 2013-12-24 | 2015-06-24 | 上海芯豪微电子有限公司 | 一种缓存系统和方法 |
CN106922186A (zh) * | 2014-12-17 | 2017-07-04 | 英特尔公司 | 用于执行自旋‑循环跳转的装置和方法 |
CN107346289A (zh) * | 2016-05-05 | 2017-11-14 | 北京自动化控制设备研究所 | 一种用循环队列缓冲数据的方法 |
CN107729054A (zh) * | 2017-10-18 | 2018-02-23 | 珠海市杰理科技股份有限公司 | 实现处理器对循环体执行的方法及装置 |
CN108845829A (zh) * | 2018-07-03 | 2018-11-20 | 中国人民解放军国防科技大学 | 一种系统寄存器访问指令的执行方法 |
CN109101276A (zh) * | 2018-08-14 | 2018-12-28 | 阿里巴巴集团控股有限公司 | 在cpu中执行指令的方法 |
CN109656641A (zh) * | 2018-11-06 | 2019-04-19 | 海南大学 | 一种多层循环程序的运行系统和方法 |
CN111782273A (zh) * | 2020-07-16 | 2020-10-16 | 中国人民解放军国防科技大学 | 一种提高重复程序执行性能的软硬件协同缓存装置 |
CN112306908A (zh) * | 2020-11-19 | 2021-02-02 | 广州安凯微电子股份有限公司 | Cpu的icache指令缓存区异常定位方法、系统、终端设备及介质 |
CN112732627A (zh) * | 2021-01-08 | 2021-04-30 | 苏州浪潮智能科技有限公司 | 一种ocp装置和服务器 |
CN114780148A (zh) * | 2022-06-17 | 2022-07-22 | 飞腾信息技术有限公司 | 一种系统寄存器访问指令的执行方法、装置及电子设备 |
CN116048627A (zh) * | 2023-03-31 | 2023-05-02 | 北京开源芯片研究院 | 指令缓冲方法、装置、处理器、电子设备及可读存储介质 |
CN116501657A (zh) * | 2023-06-19 | 2023-07-28 | 阿里巴巴(中国)有限公司 | 缓存数据的处理方法、设备及系统 |
CN116719561A (zh) * | 2023-08-09 | 2023-09-08 | 芯砺智能科技(上海)有限公司 | 一种条件分支指令的处理系统和方法 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JPS5654550A (en) * | 1979-10-12 | 1981-05-14 | Hitachi Ltd | Information processor |
US20070113059A1 (en) * | 2005-11-14 | 2007-05-17 | Texas Instruments Incorporated | Loop detection and capture in the intstruction queue |
CN101189574A (zh) * | 2005-04-11 | 2008-05-28 | 高通股份有限公司 | 指令存储器单元和操作方法 |
-
2012
- 2012-11-28 CN CN201210493778.1A patent/CN102968293B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JPS5654550A (en) * | 1979-10-12 | 1981-05-14 | Hitachi Ltd | Information processor |
CN101189574A (zh) * | 2005-04-11 | 2008-05-28 | 高通股份有限公司 | 指令存储器单元和操作方法 |
US20070113059A1 (en) * | 2005-11-14 | 2007-05-17 | Texas Instruments Incorporated | Loop detection and capture in the intstruction queue |
Cited By (32)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104123195A (zh) * | 2013-04-23 | 2014-10-29 | 华为技术有限公司 | 一种指令清除方法及装置 |
CN104123195B (zh) * | 2013-04-23 | 2018-03-13 | 华为技术有限公司 | 一种指令清除方法及装置 |
CN104298552A (zh) * | 2013-07-15 | 2015-01-21 | 华为技术有限公司 | 多线程处理器的线程取指调度方法、系统和多线程处理器 |
CN104298552B (zh) * | 2013-07-15 | 2018-06-19 | 华为技术有限公司 | 多线程处理器的线程取指调度方法、系统和多线程处理器 |
CN104714779A (zh) * | 2013-12-12 | 2015-06-17 | 华为技术有限公司 | 指令处理方法及装置 |
CN104714779B (zh) * | 2013-12-12 | 2017-10-27 | 华为技术有限公司 | 指令处理方法及装置 |
CN103747339A (zh) * | 2013-12-23 | 2014-04-23 | 乐视致新电子科技(天津)有限公司 | 一种解决安卓设备播放在线视频出现无响应的方法和设备 |
CN104731719B (zh) * | 2013-12-24 | 2020-04-28 | 上海芯豪微电子有限公司 | 一种缓存系统和方法 |
CN104731719A (zh) * | 2013-12-24 | 2015-06-24 | 上海芯豪微电子有限公司 | 一种缓存系统和方法 |
CN106922186A (zh) * | 2014-12-17 | 2017-07-04 | 英特尔公司 | 用于执行自旋‑循环跳转的装置和方法 |
CN107346289A (zh) * | 2016-05-05 | 2017-11-14 | 北京自动化控制设备研究所 | 一种用循环队列缓冲数据的方法 |
CN107729054A (zh) * | 2017-10-18 | 2018-02-23 | 珠海市杰理科技股份有限公司 | 实现处理器对循环体执行的方法及装置 |
CN107729054B (zh) * | 2017-10-18 | 2020-07-24 | 珠海市杰理科技股份有限公司 | 实现处理器对循环体执行的方法及装置 |
CN108845829A (zh) * | 2018-07-03 | 2018-11-20 | 中国人民解放军国防科技大学 | 一种系统寄存器访问指令的执行方法 |
CN108845829B (zh) * | 2018-07-03 | 2021-06-25 | 中国人民解放军国防科技大学 | 一种系统寄存器访问指令的执行方法 |
CN109101276A (zh) * | 2018-08-14 | 2018-12-28 | 阿里巴巴集团控股有限公司 | 在cpu中执行指令的方法 |
US11579885B2 (en) | 2018-08-14 | 2023-02-14 | Advanced New Technologies Co., Ltd. | Method for replenishing a thread queue with a target instruction of a jump instruction |
CN109656641A (zh) * | 2018-11-06 | 2019-04-19 | 海南大学 | 一种多层循环程序的运行系统和方法 |
CN109656641B (zh) * | 2018-11-06 | 2021-03-02 | 极芯通讯技术(南京)有限公司 | 一种多层循环程序的运行系统和方法 |
CN111782273A (zh) * | 2020-07-16 | 2020-10-16 | 中国人民解放军国防科技大学 | 一种提高重复程序执行性能的软硬件协同缓存装置 |
CN111782273B (zh) * | 2020-07-16 | 2022-07-26 | 中国人民解放军国防科技大学 | 一种提高重复程序执行性能的软硬件协同缓存装置 |
CN112306908A (zh) * | 2020-11-19 | 2021-02-02 | 广州安凯微电子股份有限公司 | Cpu的icache指令缓存区异常定位方法、系统、终端设备及介质 |
CN112306908B (zh) * | 2020-11-19 | 2024-03-15 | 广州安凯微电子股份有限公司 | Cpu的icache指令缓存区异常定位方法、系统、终端设备及介质 |
CN112732627A (zh) * | 2021-01-08 | 2021-04-30 | 苏州浪潮智能科技有限公司 | 一种ocp装置和服务器 |
CN112732627B (zh) * | 2021-01-08 | 2023-01-10 | 苏州浪潮智能科技有限公司 | 一种ocp装置和服务器 |
CN114780148A (zh) * | 2022-06-17 | 2022-07-22 | 飞腾信息技术有限公司 | 一种系统寄存器访问指令的执行方法、装置及电子设备 |
CN114780148B (zh) * | 2022-06-17 | 2022-09-23 | 飞腾信息技术有限公司 | 一种系统寄存器访问指令的执行方法、装置及电子设备 |
CN116048627A (zh) * | 2023-03-31 | 2023-05-02 | 北京开源芯片研究院 | 指令缓冲方法、装置、处理器、电子设备及可读存储介质 |
CN116501657A (zh) * | 2023-06-19 | 2023-07-28 | 阿里巴巴(中国)有限公司 | 缓存数据的处理方法、设备及系统 |
CN116501657B (zh) * | 2023-06-19 | 2023-11-10 | 阿里巴巴(中国)有限公司 | 缓存数据的处理方法、设备及系统 |
CN116719561A (zh) * | 2023-08-09 | 2023-09-08 | 芯砺智能科技(上海)有限公司 | 一种条件分支指令的处理系统和方法 |
CN116719561B (zh) * | 2023-08-09 | 2023-10-31 | 芯砺智能科技(上海)有限公司 | 一种条件分支指令的处理系统和方法 |
Also Published As
Publication number | Publication date |
---|---|
CN102968293B (zh) | 2014-12-10 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN102968293B (zh) | 基于指令队列的程序循环代码动态检测及执行方法 | |
JP6095670B2 (ja) | コンピュータ・システム内のオペランド活性情報の維持 | |
US9483267B2 (en) | Exploiting an architected last-use operand indication in a system operand resource pool | |
TWI494850B (zh) | 通透地提供給作業系統之非對稱多核心處理器系統 | |
US8266413B2 (en) | Processor architecture for multipass processing of instructions downstream of a stalled instruction | |
CN101763285B (zh) | 零开销切换多线程处理器及其线程切换方法 | |
EP0927936B1 (en) | A microprocessor with configurable on-chip memory | |
US8195924B2 (en) | Early instruction text based operand store compare reject avoidance | |
US9697002B2 (en) | Computer instructions for activating and deactivating operands | |
JPH08249195A (ja) | 命令スレッドを処理するための方法およびシステム | |
CN109101276B (zh) | 在cpu中执行指令的方法 | |
CN108287730A (zh) | 一种处理器流水线结构 | |
US5940876A (en) | Stride instruction for fetching data separated by a stride amount | |
CN114667508B (zh) | 为加速器取回数据的方法和系统 | |
CN102508635A (zh) | 一种处理器装置及其循环处理方法 | |
WO2012087587A2 (en) | Apparatus, method, and system for early deep sleep state exit of a processing element | |
CN105164637B (zh) | 用于执行循环的方法、系统、装置和处理器以及机器可读介质 | |
US20140129805A1 (en) | Execution pipeline power reduction | |
CN104461758A (zh) | 一种容忍cache缺失快速清空流水线的异常处理方法及其处理结构 | |
JP2014085839A (ja) | 並列実行機構及びその動作方法 | |
CA2709613C (en) | Risc processor device and method of simulating floating-point stack operation thereof | |
US20040054993A1 (en) | Hybrid mechanism for more efficient emulation and method therefor | |
Tabani et al. | A novel register renaming technique for out-of-order processors | |
JP4439288B2 (ja) | 同時多重スレッディングプロセッサ、動作するスレッドの数に基づいて相異なる性能レベルで動作するように構成されるコンピュータプログラム格納媒体及びこれらを動作させる方法 | |
WO2005057408A1 (en) | Processor and method for supporting compiler directed multithreading management |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant |