多重处理环境中透明动态优化的方法和系统的制作方法

文档序号:6379097阅读:286来源:国知局

专利名称::多重处理环境中透明动态优化的方法和系统的制作方法
技术领域
:本发明一般而言涉及软件系统,具体地涉及用于改进对此种系统的调整(tuning)以提高其性能的方法。
背景技术
:建造一个典型的软件系统包括若干步骤,并最终产生一个绑定模块(或“可执行的二进制程序”,executablebinary),该模块已被调整(调优),从而在一个特定的硬件和软件配置上执行。这个称为“静态优化”的处理过程可能包括以下步骤带优化地编译程序,插入插截(instrumentation),与预先建造的运行时程序库(runtimelibrary)进行静态或动态绑定,在某种预期用户配置的样本上使用一定范围的预期用户输入进行测试,以及基于测试过程中收集的数据带优化地再次编译(这称为“通过剖面法(profile)指导的反馈进行的优化”)。人们期望,由此产生的程序在预期的用户配置和输入数据的范围内既是健壮的,也是最优化的。然而,在现实中,用户环境的范围是如此宽广,以至于这样的程序无法在所有情况下都获得最佳性能。人们很早就认识到,静态技术(即在操作环境之外搜集关于代码执行的信息,以便为随后的执行微调代码)不适于产生有效的代码,因为要生成代表所有可能的最终用户数据和硬件配置的测试数据是很困难的,如果不是不可能的话。此外,随着指令级别上的并行性增加以及流水线加深,这种不适合就变得逾加令人烦恼了。与静态优化技术不同的另一种方法是“动态优化”。动态优化与带有剖面法指导的反馈(profile-directedfeedback)的静态优化的相似之处在于,它也包括在将被优化的代码中插入插截、编译它,并将其与运行时程序库静态或动态的绑定起来。然而,动态优化与静态优化的不同之处在于,被插截的代码(instrumentedcode)是在使用实际用户数据、实际执行程序时被观察的,而执行代码是被当场再优化的(即如此搜集的关于程序运行的信息被用于在同一运行中对代码进行再优化,用于随后的(同一次运行中)的执行)。动态优化所产生的优化代码常常比静态优化技术所能取得的效率更高,因为能够集中关注于例如代码的那些被频繁使用的部分,这些部分的效率的提高可以影响到如实际的程序使用所表现的整体性能。此外,使用动态优化时,不需要客户执行繁重的生成假设数据集的任务。然而,在上述动态优化系统中,动态优化的缺点是必须进行的信息的收集和编译工作是相继散布在应用代码的执行中的,这样就增加了应用的执行时间。应用的运行时间方面因优化得到的改善必须超过此附加成本,才能从动态优化中获得任何益处。动态优化的例子包括人们提出的通过对Java字节代码进行动态编译和优化来优化Java应用的执行的技术。此项技术的关键是,由于典型的字节代码执行显著慢于大多数编译的应用,运行时优化处理的开销可以由执行过程中的不大的改善而吸收。而这样的机会在已高度优化的非Java(二进制代码)应用中是很少存在的。此外,该方法所采用的很多技术,如优化方法调用,并不是普遍适用的。其它项目,如V.Bala等人的“TransparentDynamicOptimizationthedesignandimplementationofDynamo”(HPL1999-1978990621)中所描述的技术,通过重新安排代码布局来改善指令缓存局部性,来解决动态改善运行时性能的问题,它所基于的假设是,开销可以由所产生的执行时间方面的改善来补偿。然而,Dynamo技术没有利用插截信息(instrumentationinformation),而且由于它是为单处理器系统设计的,也没有考虑多处理器应用。然而,今天的计算机系统通常包含不止一个处理器。即使在低端,单片多处理器也正在变得普遍起来。常见的情况是,在许多这些配置中,至少其中的一个处理器被利用不足。利用多处理器能力以改善程序执行的早期努力集中于诸如应用的自动并行化的技术。这些技术只取得有限的成功,这是由于多种原因,其中最显著的一点是自动并行化最适用于数值计算密集的应用,特别是哪些使用Fortran编写的应用;而通常以C语言编写的商业事务处理应用,事实证明不那么适于这种方法;而且,即使对于较常规类型的代码,自动并行化也已证明在实践中难以实施。因此,显然需要一种优化处理过程,它可以利用多处理器系统的独有特性,并面向更广泛类别的代码。
发明内容鉴于传统方法和结构的上述和其它问题、障碍和缺点,本发明的一个目的是,通过抓住时机地利用一个或多个空闲的或利用不足的处理器,而提高多处理器系统中的程序执行效率。本发明的另一个目的是通过了解软件系统的执行特征,并应用此种知识,以对系统的用户透明的方式,来调整和提高在当前主机系统上的执行行为,而改善该软件系统的性能。具体而言,本发明试图通过利用对称或分布式多处理器系统中的可用周期,实现此性能提高,而不妨碍被优化应用的执行,从而对传统方法和系统进行改进。在本发明的第一个方面中,一种在多重处理环境中进行透明动态优化的方法(和系统),包括使用运行于系统的另一个处理器上的执行监视器,来监视一个第一处理器上的应用的执行,并使用运行于系统的该另一个处理器上的运行时优化器,来透明地优化原始应用的一个或多个片段。在本发明的第二个方面中,一种用于多处理器计算环境对应用进行相对于其执行环境的同时的、动态的优化的方法,包括在系统的一个第一处理器上执行该应用的被插截的(instrumented,被加入检测代码的)复本;使用运行于该系统的另一个处理器上的执行监视器监视该应用的执行,该监视是参照执行特征而进行的,该执行特征是通过执行包含于该应用的被插截的复本中的插截代码而产生的;使用执行于该系统的另一个处理器上的运行时优化器对原始应用的一个或多个片段进行优化,该优化是参照该执行监视器所收集的执行特征而进行的,并且不会影响并行执行的应用的性能;通过使用新近优化的片段代替一个或多个片段而修改原始执行应用,该修改是以对该应用的用户透明的方式进行的。在本发明的第三个方面中,一种用于在多处理器系统中对应用进行相对于其执行环境的同时的、动态的优化的方法,包括使用运行于一个单独的处理器上、或作为单独的处理过程运行于多个处理器上的执行监视器,监视运行于一个第一处理器上的一个程序或应用的每次执行;由二进制代码在其执行时,创建二进制代码的执行特征的简表数据(profiledata),该二进制代码包含用于监视性能的插截代码;执行监视器不断地评估该简表数据;并当一个给定阈值条件满足时,调用动态优化器,来优化频繁执行的代码片段,优化后的代码片段被插入执行的指令流中,用于其后续的执行。在本发明的第四个方面中,一种在共享多重处理(sharedmultiprocessing,SMP)系统中进行透明动态优化的方法,包括在一个第一处理器上执行应用二进制程序;在该系统的另一个处理器上监视该执行的行为,并在应用二进制程序执行的同时,对应用二进制程序的执行进行优化。在本发明的第五个方面中,一种在多重处理系统中进行透明动态优化的系统,包括一个执行监视器,用于监视在一个第一处理器上一个应用二进制程序的执行,该执行监视器运行于该系统的另一个处理器上,该执行监视器包括一个动态优化器,用于与监视同时地优化该原始应用二进制程序的一个或多个片段,该优化器执行于该系统的该另一个处理器上。在本发明的第六个方面中,一种信号承载介质,以有形的方式体现了机器可读的指令的程序,该程序可由数字处理装置执行,以在多重处理系统中执行透明动态优化的方法,该方法包括使用运行于该系统的另一个处理器上的执行监视器监视一个第一处理器上的应用二进制程序的执行,并使用执行于该系统的该另一个处理器上的运行时优化器透明地优化原始应用二进制程序的一个或多个段。因而,使用本发明时,优选地使用多重处理系统中多余的处理周期来观察执行中的应用的执行特征,并透明地修改此运行的系统,以显著提高其性能。优选地,程序或应用的每次执行由一个执行监视器“跟踪”(shadow),该监视器运行于另一个处理器上,或作为一个单独的进程运行于多个处理器上。当它执行时,包含被设计用来监视性能的插截代码的该二进制代码创建其执行特征的简表。执行监视器不断地评估此简表数据,并当满足给定阈值条件时,调用本发明的动态优化器,以优化(或再优化)频繁执行的代码片段,然后将其插入该执行指令流中,这里它们被用于随后的执行。新插入的代码片段或者不包含插截,或者被再次插截以便检测该应用的执行特征中的进一步变化。本发明把上述技术应用于二进制可执行(文件),而不是Java的字节代码,后者由于是被解释的,因而执行得足够慢,以至于可逐步补偿优化的成本(但是,同样的技术对于字节代码应用也是有效的)。就是说,二进制程序(代码)是以如此方式被插截的,以至于当它运行时,能够在共享多处理器(SMP)系统的另一个处理器上监视其执行行为,并在其执行过程中,该此另一个处理器上,对它进行优化。从参照附图对本发明的优选实施例所作的如下详细说明,可以更好地理解本发明的上述及其它目的、方面和优点,在附图中图1示出了用于运行本发明的一个多重处理系统100的系统视图;图2所示增强视图200示出了根据本发明的用于运行被插截的二进制(程序)201a的处理器201,以及用于运行动态优化器207的处理器203。图3的流程图示出了根据本发明的动态优化处理过程300;图4的流程图是本发明的动态优化器的处理过程400的另一个实施例400,它适用于利用在静态优化处理过程中收集的信息,具体而言,其中编译时收集的数据被保存在可执行程序中,以便由执行监视器的动态优化器组件在运行时使用。图5A-5C示出了在图4所示方法400中创建的注释文件,具体而言,图5A示出了一种称为控制流图(ControlFlowGraph)的编译时数据结构的可视表示,图5B示出了该流图的编码表示,它可以形成该注释的二进制(程序)的一部分,而图5C代表可能被包含在图5B的例子的注释文件中的实际数据;图6示出了本发明的一个进一步的实施例,它允许对那些在静态优化时未被插截的二进制应用进行动态优化;图7示出了本发明的一个实施例,它用于如前述具有IBM档案编号(IBMDocketNo.)YOR920010532US1的美国专利申请号10/_,_所描述的仿真器(emulator);以及图8示出一种信号承载介质800(如存储介质),用于根据本发明的方法的程序的存储步骤。具体实施例方式现在请参照附图,更具体地说,参照图1-8,其中示出了根据本发明的方法和结构的优选实施例。大体上说,本发明以新的方式利用了多重处理能力,以获得在多处理器系统上执行程序时显著的性能改善。纯粹静态编译器一般假设程序中的所有路径都同等地可能被采用,因而通常对所有可能路径进行同等程度的优化。然而,由于在实际上可能更经常采用某些路径,因而如果选择关键的路径进行优化,甚至付出减慢不常采取的路径的代价,优化可能会更有利。另一方面,纯粹动态编译器(如Java字节代码程序的大多数及时(just-in-time,JIT)编译器),尽管拥有程序当前执行的详细信息,却由于需要在很窄的时间窗(temporalwindow)内使用此信息的苛求而被严重阻碍。正如下面将说明的,本发明相对于已知的动态编译器有两个优点。首先,由于其多处理器设计,它实际上不需要运行在如此受限制的时间范围中。其次,在进行优化操作时,它可以利用静态优化输出,以便减少执行过程中程序分析的需要。此外,在不太遥远的未来,预期几乎所有系统都将用单片多处理器建造,因而使得本发明的方法格外意义重大。在即将在这里描述的本发明的一个实施例中,我们假定动态运行时优化系统(或“动态优化器”)-该系统包含的那些方法来监视代码执行,基于收集到的执行信息对代码进行优化,并将被优化的代码重新插入程序-可以作为子线程或进程而处于持续运行的执行监视器控制之下,在一个处理器(或一组处理器)中执行,该处理器独立于执行被监视程序的一个处理器(或一组处理器)。进一步地,将被优化的执行代码被使用诸如Ball等人的“EfficientPathProfiling”(ProceedingsofMICRO1996,Dec.1996)中所描述的技术编译以纳入插截代码。因而,本发明假定执行的二进制代码已经被插截(例如静态地或动态地),正如在本领域中广为人知的。本发明的一个重点是以新的方式利用该插截代码所产生的信息。应当注意的是,尽管上述描述假定使用SMP环境,但本发明也适用于这样的计算机系统,它由一个或多个处理器的一个群集所构成,这些处理器通过分布式共享存储器进行通信。在这样的配置中,动态优化系统既可以在群集中的一个(或多个)节点上执行,也可以在群集中的一个节点的一个(或多个)处理器上运行,只要它们与执行待优化代码的节点或处理器不同。下面,我们将参照图1,详细描述本发明,该图示出了运行于多重处理硬件系统100之上的动态优化器。多重处理系统100可以包括大于1的任意数量处理器101a、101b等,在图1中每个处理器分别被标以1至n+1。每个处理器可以具有自己的局部存储器(图1中未示出),而所有处理器都可以通过一个共享的主存储器102进行通信。该系统被一个操作系统103控制,该操作系统包含或支持一个线程调度软件包。对于每一个被插截的、且在本发明的动态优化处理过程中执行的程序(如执行的二进制程序),在一个执行监视器104中将繁育(spawn)一个同时性的执行监视器线程,下面将详细描述。执行监视器线程的目的是分析给定执行中的被插截的二进制代码(程序)的执行行为,并进一步根据此种分析,进行更改(优化),它将保持该应用的期望输出,但减少产生这些输出的时间。此(监视器)线程只当它监视的应用执行时才执行。因此,图1示出了有1至n个处理器执行真正的应用,其中每个都可能与所有其他的不同,并至少有一个另外的处理器n+1(例如,可能有多个其它处理器,如n+2等,但简便起见只示出一个)。有一个执行监视器104与运行在处理器1至n上的每一个被插截的二进制(程序)相关联。它们不需要都只运行在处理器n+1上。根据这样的执行监视器104耗用多少资源,它们也可以运行在其它一个或多个不同的处理器上。然而,在执行监视器的数量和在处理器1至n上运行的被插截的二进制(程序)的数量之间存在着一对一的关系。应当注意的是在一个SMP的多于一个的处理器上可能有多于一个被插截的二进制(程序)在执行。这里描述的关系只是在这样的被插截的二进制(程序)和它自己的“影子”(跟踪)进程之间(如下面描述并如图2中的标号201a和205所示的)。正是这种一对一关系,是本发明所关注、并有利地加以利用的,而本发明只要求一个给定的被插截的二进制程序的影子进程执行在一个分离的处理器上。这样,当处理器1(101a)执行其二进制(程序)时,处理器1的执行特征由一个专用的执行监视器104观察。图2是一个概念性视图200,它表现了在一个第一处理器201上执行的、将被优化的被插截的二进制应用201a,和监视此被插截的二进制应用201a的执行的执行监视器线程205之间的交互,该执行监视器在与处理器201不同的处理器203上被执行。在图2中,执行的被插截的二进制(程序)可能由一个相当大的系统构成,并执行很长时间。在这里,执行的被插截的二进制(程序)在执行过程中被监视和修改的方法称为一个“影子”进程。该影子进程包括使用一个执行监视器、一个动态优化器和一个片段表(或高速缓存)管理器。在被插截的二进制(程序)的启动时,该“影子”即被派生(fork),并在被插截的二进制(程序)或应用的执行过程中继续执行。影子进程205也包括一个片段高速缓存(fragmentcache)201b。应当注意的是,片段高速缓存201b是影子进程的一种软件产物,用于在向执行的代码流重新插入它们之间保存优化后的代码片段。该数据结构很大,并由“片段高速缓存管理器”管理,以便动态存储被插截的应用201a的被再优化的片段。这些“片段”是被频繁执行的指令序列(由执行监视器线程基于它对插截代码所产生的插截信息的分析而确定),这些指令序列可能随后由处理器201作为该应用的一部分而执行,它们是当“影子”进程确定该片段的优化可以导致程序执行得更有效率时,在影子进程的执行或简表监视步骤(204)中被选择的。应当注意的是,只有执行的二进制程序的被选择部分才被存储在片段高速缓存201b中。这些部分是基于插截(代码)的输出而选择的。基本上,它们包括被频繁执行的指令的序列,以及优化功能认为必要和可接受的某些添加或删除。执行或简表监视器204可能监视各种特征,包括程序中某一特定路径被执行的次数。因此,如果一个路径被执行了很多次(如1000次或更多),则它将触发片段管理器202,开始对此路径进行某种处理,并开始针对此特定代码片段的优化处理过程(使用下面将讨论的动态优化器207)。因而,处理器203也运行动态优化器线程207,作为影子进程线程205的一部分,用于优化来自被插截的二进制应用的所选择片段,并通过片段管理器202,将优化后的片段传回片段高速缓存201b。在上例关于监视程序中的路径被执行了多少次、以及是否此种执行发生的次数已超过一个阈值(临界)次数(如多于1000次)的情境中,片段管理器202采取行动,从片段高速缓存201b中提取该路径(例如,执行的二进制程序的一部分或一个“片段”,它是一个较小的代码块)或该路径的一部分,以便由动态优化器207进行优化(或再优化)。因此,这些片段被取出、优化然后再放回到运行的二进制程序中。片段管理器202确定应当优化该路径的哪个部分。很可能这不是整个路径。片段管理器202通过制作该指令的复本而“抽取”(提取)该部分路径,并存储这些指令,以便优化器207可以察看复本,并对复本进行更改。就是说,片段管理器202“告诉”优化器207执行这种优化,并向它提供片段管理器202认为与该片段有关的简表信息。然后,优化器将对该片段进行优化(如重排代码的顺序等,以便使其更快和更有效),并在完成后,通知片段管理器202。然后,片段管理器202,使用存储在它自己的内部表中的数据,确定在处理器1(201)上的原始执行的二进制程序中重新插入被优化的代码的正确的逻辑位置。然后,被优化的代码被放入处理器1(201)的片段高速缓存201b中,而片段管理器202将修改执行的程序,从而下次在执行的二进制程序中同样的路径(指令)(或者路径的一部分,如在可能的情况下)需要执行时,片段高速缓存201b中的代码片段将被挑选执行,代替原始执行二进制程序中的代码。应当注意的是,片段管理器202在第一次会直接从被插截的执行的二进制程序201a中提取一段路径,而在以后的阶段(例如,路径再优化),片段管理器202将从片段高速缓存201b中提取它,而不是直接从被插截的执行的二进制程序201a中提取。因此,片段可以以两种形式出现作为原始二进制程序(或后来的动态优化后的二进制程序)中的真实代码序列,以及作为动态优化器产生的重新插入的被优化的代码序列。后者出现在片段高速缓存201b中,而前者(除了上述括号中的情况之外)出现在原始应用中。对于每一个执行的被插截的二进制应用,将有一个执行监视器线程(影子进程线程)205的实例,在这里,一个给定的被插截的二进制应用的执行监视器被称为它的“监视线程”。执行监视器(或影子进程)线程205的操作是与应用平行进行的,但不为应用所知,应用的执行过程,除了产生表现它自己的执行特征的简表流之外,没有变化。应当注意的是,“执行特征”代表由被插截的二进制程序作为执行的副作用而产生的简档数据。此外,应当注意的是,片段高速缓存201b只是一个数据结构或表,它存在于(驻留在)共享存储器中,由执行监视器线程205的片段管理器202分配和控制。如上所述,片段是这样的指令序列,其执行特征使它成为潜在的(再)优化对象;该指令序列将由执行监视器(影子进程)205从执行的二进制程序中提取,优化后保存在片段高速缓存中,以便随后重新插入到二进制程序中。还应当注意的是,由于目的是优化这些片段,并重新把它们插入执行的二进制程序,因此它们在片段高速缓存201b中的驻存是暂时的(transient),并使用标准技术管理和收回其存储(空间)。本发明的方法图3的流程图示出了与本发明的动态优化处理过程有关的图2所示的系统所进行的方法300的步骤。在方法300中,当把被插截的二进制程序装入处理器201之时,即执行一次派生,以在图2所示的处理器203(n+1)中启动执行监视器线程(步骤300A)。进一步讲,当装入被插截的二进制应用时,即在步骤301繁育(派生)一个执行监视器线程,用于在图2所示处理器203(n+1)上与处理器201上被插截的二进制应用的执行并行地执行。如上所述,执行监视器线程也称为“影子线程”,因为它观察或监视被插截的二进制程序的执行。影子进程(执行监视)线程的繁育是通过执行诸如FORK或其它某种操作系统(OS)原语实现的。再次强调,应当注意此种活动的并行性质。这种并行性很重要,因为它允许使用更主动的技术,并允许定时的误差(错误),这是由于在处理器201上运行的被插截的二进制应用不知道分析和优化处理过程,因而从来不需要等待(不象上述Dynamo或JavaJIT的情况)。尽管被插截的二进制应用可以是被设计用来进行基准检测(benchmarking)的程序,当该系统与实际的用户应用一起使用并执行实际的用户数据时,该系统的真正益处才得以实现。作为执行被插截的二进制程序的一部分,在步骤302中,产生执行简表。执行简表描述执行的二进制程序(或正在运行的程序)的执行特征。这些特征是由插入到该二进制应用的特定的插截代码(instrumentationcode)确定的。插截代码可能被设计用来监视的特征的例子包括该应用中一个特定循环执行的次数,或更特别地,一个特定路径或代码块序列被执行的次数。应当注意的是,简表数据是由被插截的应用在共享存储器中产生的,而影子进程(执行监视器)线程从同一个共享存储器位置读取它。监视器线程并不非常严格地依赖于任何一个简表计数器的绝对值(例如,一个循环的10,000次执行和10,0001次执行甚至11,000次执行并没有显著不同),因而不需要在应用线程和监视器线程之间锁定或其它同步方法。如下所述,该信息是在产生的过程中连续提供的。因而,这是一个动态处理过程,并且因为此种信息是连续地被提供的,执行代码可以在执行发生时实际地被修改。因此,在步骤302,图2所示运行于处理器203之上的执行监视线程205持续地监视所产生的简表信息(例如,也称为“执行特征”),而监视线程205唯一地与当前接受检验的被插截的二进制应用相关联。为了描述当前实施例,我们假设监视线程运行于一个单独的处理器之上,此处理器与执行正在接受检验的、被插截的二进制应用的处理器不同。然而,本发明的意图是,监视线程也可以在多个处理器上运行,只要这些处理器与正在执行被插截的二进制应用的处理器不同。在步骤304,影子进程(执行监视器)205检验所产生的简表数据,以确定临界(阈值)条件是否满足。就本示例性实施例而言,可以采用一个计数据器或增数/减数器(incrementer/decrementer)。可替代地,在不同的实施例中,可以使用不同的结构。例如,根据正在检测的阈值是什么、或者条件或正在检测的阈值的复杂性,可以使用计数器和某种其它装置的组合(或者多个计数器的组合,其中各计数器的总和达到某个值时,其依次指示某种条件)。通常,采用的阈值是在插截时设置的,而且在执行时它们被逐步减少,因而达到零值即触发调用优化器207。进一步地,通常“阈值”是与某种计数或数量相联系的(例如,相同的代码被执行的次数),这与被检测的某其它类型的值是不同的。优选地,优化器207是一种通用编译器优化器。已经意识道,它是在运行时执行的,并且这样与典型的编译时优化器相比必须用较少时间执行,但除此之外,它在任何方面都不是专门适应于它正在优化的二进制应用。动态优化器207通常分析包含它被调用来处理的“片段”的特定指令序列,并通过例如对指令序列重新组合以便补偿当基础硬件不是代码为之编译的特定型号时可能发生的延迟,来改善其性能。动态优化器270通常与动态编译系统预封装在一起。例如,它可能作为计算机的操作系统(OS)的一部分而分发。只要阈值还没有达到,监视线程205就将继续检验插截(代码)的输出。如果达到阈值,则在步骤306,造成阈值到达的二进制应用的那部分就被从被插截的二进制程序中抽取出来(如由片段管理器207复制),并发送给动态优化器207进行优化,并在优化后存储在片段高速缓存201b中,以便此后当本来要执行原始的(未进行再优化的)片段时使用。接着,在步骤308中,该片段被优化器207优化。如上所述,所采用的优化处理过程是可用于在运行时优化代码的许多标准优化技术之一。优选的优化类型是那些利用在静态编译时尚不知道的信息(例如,一个给定变量在运行时具有一个恒定值)的类型。此外,可以进行这样的优化,根据存在大量证据表明一个给定变量确实具有一个恒定值,推测该变量具有该设想的值。当然,在这种情况下,必须为这种猜测不正确的情况作好准备。我们注意到,这样的考虑在本领域是为人所知的,但是在这里,本发明将它应用在新的情境中。例如,优化可以包括从频繁执行的代码路径中取消不必要的分支,或者使应用专用于充分利用它正在其上运行的特定网络节点的体系结构能力。大体上说,如果应用已被编译以运行于一种机器的早期型号(或更便宜的型号)上,并在当前情况下运行于较晚的机器(或更昂贵和高端的机器)上,则会存在进一优化的机会。例如,可能有新的和更强大的指令,或者与应用原来为之编译的机器相比,当前机器有更多指令级并行性(如更多的功能单元)。这些可能的情况(在网络化的世界里,它们正变得越来越可能了)将导致动态再优化的显著机会。因而,这呈现了应用这些技术的另一个理由。就是说,在网络化世界里,人们有强烈的动机为特定体系结构的“最小公分母”型号进行编译,因为这样应用可以运行于网络中更多比例的计算机上。然而,这也提供了降低优化水平(因而降低性能)的动机,本发明的技术对于改善这样的应用的运行次数特别有用。可选地,图3中的方法300允许在被优化的片段中插入插截代码,以允许随后的监视。这种在片段中自动插入插截代码的做法,相信是人所熟知的,因而简略起见,这里就不进一步描述了。上述Bala等人的文章(及其它文章)讲授了如何插入插截(代码)。当在步骤308由动态优化器207进行优化之后,在步骤310,优化后的片段被保存于片段高速缓存201b中。然后,在步骤312中,已优化的片段被插入被插截的二进制程序中,代替未优化的版本,这样在将来,在被插截的二进制的随后的执行时,它将作为被插截的二进制程序的一部分而被执行。作为示例,这种插入操作可以通过这样的方法完成,即对原二进制程序进行修补(patch),使其分支到新优化的片段,而该优化的片段当然也必须分支回原来的(被提取的)的片段之后的指令。也可以使用其它技术,正如当本领域普通技术人员从整体上理解了本发明之后,所能清楚地理解的。可选地,在插入二进制应用之前,该插截代码也可以被从片段中删除。在这种情况下,并非插截代码本身被删除了,因为它实际上没有重新插入。插截(代码)是相当程式化的并且容易被识别,因此应用代码可以很容易地与插截区分开来,因而避免并不困难。即使情况不是这样,使插截的位置由插截代理(instrumentingagent)记录在已知的(或可发现的)位置,也不困难。当在步骤312中优化后的片段插入执行的二进制程序之后,在步骤313中,将确定被插截的二进制程序是否仍在执行。如果被插截的二进制程序仍在执行(如步骤313中的“是”),则本处理过程循环回到步骤302。如果被插截的二进制程序并非仍在执行(如步骤313中的“否”),则本处理过程进行到步骤314。在步骤314中,被插截的二进制程序和执行监视器(影子线程)的执行终止。因而,二进制程序和影子线程的执行是同时终止的。确实,本发明的一个关键特征就是所有步骤都是在执行时发生的。应当注意的是,如上所述,图3所示的两个垂直流程是并行操作。第二个实施例现在参照图4讨论本发明的另一个实施例,它是对图3所示处理过程的改进,具体而言可用于图3中的步骤308。就是说,在图3的步骤308中,动态优化器207检验一个片段,并分析该片段,以确定可以执行何种优化,而优化该片段。这种优化决定只是基于动态优化器此时能够观察到的东西。在图4的方法400中,采取了一些附加步骤以使动态优化器207进行更好的优化。在这方面,在步聚308中为动态优化器207提供了附加信息,以便该优化器可以更快地运行,而不需要优化器自己计算此种信息。此外,还可以为优化器提供它在其它情况下可能很难自己提取的信息。具体而言,图4示出了一种动态优化方法400,该方法利用了一个应用程序的静态编译时所收集的信息。按照本发明的这一实施例,动态优化器207可以利用编译时所收集的关于该被插截的二进制程序的信息,该编译在这里称为动态优化处理过程的“静态编译阶段”。应当注意的是,由静态编译器所产生的数据/信息一般保存在一个注释的二进制程序中,其可以是被插截的二进制程序,该程序具有一个扩展(例如附加其上的一个注释)以包含额外信息。在静态优化时能够收集的、并有助于动态优化的信息可以包括流图信息,特别是那些标签是一个给定分支的目标,以及静态的数据依赖性,在运行时,由于消除了这种依赖的模糊性,而可以使得编译时受到抑制的优化可以进行。本实施例可能特别有利地利用了编译时更容易检测的详细信息,从而排除了代价高昂的运行时的分析。方法400开始于图4的步骤400A,其中以上面参照图3所描述的方式将插截代码插入已编译的程序。上述注释是在编译时通过收集静态程序信息(不是通过使用一组特定的样本数据执行程序而收集的简表数据)而产生的。在步骤402,编译进行,并且信息在编译的各种阶段,如前端处理(FrontEnd)、优化(Optimizeton)、寄存器分配(RegisterAllocation)和最终汇编(FinalAssembly)阶段被收集。步骤404描述在收集到有用信息的各种位置(peint)上编译器的中间语言(IntermediateLanguage,IL)的注释。在步骤406中,由静态编译阶段产生的二进制程序不仅包括自本说明书开始至此一直提及的插截,而且也包括编译时产生的注释。这些注释采取的形式是附加于二进制模块的编码的数据串。步骤410-414按图3所述的方式进行,但不同之处在于包含在已注释二进制程序中的信息被执行监视器(影子进程)系统的动态优化组件展开(deploy)。应当注意的是,修改只是针对二进制程序的,并与二进制程序的执行并行地进行。如果不需要进一步的静态优化,则在步骤402收集的信息被用于创建一个注释文件,该文件将在步骤408中被附加到该被插截的二进制程序上。这种文件的一个例子如图5A-5C所示。具体而言,图5A示出了一个称为控制流图(ControlFlowGraph)的编译时数据结构的可视表示500。该图中的每个节点(即1-12)代表一个基本块,而有向线代表连接节点的后继边(successoredge)。这里代表的程序包括一个计算的转移表(branchtable,分支表)。图5B示出可能构成已注释的二进制程序的一部分的流图的编码表示。图5C代表此例的可能包含在注释文件中的实际数据540。动态优化器207有可能会在运行时使用此数据快速重建此图。然后,已注释的、被插截的二进制程序就准备好,可以在装备了根据本发明的动态优化工具207的多处理器系统中运行。在步骤408中,该程序被使用实际的用户数据在一个第一处理器或第一组处理器上运行,该程序在步骤410中,在与执行该二进制应用本身的处理器不同的一个或一组处理器上,为被插截的二进制应用繁育执行监视器线程。在步骤412,动态优化器使用静态优化时产生的注释,以及由包含在执行的二进制程序中的插截(代码)产生的信息,来生成改进的优化二进制程序;如同上面参照图3的步骤302-312所描述的,但经过了修改以利用注释。第三个实施例转向图6中处理过程600的流程图,该图显示,根据本发明的动态优化系统的另一个实施例,包括在将被优化的二进制应用的执行过程中,检测该二进制应用的某些已经被频繁执行的、未被插截的(non-instrumented)模块的能力。如果检测到这样的模块(步骤610),本发明规定了自动插入插截代码,以用于随后的监视和优化。应当注意的是,图6的内容可以被视为优化的一个特例,从逻辑上讲,图6的步骤与图3中的框306和框312之间一致。为了避免修改有可能会与其它应用“共享”的代码,在步骤620中,系统制作了原始模块(未被提取简表的(unprofiled)二进制程序)的复本,并维护一个如此更改的任意模块的列表。然后,步骤630调用该方法,以对二进制模块中进行插截。在将来调用该模块时,监视器可以立即切换到被插截的版本,并执行它以产生将由执行监视器(步骤640)读取的简表。就是说,步骤640修改“热的”(hot)片段,从而在下次调用时调用被插截的版本。然后,本方法进行到图3中的步骤310,并继续进行直到该执行在步骤314终止,此时,在步骤650中,复制的二进制程序列表被删除。本技术允许在例如由于无法得到源代码而无法编译的组件中进行插截。二进制运行时程序库是可以用这种方式优化的这种组件的一个例子。本发明的这个方面的进一步应用允许遗留(即未被插截的)的二进制程序通过应用所描述的自动重编译技术,而享受处理器组织的结构化增强或提高的益处。第四个实施例在如图7所示本发明的另一个实施例中,在动态转换一个目标应用的指令流用于在如上述Nair等人的、具有IBM档案编号YOR920010532US1的美国专利申请No.10/_,_所描述的宿主系统上运行的处理过程中,产生被插截的二进制程序。图7示出了系统700,它包括由用于宿主处理器750的线程调度器740调度的仿真(emulation)线程710、转换线程720和服务线程730。在如图7所示的本实施例中,仿真系统700具有执行监视器线程,它是仿真系统700的一个不可少的部分,即转换线程720之一。一个或多个转换线程被用来动态地优化由执行监视器选择的代码片段。在图7所示系统700中,频繁执行的代码序列被动态优化,以提高性能。这些序列是由解释器转换线程插入的插截代码识别的,其采用计数器来跟踪被缓存的代码的执行频率。监视器线程不断追踪这些计数器的值,并在其达到某个阈值时,发信号通知优化器线程对一个给定代码序列进行(更多)优化是有益的,并且指明引入该将被优化的代码序列的(被仿真的)宾客(guest)指令的真实地址。除了上述硬件/软件环境以外,本发明的一个不同方面包括一个用于执行上述各方法的计算机实施的方法。作为例子,该方法可以在上述特定环境中实施。例如,这样一样方法可以通过操作由数字数据处理设备所体现的一个计算机,来执行机器可读指令序列而被实施。这些指令可以驻留在各种信号承载介质中。作为例子,这种信号承载介质可以包括CPU中包含的RAM,如由快速访问存储技术所代表的。可替代地,该指令也可以被包含在其它信号存储介质中,例如可以由CPU直接或间接访问的磁性数据存储盘800(图8)中。不管是包含在磁盘800、计算机/CPU中,还是包含在其它地方,该指令可以被存储在各种机器可读的数据存储介质中,如DASD存储(如传统的“硬盘驱动器”或RAID阵列)、磁带、电子只读存储器(如ROM、EPROM或EEPROM)、光存储设备(如CD-ROM、WORM、DVD、数字光带等)、纸质“穿孔”卡或其它适当的信号承载介质,包括传输介质,如数字和模拟通信链路和无线链路。在本发明的一个说明性实施例中,该机器可读的指令可以包括软件目标代码,该目标代码是从诸如C等语言编译而成的。尽管本发明是按照几个优选实施例进行说明的,但本领域的技术人员能够认识到,实施本发明时,可以在附后的权利要求书的精神和范围内进行修改。例如,如上所述,本发明不仅局限于共享多处理器系统(SMP),也可以有利地用于分布式多处理器系统。此外,应当注意的是,申请人的意图是涵盖所有权利要求元素的等同物,即使在以后的获得权力的过程中有修改。权利要求1.一种多重处理系统中透明动态优化的方法,包括使用运行于该系统的另一个处理器上的执行监视器,监视在一个第一处理器上的应用二进制程序的执行。使用在该系统的所述另一个处理器上执行的运行时优化器,透明地优化原始的应用二进制程序的一个或多个段。2.如权利要求1所述的方法,进一步包括在该系统的所述第一处理器上执行该应用二进制程序的一个被插截的复本。3.如权利要求1所述的方法,其中所述监视是参照执行特征进行的,该执行特征是通过执行在该应用二进制程序的被插截的复本中包含的被插截的代码而产生的。4.如权利要求1所述的方法,其中所述优化是参照由该执行监视器收集的执行特征而进行的,并且不影响并行执行的应用二进制程序的性能。5.如权利要求1所述的方法,进一步包括通过用新近优化的段代替一个或多个段,同时地修改原始执行应用二进制程序。6.如权利要求5所述的方法,其中所述修改是以对该应用二进制程序的用户透明的方式进行的。7.如权利要求1所述的方法,进一步包括在插入执行的应用二进制程序之前,从已优化的部分中删除插截代码。8.如权利要求1所述的方法,进一步包括,通过插截,确定已经被频繁执行的一个或多个段。9.如权利要求1所述的方法,进一步包括向一个被优化的部分插入新的插截,来继续监视该新近优化的应用二进制程序的执行特征。10.如权利要求1所述的方法,其中所述优化包括从被频繁执行的代码路径中删除不必要的分支。11.如权利要求1所述的方法,其中所述优化包括使一个应用二进制程序专门化于充分利用它正运行于其上的一个特定网络节点的结构能力。12.如权利要求1所述的方法,其中该应用二进制程序包括编译时收集的并存储在该二进制程序中以供所述运行时优化器使用的简表指令和程序数据。13.如权利要求1所述的方法,其中执行的应用二进制程序的至少多个部分没有被预先插截。14.如权利要求13所述的方法,其中所述至少多个部分包括没有源代码的遗留二进制程序和共享的运行时程序库的至少一个,所述方法进一步包括监视频繁执行的多个二进制程序;分析所述多个二进制程序,并制作一个复本,其中插入适当的插截代码;以及在将来调用所述二进制程序时,切换到一个被插截的复本,并继续其执行。15.如权利要求14所述的方法,其中在没有被执行时,所述多个二进制程序被分析。16.如权利要求1所述的方法,其中所述系统包括通过分布式共享存储器进行通信的一簇节点。17.如权利要求1所述的方法,其中所述系统包括一个共享多处理器系统(SMP)。18.如权利要求2所述的方法,其中该被插截的应用二进制程序是在动态转换一个目标应用的指令流、用于在一个宿主系统上执行的处理过程中产生的。19.一种用于多处理器计算环境对一个应用针对其执行环境进行同时的、动态的优化的方法,包括在该系统中一个第一处理器上执行该应用的一个被插截的复本;使用运行于该系统的另一个处理器上的一个执行监视器,监视该应用的执行,所述监视是参照执行特征进行的,该执行特征是通过执行包含在该应用的被插截的复本中的插截代码产生的;使用该系统的另一个处理器上执行的一个运行时优化器,优化该原始应用的一个或多个段,所述优化是参照由所述执行监视器所收集的执行特征进行的,并且对该并行执行的应用的性能没有影响;通过用新近优化的段代替一个或多个段,修改该原始执行应用,所述修改是以对该应用的用户透明的方式进行的。20.一种用于在多处理器系统中对一个应用针对其执行环境进行同时的、动态优化的方法,包括由运行于一个单独的处理器或作为单独的进程运行于多个处理器上的一个执行监视器,监视运行于一个第一处理器上的一个程序或应用的每次执行;由二进制代码在其执行时,创建所述二进制代码的执行特征的简表数据,所述二进制代码包含用于监视性能的插截代码;由所述执行监视器持续地评估该简表数据;以及当一个给定临界条件满足时,调用一个动态优化器来优化频繁执行的代码片段;所述被优化的代码片段被插入执行的指令流,用于随后其执行。21.如权利要求20所述的方法,其中该多处理器系统中的多余处理周期被用来观察该执行的应用的执行特征,并透明地修改该执行的应用,以改进其性能。22.如权利要求20所述的方法,其中新插入的代码片段不包含插截。23.如权利要求20所述的方法,其中新插入的代码片段包含再插截代码,以检测该应用的执行特征中的进一步变化。24.一种共享多重处理(SMP)系统中透明动态优化的方法,包括在一个第一处理器上执行一个应用二进制程序;在该系统的另一个处理器上,监视该执行的行为;以及当该应用二进制程序正在执行时,优化该应用二进制程序的执行。25.如权利要求24所述的方法,其中所述应用二进制程序是被插截的。26.如权利要求24所述的方法,其中该应用二进制程序的至少一些没有先前被插截。27.一种用于在多重处理系统中进行透明动态优化的系统,包括一个执行监视器,用于监视在一个第一处理器上的一个应用二进制程序的执行,所述执行监视器运行在该系统的另一个处理器上;所述执行监视器包括一个动态优化器,用于与所述监视同时地优化该原始应用二进制程序的一个或多个段,所述优化器在该系统的所述另一个处理器上执行。28.如权利要求27所述的系统,其中所述执行监视器包括一个片段高速缓存,用于动态存储该被插截的二进制应用的多个再优化的片段。29.如权利要求27所述的系统,其中所述执行监视器参照执行特征进行该监视,该执行特征是通过执行包含在该应用二进制程序的一个被插截的复本中的插截代码而产生的。30.如权利要求27所述的系统,其中所述动态优化器参照执行监视器所收集的执行特征进行该优化,并且不影响该并行执行的应用二进制程序的性能。31.如权利要求27所述的系统,其中所述执行监视器通过用新近优化的段取代一个或多个段,来同时地修改该原始执行应用二进制程序。32.如权利要求31所述的系统,其中所述修改是以对该应用二进制程序的用户透明的方式进行的。33.如权利要求27所述的系统,其中所述执行监视器在将一个优化后的部分插入该执行的应用二进制程序之前,从该优化后的部分中删除插截代码。34.如权利要求27所述的系统,其中所述执行监视器向一个优化后的部分中插入新的插截,从而继续监视该新近优化的应用二进制程序的执行特征。35.如权利要求27所述的系统,其中该动态优化器从一个被频繁执行的代码路径中删除不必要的分支。36.如权利要求27所述的系统,其中该动态优化器使一个应用二进制程序专门化于利用它正在其上运行的一个特定网络节点的全部结构能力。37.如权利要求27所述的系统,其中该应用二进制包含在编译时收集、并存储在该二进制程序中以便所述动态优化器使用的简表指令和一些程序数据。38.如权利要求27所述的系统,其中该执行的应用二进制程序的至少多个部分没有先前被插截。39.如权利要求38所述的系统,其中所述至少一些部分包括没有源代码的遗留二进制程序和共享的运行时程序库的至少一个,所述系统进一步包括用于监视频繁执行的多个二进制程序的装置;用于分析所述多个二进制程序、并制作一个复本,在其中插入适当的插截代码的装置;以及当将来调用所述二进制程序时,用于切换到一个被插截的复本,并继续其执行的装置。40.如权利要求39所述的系统,其中所述多个二进制程序是在没有执行时被分析的。41.如权利要求27所述的系统,进一步包括通过分布式共享存储器进行通信的一簇节点。42.如权利要求27所述的系统,其中所述系统包括一个共享多处理器系统(SMP)。43.如权利要求28所述的系统,其中在动态转换一个目标应用的指令流、用于在一个宿主系统上执行的处理过程中,产生一个被插截的应用二进制程序。44.如权利要求27所述的系统,其中所述执行监视器专用于所述第一处理器。45.如权利要求28所述的系统,其中所述执行监视器进一步包括片段管理器,用于管理所述片段高速缓存中的多个片段;以及简表监视器,它由该执行的应用二进制程序当预定条件满足时触发,来为该片段管理器提供一个输入;其中,该动态优化器将优化后的片段通过该片段管理器传回片段高速缓存;其中,该执行监视器决定提取该应用二进制程序的哪个部分进行优化,并通过制作那些指令的一个复本提取该应用二进制程序的所述部分,并存储该指令,以便该动态优化器可以引用并修改该复本,其中,所述执行监视器向该动态优化器提供与优化一个特定片段有关的简表信息。46.一种有形地体现了由机器可读的指令的程序的信号承载介质,该程序由数字处理装置执行来实现一种在多重处理系统中透明动态优化的方法,包括使用运行于该系统的另一个处理器上的一个执行监视器,监视在一个第一处理器上的一个应用二进制程序的执行;以及使用在该系统的所述另一个处理器上执行的运行时优化器,透明地优化该原始应用二进制程序的一个或多个段。47.一种用于具有多个宿主处理器的多处理器系统的仿真系统,包括执行监视器,用于当动态地转换一个目标应用的一个指令流、用于在一个宿主系统上执行时,产生被插截的二进制程序;其中所述执行监视器线程包括多个转换线程中的一个;以及其中该多个转换线程的至少一个被用于动态优化由该执行监视器选择的多个代码片段。48.如权利要求47所述的仿真系统,其中所述多个转换线程的一个包括一个优化器线程;其中,频繁执行的多个代码序列被动态地优化,以提高性能;其中,所述多个序列是由被解释器转换线程插入的、监视被缓存的代码的执行频率的插截代码识别的;以及其中多个监视器线程不断地跟踪所述频率,从而当其达到一个预定的阈值时,通知该优化器线程,一个给定代码序列是优化的候选,并向该优化器线程提供引入该将被优化的代码序列的一个宾客指令的一个被仿真的真实地址。49.一个用于多处理器系统的仿真系统,包括多个线程,其中该多个转换线程的一个包括一个执行监视器,并且其中所述多个转换线程的至少一个包括一个动态优化器。全文摘要一种在多重处理环境中透明动态优化的方法(和系统),包括使用运行于该系统的另一个处理器上的执行监视器,监视在一个第一处理器上的一个应用的执行;以及使用在该系统的该另一个处理器上执行的运行时优化器,透明地优化该原始应用的一个或多个段。文档编号G06F9/45GK1490718SQ0315716公开日2004年4月21日申请日期2003年9月16日优先权日2002年9月17日发明者R·奈尔,J·K·奥布赖恩,K·M·奥布赖恩,P·H·奥登,D·A·普莱纳,R奈尔,奥布赖恩,奥登,普莱纳申请人:国际商业机器公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1