用于java硬件加速器的猜测执行的制作方法

文档序号:6428552阅读:132来源:国知局
专利名称:用于java硬件加速器的猜测执行的制作方法
技术领域
本发明总体上涉及计算机编程语言,更具体地涉及虚拟机语言的翻译和执行。
背景技术
计算机编程语言被用于生成包含人类可读的源代码的应用程序,其中该源代码代表供计算机执行的指令。但是,在计算机可以根据指令进行工作之前,源代码必须被翻译成计算机可读的二进制机器码。
例如C、C++或者COBOL的编程语言典型地使用翻译器通过源代码来生成汇编语言,然后将汇编语言翻译成被转换为机器码的机器语言。因此,最终的对源代码的翻译是发生在运行时间之前的。不同的计算机要求不同的机器语言,所以例如用C++写出的程序就只能运行在该C++程序为其而写的特定的硬件平台上。
解释性编程语言被设计用于以源代码生成应用程序的情况,其中该源代码可以运行在多种硬件平台上。JavaTM是一种解释性编程语言,它通过生成在运行之前被转换成中间语言的源代码来实现平台独立性,其中该中间语言被称作“字节码”或“虚拟机语言”。在运行的时候,通过解释软件将字节码翻译成适合于平台的机器码,如在美国专利No.4443865中公开的那样。为了解释每个字节码,解释器软件执行“提取、解码,以及调度”(FDD)的系列操作。对于每条字节码指令,解释器软件都包含一个用原始的中央处理单元(CPU)指令表示的相应的执行程序。解释器软件使得CPU从存储器提取或读取虚拟机指令,对用于字节码指令的执行程序的CPU地址进行解码,并且通过将对CPU的控制转移到该执行程序从而实现调度。该解释过程可能是耗费时间的。
如在PCT专利申请No.WO9918484中公开的那样,在存储器和CPU之间加入预处理器(虚拟机解释器(VMI))改善了虚拟机指令的处理。本质上,虚拟机并不是一种物理结构,而是一种解释用于硬件平台的字节码的独立的操作环境,其中对字节码的解释是通过选择存储于VM或CPU中的相应的原始机器语言指令而得以实现的。然后,这些本机指令被提供到硬件平台的CPU中并且在硬件平台的CPU中被连续地执行。典型的虚拟机要求对于每字节码有20-60个周期的处理时间(取决于字节码的质量和复杂度),从而执行FDD系列操作。首先,VMI从存储器读取(提取)字节码。接下来,VMI查找到所提取的字节码的多个属性(解码)。VMI所访问的属性确定了该字节码如何被处理成用于在CPU中执行的本机指令。当CPU正在执行一条指令的时候,VMI提取下一个字节码,并将该字节码处理成CPU指令。VMI可以在1-4个周期的时间内处理完简单的字节码。
当解释一系列字节码的时候,虚拟机可能遇到一个代表条件分支指令(此后被称作CBI)的字节码。当遇到CBI的时候,VMI生成驱使CPU确定该条件是否得到满足的一系列本机指令。因此,对执行分支的决定取决于早先的计算,这些早先的计算对于VMI来说是在CPU中被执行的,并且计算结果仍保留在CPU寄存器中。例如,JavaTM字节码“ifeq n”对字节码计数器的偏移量为n,但是仅在堆栈的顶部是零(即上一次计算在堆栈上留下的值为0)的情况下才会这样。必须重新获得分支条件的值(这里,指的是堆栈的顶部),并将该值写入VMI的控制寄存器(它专门被保留用于分支条件)。如果该条件得到了满足,那么CBI使得VMI字节码计数器发生更新(跳转),这改变了字节码的执行顺序。典型地,当一条指令正在VMI中被处理的时候,要被处理的下一条指令已经位于VMI管道当中,所以如果一条指令导致分支,那么必须清除已经位于VMI管道当中的字节码。另外,处理器硬件的“管道化”结构使得在指令和/或数据被调度到处理器的时刻与处理器实际执行该指令和/或处理该数据的时刻之间由于传递指令和数据而产生了固有的延迟。特别地,因为典型的CPU具有多级(典型地,3到8级)管道,所以写操作不会在发出该指令后立即就被执行。在CBI的情况下,额外的延迟出现在CPU确定条件是否得到满足并将该确定的结果传递到VMI的时候。如果分支条件的值(控制值)指示分支条件得到了满足,那么多条(取决于CPU管道的尺寸大小)指令将会已经进入到CPU管道中。为了使CPU和指令高速缓冲存储器一直保持工作,在等待用于指示条件是否得到满足的控制值的时候可以生成一系列“空操作”(NOP)命令。当CPU执行倒数第二个NOP的时候,接收到控制值,并且VMI生成最后一个NOP。在做出决定之后,VMI的管道要求得到几个周期,用于从VMI的高速缓冲存储器中获得代表下一条指令的字节码。
其它方法通过预测一条指令是否将导致到达另一个地方的分支从而猜测地执行潜在的分支指令。这种方法的一个例子用于RISC(精简指令集计算)微处理器,并且提供一个分支指令比特用于确定哪些条件分支“容易”被预测,并且对于这些“容易”被预测的分支,使用软件分支预测从而确定是否执行跳转。软件分支预测使用受软件控制的预测比特对分支进行预测。如果分支被确定为“难以”被预测,那么使用硬件分支预测(例如分支预测阵列)对分支进行预测。这种方法公开了使用这样一种分支预测方案如果偏移量小于零(向后分支),那么该方案预测该分支将会被采用,而如果偏移量大于零(向前分支),那么该方案预测该分支不会被采用。这种方法的一个劣势在于为了做出和更新是否容易预测的决定,需要消耗处理器资源,这是基于采用该分支的历史操作在确定是否采用该分支时所具有的重要性的。
在另一种分支预测方法中,将来自潜在的分支指令的地址的比特与把来自本地的分支历史表和全局的历史寄存器的比特结合在一起得到的比特进行比较。该比较的结果被用于读取分支预测表。这种方法的一个劣势在于执行该结合和比较操作以及存储和访问分支预测表需要消耗资源。而且,该方法并没有公开用于校正错误预测的方法。美国专利No.5136696中公开了类似的方法,其中由分支高速缓冲存储器基于潜在的分支指令的地址做出分支预测。根据该公开,如果预测是错误的,那么相应的指令就是无效的,但是它仍会被执行,所以可以使用正确的预测对分支高速缓冲存储器进行更新,以防再次遇到相同的指令。在与分支高速缓冲存储器更新相同的周期期间,通过使CPU管道的前七级中的所有指令变为无效并且加载程序计数器寄存器的内容的方法,使得CPU管道被清除。
因为条件分支发生比较频繁(所有虚拟机指令中10%左右的指令)并且在根据现有的方法对它们进行处理的时候的处理工作也比较繁重,其中这些现有的方法获得了高的准确性但是消耗了处理器资源,所以需要这样一种解释性编程语言的系统该系统准确地和有效率地执行条件分支指令字节码想要执行的指令,而同时提高了处理速度。
发明概述本发明通过这样一种方法满足了上述的需要配置虚拟机硬件加速器(例如VMI),使得在遇到条件字节码(CBI)的时候VMI执行分支预测并且决定是否开始猜测执行过程。如果决定开始该过程,那么只要被猜测执行的字节码是可容易地逆转的(readily reversible),该猜测执行就一直继续,或者一直持续到预测得到确认。在多数情况下,预测是正确的,由此使得VMI和CPU可以在预测得到确认之后按照被猜测选择的字节码的顺序连续进行工作。如果预测是不正确的(并且因此是无效的),那么在VMI和CPU中被执行的猜测过程被清除,并且VMI返回到分支之前的状态。高效率是通过以下方式得以实现的通过将虚拟机硬件加速技术、分支预测方案以及潜在的猜测执行所带来的性能提高结合在一起,以及通过只要影响是可容易地逆转的就猜测地执行指令。通过校正任意的错误预测来实现准确性。因此,平均而言,一条条件分支指令(CBI)仅会引入相对较小的延迟。
本发明适用于更复杂的分支预测方法(例如,在“调整分支预测器从而支持Java中的虚拟方法革新”(Tuning Branch Predictor toSupport Virtual Method Innovation in Java)中所涉及的用于详细讨论计划和路径历史的方法,第五届USENIX面向对象技术和系统会议的会议论文集,第217-228页,1999),以及适用于基于所遇到的每个潜在的分支指令的类型做出简单的(但是是大概的)预测的方案。
简要地说,本发明包含用于处理条件分支虚拟机指令的系统和方法,该指令在本发明的示例性实施例中由JavaTM编程语言生成。在编程层面上,JavaTM源代码被翻译为被称作字节码的中间语言。字节码包含可以被虚拟机解释从而由处理器执行的虚拟机指令。根据本发明的示例性实施例,虚拟机(在该示例性实施例中为VMI)在运行时被初始化。参数被初始化,这使得可以识别每个字节码的某些属性。例如,字节码可能是简单的或是复杂的,并且还可能是有条件的或回归的。仅在分支条件得到满足的情况下,条件字节码才是改变字节码的执行顺序的虚拟机指令。
VMI持续将一系列字节码中的每一个处理成一条或多条本机指令。VMI保持一个字节码计数器,在从指令存储器中取出每个字节码之后该计数器会加1。当遇到CBI的时候,VMI生成一系列本机指令,这些本机指令使得CPU通过获得分支条件控制值从而确定分支条件是否得到了满足。根据本发明的示例性实施例的系统和方法,VMI执行分支预测并且选择是否执行猜测执行,即是否做出分支条件是否将得到满足的假设,而不是暂停处理直到完成了控制值得获取。在做出了假设的时候,一个字节码序列被猜测地执行,直到该假设得到了确认或变为无效,或者直到遇到不可容易地逆转的字节码。
在本发明的前三个实施例中,决定是基于CBI所指定的分支的类型的。根据第一实施例,如果CBI指定一个向后分支,那么VMI假设分支条件为真,并且更新字节码计数器从而跳转到该分支所指向的下一个字节码。如果CBI指定一个向前分支,那么VMI假设分支条件不会得到满足,并且不执行该分支。在一个替换的实施例中,如果CBI要求向后分支,那么就假设分支条件得到了满足,但是如果CBI要求向前分支,那么就不做出假设。在另一个替换的实施例中,VMI假设分支条件总是得到满足的,并且因此只要沿着猜测分支上的字节码是可容易地逆转的,就处理这些字节码,直到假设得到确认或者变为无效。
在另一个实施例中,使用一种已知的分支预测方案从而确定是否猜测地执行一个分支,但是VMI仅猜测地处理可容易地逆转的字节码,直到假设得到确认或变为无效。在下面的内容中,根据使用VMI来实施该方法的实施例对该方法进行了详细的描述,但是可以使用更多的分支预测或猜测执行方案来实施该方法。
根据本发明的实施例,在做出假设之后,只要本机指令是可容易地逆转的,例如涉及堆栈操作(例如堆栈压栈操作)的指令,VMI就持续地将这些本机指令调度到CPU,这是对沿着被猜测执行的分支或者沿着字节码的原始顺序的连续字节码所进行的转移。当遇到不可容易地逆转的指令时,生成一系列“空操作”(NOP)命令,并且VMI调度这些命令使得CPU一直保持工作,直到获得了控制值。如果随后收到的控制值指示该假设是正确的,那么VMI继续对存在于VMI管道中的字节码进行操作,并且CPU继续对CPU管道中的本机指令进行操作。如果随后收到的控制值指示该假设是不正确的(即出现了错误预测),那么使得CPU返回到分支之前的状态,由此逆转了被猜测执行的可容易地逆转的字节码。由此,对由不正确的假设导致的错误预测的逆转要求使VMI和CPU都返回到分支之前的状态,并且根据被猜测执行的字节码的特性,这种逆转可以容易地得到实现。例如,在本发明的一个实施例中,“可容易地逆转的字节码”被定义为这样一种字节码它仅执行堆栈操作,或者不改变VMI之外的任何状态,所以对于一系列这种字节码的执行,可以通过重新设置VMI中的字节码计数器和寄存器堆栈指针来实现该执行的逆转。“可容易地逆转的”的其它定义可以根据本发明被实现,并且这些一些其它定义可能要求为了逆转被猜测执行的字节码,需要清除VMI和CPU的管道。
本发明的另一个方面是用于执行由例如JavaTM的解释性语言写成的虚拟机指令的系统。该系统包含处理器(CPU)和预处理器(VMI)、指令存储器,以及翻译器(JVM)。处理器包含针对硬件的指令,并且处理器被配置从而执行这些针对硬件的指令,其中这些针对硬件的指令此后被称作本机指令。预处理器是一种虚拟机,例如VMI,它被配置用于从指令存储器提取字节码并且将该字节码翻译成原始CPU指令。VMI包含控制寄存器、字节码计数器BCC、假设变量寄存器,以及猜测模式开关历史。在本发明的示例性实施例中,VMI被配置用于将每个字节码所要求的本机指令调度到CPU用于处理。如果被处理的字节码是CBI,那么VMI所提取的本机指令驱使CPU发送一个指示一个分支是否要被执行的控制值。VMI还被配置用于在已经推测认为或确认分支条件得到满足的时候,更新BCC从而执行CBI所要求的跳转。当等待控制值的时候,基于根据被列为上述实施例的方法的分支预测方案,VMI被配置用于猜测地处理或拒绝处理分支。VMI被配置用于通过存储被假设的控制值ACV,在做出假设或拒绝做出假设的时候更新假设变量的值。VMI被配置用于保持猜测模式开关历史,当一个序列被猜测地执行或者当猜测执行停止的时候,该猜测模式开关历史被更新,并且当接收到一个控制值的时候,该猜测模式开关历史被清除。在做出了一个分支应该被猜测地执行的假设之后,VMI被配置用于识别和处理可逆的字节码,用于接收控制值,以及用于如果在VMI随后接收到一个指示先前的假设是不正确的控制值的时候,逆转这些被猜测执行的字节码。
尽管执行本发明的方法有可能处理各种类型的条件分支指令,但是本发明的示例性实施例只用于对JavaTM条件分支字节码的处理。
本发明可以在使用例如由Sun Microsystems制造的JVM的虚拟机从而执行JavaTM字节码的系统上得到执行。但是,还可以使用其它的JavaTM虚拟机,例如Microsoft虚拟机来实现本发明,并且本发明还适用于执行其它解释性语言的系统,这些解释性语言例如VisualBasic、dBASE、BASIC以及.NET。
本发明的其它目的、优点和新特征将部分地在随后的描述中得到阐明,并且当本领域的技术人员查看过下面内容后,本发明的这些其它目的、优点和新特征将部分地对于本领域的技术人员来说变得很明显,并且可以通过实施本发明从而掌握这些其它目的、优点和新特征。
附图简述当参考描述来查看被包含到说明中并形成了说明的一部分的附图时,这些附图举例说明了本发明。


图1是框图,显示了本发明的环境的示例性实施例的功能元件。
附图2是显示在典型的CPU管道中对指令进行处理的图。
附图3显示了一个示例性字节码处理序列。
附图4表示了根据本发明的示例性实施例的方法的流程。
优选实施例描述如所要求的,在这里公开了本发明的详细实施例;但是,应该理解,所公开的实施例仅仅是本发明的示例,并且本发明可以通过其它不同的和替换的形式得以实现。附图不必是按照比例绘制的;为了显示特征器件的详细情况,某些特征被夸大或被缩小。因此,这里所公开的特定的结构和功能细节并不应被理解为对本发明进行限制,而仅仅是作为用于权利要求的基础,以及作为用于向本领域的技术人员教授如何以各种不同方式使用本发明的典型的基础。
现在参考本发明的一个示例性实施例的详细内容,其中该示例性实施例在附图中被举例说明,并且在这些附图中相同的数字代表相同的器件,图1是本发明的环境的示例性实施例的框图。本环境的基本器件是硬件平台100,该硬件平台包含处理器110、预处理器120以及指令存储器150,并且它们通过系统总线160连接在一起。预处理器120包含控制寄存器130和翻译器140。硬件平台100典型地包含中央处理单元(CPU)、基本的外设、操作系统(OS)。本发明的处理器110是例如MIPS、ARM、Intel x86、PowerPC或者SPARC类型的微处理器的CPU,而且包含针对硬件的指令,并且被配置用于执行这些针对硬件的指令,其中这些针对硬件的指令此后被称作本机指令。在本发明的该示例性实施例中,翻译器140是JavaTM虚拟机(JVM),例如Sun Microsystems的KVM。指令存储器150包含虚拟机指令,例如JavaTM字节码170。该示例性实施例中的预处理器120是在WO9918486中公开的虚拟机解释器(VMI),并且它被配置用于从指令存储器150提取虚拟机指令(例如字节码170),并且将该虚拟机指令翻译成一系列原始CPU指令。VMI 120是总线160上的外设,并且充当存储器映射外设,其中将预先确定的CPU地址范围分配给VMI 120。VMI 120管理一个独立的虚拟机指令指针180,该指针指示指令存储器150中的当前的(或下一个)虚拟机指令。VMI还管理一个猜测模式开关历史和假设变量(未示出)。
现在参考图2并且根据本发明的示例性实施例,处理器110包含多级管道200,从而在连续的时钟周期内,机器指令的执行以并行和前后紧接的方式进行。换句话说,当第一指令I1进入管道的第二级的时候,随后的指令I2进入第一级,依此类推。理想情况下,指令在连续的周期内连续进入管道,由此使得可以实现对八条指令的同时处理,并且每隔一个时钟周期完成对一条指令的执行。但是,典型地,对一般指令的执行实际上要求多于一个时钟周期。
作为本发明的工作情况的一个例子,VMI 120将字节码170的第一系列310翻译成一条或多条本机指令。现在参考图3,字节码B0到B2是非条件的,所以VMI 120只是从指令存储器150提取B0-B2,选择本机指令或为每个字节码170定义的指令,并且将这些指令提供到处理器110用于执行。Bn是条件分支指令(CBI 330),因此如果分支条件得到满足,那么Bn导致VMI从第一序列310跳转到序列320中的字节码Br。当分支条件正在被评价的时候(即VMI 120等待从CPU 110返回控制值的时候),根据分支预测方案做出关于分支条件是否将得到满足的预测,并且VMI决定是否猜测地执行这些指令,直到预测可以被证实。分支预测方案是具有可变复杂度的探试性过程,该过程提供关于分支条件是否将得到满足的预测,并且还可能提供对预测准确度的统计评价。根据本发明的一个实施例,VMI 120实施这样一种分支预测方案如果CBI 330(Bn)要求向后分支(即相对于字节码计数器BCC的负的偏移量),那么该方案假设分支条件得到满足并且VMI120执行到字节码Br的跳转。与此同时,VMI 120调度本机指令序列,这些本机指令序列导致CPU 110获得指示分支条件是否得到满足的控制值。根据另一个实施例的分支预测方案,如果CBI 330(Bn)要求向前跳转(即相对于BCC的正的偏移量),那么VMI 120假设分支条件未得到满足并且不执行跳转。根据另一个实施例的分支预测方案,如果CBI 330在任何条件下都要求分支,那么VMI 120假设分支条件得到满足并且执行跳转。
根据本发明的一个示例性实施例,如果分支预测方案导致字节码的序列320的猜测执行,那么通过仅猜测地执行可容易地逆转的字节码170可以使得不正确的预测的影响最小化。在VMI 120对字节码170进行解码(即访问它的属性)时,确定逆转的容易程度。CPU 110猜测地执行每个被调度的指令。例如,在许多情况下,分支后面跟有一个堆栈压栈操作(即一个常量或变量被压入堆栈),通过将堆栈指针值(该值被保持在VMI 120中)重新设置到它在分支之前的状态,可以容易地实现对该操作的逆转。这样的本机指令(通常被称作“堆栈压栈”)可以被猜测地执行直到接收到了控制值,这是因为对猜测执行的逆转仅通过重新设置寄存器就可以得以实现,并且因此错误预测的不良影响是可以忽略的。
因此,当VMI 120假设分支条件将得到满足的时候,对字节码Br-Bz(猜测分支)的处理随后就在第二序列320中持续进行,除非VMI 120遇到沿着猜测分支上的这样一个字节码,该字节码代表了不能被容易地逆转的一系列本机指令。当沿着猜测分支上的字节码170不能被容易地逆转时,暂停该猜测执行。如果VMI 120随后接收到指示分支条件未得到满足的控制值,那么VMI 120重新设置BCC和寄存器堆栈指针从而逆转该跳转(并且如果有必要的话,向CPU 110发送一条本机指令从而清除CPU管道200)。如果VMI 120假设分支条件将不会得到满足,那么BCC加1,并且分支猜测地不被处理。当猜测地处理非分支字节码的时候,VMI 120持续地检查接收到的控制值是否已经被写入到它的控制寄存器130中。
如图4的块410中所示的,VMI 120在运行到块420从而从指令存储器150提取每个字节码170之前,都要使虚拟机计数器BCC加1。在块430中,VMI 120通过访问每个字节码170的属性从而对该字节码170进行解码。因为当一个序列的第一个字节码170已经被解码的时候,猜测模式开关SMS是关闭的,所以VMI 120(在块435中)调度对应于字节码170的本机指令序列。如果在块445中,确定了字节码170不是CBI 330,那么该方法返回到块410,在块410中虚拟机计数器(BCC)180加1,并且重新开始进行提取过程(块420)。但是,如果在块445中确定了字节码170是条件性的,那么在块435中被调度的本机指令在块450中将代表一个控制值取回过程。构成该控制值取回过程的本机指令将导致CPU 110发送一个指示CBI 330所要求的分支是否会得到执行(即是否跳转到位于当前正在被执行的字节码序列之外的目标字节码170)的控制值,并且将该控制值写到控制寄存器130中。与控制值取回过程的同时,VMI 120决定(在块470中)是否做出分支条件会得到满足或是不会得到满足的假设。该决定基于所使用的特定的分支预测或猜测执行方案。
如果VMI 120决定做出关于分支条件是否得到满足的假设,那么猜测模式开关(SMS)被打开并且一个假设的控制值(ACV)被存储到VMI寄存器(假设变量195)。在块475中,如果分支是猜测被采用的,那么BCC被更新(从而反映CBI 330所要求的跳转)。无论分支是否猜测被采用的,该方法前进到块410,在块410中BCC加1。如果沿着猜测被采用的字节码序列上的下一个字节码170是可逆的(例如对应于下一个字节码170的本机指令组成了一个简单的堆栈操作),那么就对该字节码进行处理。基于字节码170的属性来确定可逆性的容易程度。可容易地逆转的字节码典型地代表这样一些操作这些操作在CBI 330翻译之后发生在位于堆栈顶部之上的堆栈位置并且不改变系统的状态(特别地,在VMI 120之外)。在块420中,字节码170被提取,在块430中,该字节码被解码。SMS是打开的,这是因为VMI120决定做出假设(该序列正被猜测地执行),所以如果控制值还没有被返回(块485)并且解码后得到的属性指示所提取的字节码170是可容易地逆转的,那么在块435中,对应于该被提取的字节码的本机指令被调度。所以,只要被提取的字节码170不是另一个CBI 330(块445),那么BCC就加1(块410)并且沿着猜测序列上的下一个字节码被提取和解码(块420和430)。因此,只要每个下一个字节码170是可容易地逆转的,并且只要还没有接收到分支条件,那么猜测序列的处理就在块410、420、430、432、485、486、460和435之间循环。
如果在块460中,在猜测序列的处理期间遇到了不可容易地逆转的字节码170,那么通过在块461中关闭SMS从而停止该猜测,这导致VMI 120在块485中等待接收控制值。接收到的控制值RCV被存储到VMI 120的控制寄存器130中。在块487,对分支条件进行评价。如果RCV指示分支条件得到了满足,并且SMS历史指示当前序列正在被猜测地处理(SMS历史190显示在当前序列中的某个点处SMS被打开),那么在块494中,将被存储为假设变量195的假设的控制值ACV与存储在控制寄存器130中的接收到的控制值RCV进行比较从而确定VMI 120所做的假设是否是正确的(即猜测序列是否应该被处理)。如果假设是正确的(即ACV=RCV),那么当前分支序列的猜测执行得到确认。换句话说,VMI 120正确地假设了该分支应该被采用。在块410中,BCC加1并且重新开始提取指令。如果假设是不正确的,那么VMI120对分支所进行的处理是错误的,并且清除VMI 120和CPU 110从而逆转被猜测处理的非分支字节码序列,该方法在块498中更新BCC从而反映该跳转,并且随后返回到块410中使BCC加1,并且处理沿着分支序列上的下一个字节码。
如果RCV指示分支条件未得到满足并且SMS历史190指示当前序列正在被猜测地处理,那么在块494中,将假设的控制值ACV与接收到的控制值RCV进行比较,从而确定VMI 120所做的假设是否是正确的。如果假设是正确的,那么当前非分支序列的猜测执行得到了确认。换句话说,VMI 120正确地假设了分支不应该被采用。在块410中,BCC加1并且重新开始提取。如果假设是不正确的,那么分支不应被采用,并且在块495中通过重新设置BCC和堆栈寄存器指针从而逆转沿着被猜测处理的分支上的所有字节码。如有必要,在块495中清除VMI 120和CPU 110的管道。
只要接收到控制值,SMS历史190就被重新设置,这是因为分支条件已经得到了确认,并且因此确认或清除任何的猜测处理。
如果在块470中,VMI 120决定不做出关于分支条件是否得到满足的假设,那么VMI 120等待,直到在块485中通过检查对控制值的接收情况从而接收到控制值。因为SMS保持关闭的,所以从块486返回到块485从而继续检查直到接收到控制值。当接收到控制值的时候,该方法运行到块487,在该块中,对分支条件进行评价。如果控制值指示分支条件得到满足,那么因为在字节码序列的执行过程中并未发生猜测,所以该方法运行到块498,在该块中,BCC被更新从而反映CBI330所要求的跳转,并且然后在块410中重新开始字节码提取。如果控制值指示分支条件未得到满足,那么该方法返回到块410,重新开始字节码提取。通过这种方法,如果VMI 120决定不做出假设,那么VMI 120正常地处理CBI 330(仅在分支条件得到满足的情况下才采用分支)。
如上面讨论的那样,关于是否做出关于分支条件是否得到满足的假设的决定是基于所采用的分支预测方案,如下面所示。
分支预测方案
在本发明的第一实施例中,VMI 120使用这样一种猜测执行方案,该方案假设向后分支会被采用,而向前分支不会被采用。在第二和可替换的实施例中,VMI 120仅猜测地执行向后分支,并且对向前分支不做出假设。在第三和可替换的实施例中,VMI 120使用更加简单的猜测执行方案,该方案假设所有的分支都被采用。进一步,根据第四和可替换的实施例,VMI 120使用一种分支预测方案从而确定是否采用分支。根据上述任意一个实施例,猜测执行仅用于可容易地逆转的字节码。
根据本发明的第一实施例,VMI 120总是做出关于CBI 330所代表的分支条件的结果的假设,但是将猜测基于CBI 330所要求的分支类型。如果CBI 330要求向前分支(BCC偏移量>0),那么VMI 120假设该分支条件将不会得到满足,并且只要该字节码是可容易地逆转的,就猜测地继续处理非分支字节码序列。如果CBI 330要求向后分支(BCC偏移量<0),那么VMI 120假设该分支条件将会得到满足,并且只要该字节码是可容易地逆转的,就猜测地处理分支字节码序列。
根据本发明的第二实施例,仅在CBI要求向后分支的时候,VMI 120才做出关于CBI 330所代表的分支条件的结果的假设。如果CBI 330要求向前分支,那么VMI 120正常地处理分支条件,即VMI 120等待对控制值的接收,并且相应地处理适当的字节码序列。
在本发明的第三实施例中,当遇到CBI的时候,该方案推测分支总是被采用。当处理RISC码时,该猜测执行方案在大约70%的情况下是准确的,这是因为分支通常出现在循环的底部,并且循环典型地是被重复执行的。分支预测使得VMI的综合RISC代码处理性能提高了大约35%。根据Amdahl定律,当处理Java代码时,这种简单的预测将会使字节码处理速度提高7-20%。通过使用分支预测和猜测操作,与CPU采用原始的方式进行工作的情况相比,分支的开销可以从10到20个周期降低到大约2到4个周期。根据第三实施例的一个方面,当VMI 120假设分支条件已经得到满足的时候,VMI 120更新字节码计数器BCC从而反映分支偏移量,开始根据偏移地址提取指令,并且恢复它的管道。如果假设是正确的,被要求用于处理该分支的时间被减少到大约5个周期。但是,不能得出这样的结论根据本发明的该实施例的分支预测会使每个分支的处理时间都降低到大约三分之一(从14个周期降低到5个周期),这是因为所有分支中的大约10%的分支都会导致高速缓冲存储器错误。
在第四实施例中,将任意一种已知的分支预测方案与VMI 120结合使用从而处理每个CBI 330。
本发明的系统和方法的许多优势在这里得到了描述,尽管如此,本领域的技术人员可以认识到还存在其它的优势。例如,为了实现最佳总线使用,CPU 110以脉冲串的方式(典型地包含至少4个周期)读取本机指令。因此,CPU 110在将控制值发送回到VMI 120之前,必须读取整个脉冲串。VMI 120必须生成一些NOP从而填充包含控制值取回命令的脉冲串,以便确保在VMI 120处理猜测分支的时候CPU110处理该取回命令。本发明的一个优势在于,只要每条指令的效果都是可以逆转的,VMI 120就通过猜测地从猜测序列320调度下一条指令,使得CPU 110和VMI 120管道装满有意义的指令,而不是不得不用NOP来占据处理器时间从而填充CPU脉冲串。
根据上面的描述,可以理解,本发明提供了一种用于实现对条件分支虚拟机指令的准确的和有效率的处理的系统和方法。另外,可以理解的是,上述内容只涉及本发明的示例性实施例,并且可以对本发明进行多种修改,而不偏离由下面的权利要求所定义的本发明的精神和范围。
权利要求
1.一种处理虚拟机指令的方法,该方法包含以下步骤识别虚拟机指令的一个子集,对于该子集中的虚拟机指令的处理有条件地取决于条件控制变量的值;提取一定范围的虚拟机指令,并将该范围内的虚拟机指令处理成可以由处理器执行的本机指令,其中在处理所述范围内的虚拟机指令并且将所述范围内的虚拟机指令调度到该处理器用于执行之后,虚拟机指令计数器加1,并且持续进行直到遇到了所述的虚拟机指令的子集中的一条指令;当遇到了所述的虚拟机指令的子集中的一条指令的时候,通过将由这条指令代表的本机指令调度到处理器用于执行,从而开始一个控制值取回过程;以及当已经做出了对于条件控制变量的真实值的假设值的假设时,处理虚拟机指令的猜测序列,这是通过以下方式完成的打开猜测模式开关;根据假设值更新虚拟机指令计数器,以便将所述虚拟机指令的猜测序列的每条虚拟机指令处理成本机指令,使虚拟机指令计数器加1,并且在处理完每条虚拟机指令之后调度该本机指令,直到接收到该条件控制变量的真实值;将该真实值与假设值进行比较;以及如果该真实值不等于假设值,那么逆转对于该虚拟机指令的猜测序列的处理,清除猜测模式历史,并且逆转对于该虚拟机计数器的更新;或者如果该真实值等于假设值,那么关闭所述猜测模式开关,并且清除所述猜测模式历史;如果没有做出对于条件控制变量的真实值的假设值的假设,那么就延迟对于该范围内的虚拟机指令的进一步提取和处理,直到接收到了条件控制变量的真实值,然后根据真实的控制值处理下一条虚拟机指令。
2.如权利要求1所述的方法,其中提取所述范围内的虚拟机指令并将所述范围内的虚拟机指令处理成可以由处理器执行的本机指令是由虚拟机解释器(VMI)虚拟机硬件加速器实现的。
3.如权利要求1所述的方法,其中对于所述虚拟机指令的猜测序列的处理进一步包含处理所述猜测序列的每条虚拟机指令,其前提是仅当该虚拟机指令是可容易地逆转的时候才进行所述处理;以及如果下一条虚拟机指令不代表一个堆栈操作,那么暂停对于所述虚拟机指令的猜测序列的处理,直到接收到条件控制变量的真实值。
4.如权利要求3所述的方法,其中暂停对于所述猜测序列的处理进一步包含将一系列“空操作”指令调度到处理器,直到接收到条件控制变量的真实值。
5.如权利要求2所述的方法,其中确定是否做出对于条件控制变量的真实值的假设值的假设进一步包含确定所述被识别的虚拟机指令的子集中的所述指令所要求的、对于虚拟机计数器的偏移量;以及如果所述被识别的虚拟机指令的子集中的该指令要求的是对于虚拟机计数器的一个负的偏移量(偏移量<0),那么设置该条件控制变量的假设值从而使得分支条件得到满足。
6.如权利要求5所述的方法,该方法进一步包含如果所述被识别的虚拟机指令的子集中的该指令要求的是对于虚拟机计数器的一个正的偏移量(偏移量>0),那么设置该条件控制变量的假设值从而指示分支条件未得到满足。
7.如权利要求5所述的方法,该方法进一步包含如果所述被识别的虚拟机指令的子集中的该指令要求的是对于虚拟机计数器的一个正的偏移量(偏移量>0),那么不做出对于条件控制变量的真实值的假设。
8.如权利要求2所述的方法,其中确定是否做出对于条件控制变量的真实值的假设值的假设进一步包含设置条件控制变量的假设值从而指示分支条件得到满足。
9.如权利要求2所述的方法,其中确定是否做出对于条件控制变量的真实值的假设值的假设进一步包含根据分支预测方案来设置条件控制变量的假设值。
10.如权利要求2所述的方法,其中确定是否做出对于条件控制变量的真实值的假设值的假设进一步包含根据猜测执行方案来设置条件控制变量的假设值。
11.一种处理虚拟机指令的方法,该方法包含提取一定范围的虚拟机指令,并将该一定范围内的虚拟机指令处理成可以由处理器执行的本机指令,并且持续进行直到遇到条件分支指令;当遇到该条件分支指令的时候,通过将该条件分支指令所代表的本机指令调度到处理器用于执行,从而开始一个控制值取回过程;确定是否做出对于条件控制变量的值的假设;以及当做出了对于条件控制变量的值的假设时,处理虚拟机指令的猜测序列,这是通过如下方式完成的仅当该虚拟机指令是可容易地逆转的时候,才将所述虚拟机指令的猜测序列的虚拟机指令处理成预备的本机指令;以及如果该虚拟机指令不代表一个堆栈操作,那么暂停对于所述虚拟机指令的猜测序列的处理,直到接收到条件控制变量的值;如果没有做出对于条件控制变量的值的假设,那么就延迟对于该范围内的虚拟机指令的进一步提取和处理,直到接收到了条件控制变量的值,并且然后根据该接收到的值处理下一条虚拟机指令。
12.如权利要求11所述的方法,其中处理虚拟机指令的猜测序列进一步包含将该接收到的条件控制变量的值与假设值进行比较;如果该条件控制变量的值不等于假设值,那么逆转对于该虚拟机指令的猜测序列的处理,清除猜测模式历史;并且如果该条件控制变量的值等于假设值,那么关闭所述猜测模式开关,并且清除所述猜测模式历史。
13.一种用于处理虚拟机指令的装置,包含具有本机指令集的处理器(110),并且该处理器被配置用于执行该本机指令;指令存储器(150),被配置用于存储虚拟机指令;预处理器(120),被配置用于从指令存储器提取虚拟机指令,并且将提取到的虚拟机指令处理成可由处理器(110)执行的本机指令,识别条件虚拟机指令,确定在处理器正在发送条件控制变量的值的时候是否猜测地处理虚拟机指令,以及在接收到该条件控制变量的时候确认或逆转所述被猜测处理的虚拟机指令,并且进一步包含控制寄存器(180),被配置用于存储从处理器接收到的条件控制变量的值;虚拟机指令计数器,被配置用于指示要被处理的下一条虚拟机指令;假设变量寄存器,被配置用于存储假设的控制变量的值;猜测模式比特,被配置用于指示预处理器是否做出了关于条件控制变量的值的假设;以及猜测模式历史,被配置用于在控制变量的值正在被发送的时候存储猜测模式比特。
14.如权利要求13所述的装置,其中预处理器(120)是虚拟机解释器(VMI)虚拟机硬件加速器。
15.如权利要求13所述的装置,其中预处理器(120)进一步被配置用于仅猜测地处理可容易地逆转的虚拟机指令,以及当遇到不可容易地逆转的虚拟机指令的时候,暂停对于虚拟机指令的猜测处理,直到接收到条件控制变量的值。
16.如权利要求15所述的装置,其中预处理器(120)进一步被配置用于当在接收到条件控制变量的值之前暂停猜测处理的时候,调度一系列“空操作”指令。
17.如权利要求15所述的装置,其中预处理器(120)进一步被配置用于仅猜测地处理代表堆栈操作的虚拟机指令,以及当遇到的虚拟机指令不是堆栈操作的时候,暂停对于虚拟机指令的猜测处理,直到接收到条件控制变量的值。
18.如权利要求17所述的装置,其中预处理器(120)进一步被配置用于当猜测处理被暂停的时候调度一系列“空操作”,并且直到接收到了条件控制变量的值。
全文摘要
虚拟机解释器(VMI)硬件加速器使用分支预测方案对条件分支字节码进行处理,从而确定是否在等待CPU返回条件控制变量的时候猜测地处理该字节码。在一种分支预测方案中,如果一个条件分支字节码要求向后跳转,那么VMI假设分支条件将得到满足,而如果一个条件分支字节码要求向前跳转,那么VMI假设分支条件将不会得到满足。在另一种分支预测方案中,仅当条件分支字节码要求向后跳转的时候,VMI才做出假设。在另一种猜测执行方案中,每当VMI处理条件分支字节码的时候,它都假设分支条件将得到满足。VMI仅猜测地处理可容易地逆转的字节码(例如,代表简单堆栈操作的字节码),并且在遇到不可容易地逆转的字节码的时候,VMI暂停对字节码的猜测处理。当接收到条件控制变量的时候,由VMI所做的假设得到确认或变为无效。如果假设变为无效,那么任意被猜测处理的字节码都被逆转。
文档编号G06F9/45GK1561481SQ02819401
公开日2005年1月5日 申请日期2002年9月9日 优先权日2001年10月2日
发明者M·M·林德沃特 申请人:皇家飞利浦电子股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1