软件应用性能增强的制作方法

文档序号:6594453阅读:182来源:国知局
专利名称:软件应用性能增强的制作方法
软件应用性能增强其它申请的交叉引用此申请要求于2008年8月13日提交的题目为METHOD AND APPARATUS TO ENHANCE PERFORMANCE OF SOFTWARE APPLICATIONS的美国临时专利申请号61/188,905的优先权,为了所有目的在此将其并入以供参考。
背景技术
在计算机系统中,在软件的性能和效率方面的改进能够实现新的和改进的应用和功能。在要求更强大的硬件(更强大的硬件进而能够实现更强大的软件)的更强大的软件之间的这种互相促进的交互作用已经成为过去数十年的信息革命的驱动器。在“指令集兼容的”计算的历史中,较新的各代计算机硬件已经对现有应用提供了相当大的改进,而新的且重新编译的应用提供了超过硬件改进的另外改进。然而,由于计算机硬件体系结构技术已经成熟,所以对于微处理器厂商而言,通过微体系结构技术给出增大的性能已变得愈加困难。由于技术正扩展到用以在计算的线程内改进指令级并行性的成本效益技术的极限,所以许多业内人士把线程级并行性看作用以继续性能单调工作的最好技术。因此,制造者已经开始生产在单个半导体“芯片”内包含多个处理器的“多核”CPU。与此相呼应,主要的SW开发者已经开始利用多核处理器的性能潜力要求重新编写应用。作为这些发展的结果,现有应用可能常常不再期望新的各代计算机硬件在性能方面有相当大的改进。大规模的性能改进通常仅可获得于具体地以较新的多核处理器为目标的重新编写的应用。此外,对多线程应用进行编程以利用多处理器体系结构的过程常常是复杂且易于出错的。



图;3B是图示在应用到性能增强的多处理器硬件系统的实施例中的CPU的映射的图。为了并行计算,对应用的(一个或多个)主线程进行分析。对被认为合格于并行计算的部分,诸如组成部分i,ii,…,m,进行重新配置以便以多个线程的形式在各自的CPU上运行,因此这达到了高度的并行化和改进的性能。图4是图示用于从输入代码生成并行可执行代码的过程的实施例的流程图。在各种实施例中,过程400可以在端用户的计算机上进行,或者在软件开发时间在开发者的系统上进行。在各种实施例中,源代码、汇编代码、和/或者二进制代码能够被用作输入代码。 在402,对所述输入代码进行静态分析。如本文所使用的,所述静态分析指对在该分析期间不被要求是正执行的代码的分析。静态分析可以在对系统资源的需求低的时间脱机进行。 在一些实施例中,所述静态分析对所述输入代码进行反汇编,并标识所述输入码的数据部分和代码部分,包括指令、操作、以及数据流和控制流的方面。被标识出的信息中的一些包括被包含在数据段中的数据,被包含在代码段中的代码,有助于上述数据的处理的头信息。数据流和控制流的某些方面,诸如依赖于代码的行为的信息,可能难以使用静态分析获得。因而,在404,对所述输入代码进行动态分析以标识数据流和控制流的另外方面。 如本文所使用的,动态分析指在代码执行时进行的联机或者运行时分析。在各种实施例中, 执行频率、热点和其它简档信息、分支目标、存储器别名信息、以及动态循环计数等等是经由动态分析标识的方面中的一些。此信息可以在运行时经由对代码的解析或者仿真,和/ 或通过执行测量(instrumented)代码来收集。在406,基于通过所述静态分析标识的方面以及通过所述动态过程标识出的另外方面,生成输入代码的中间表示(IR)。在408,顶被进一步处理以标识合格于并行执行的部分,并且对该中间表示进行操纵以形成包括并行化部分的经修改的顶。可以使用多种并行化技术。例如,可以使用诸如软件流水线化之类的技术展开循环,可以插入动态检查以将数据依赖转变成控制依赖。在410,顶被发送给代码生成器,所述代码生成器基于该顶生成并行化的可执行代码。在412,存储该并行化的可执行代码。图5是图示用于从输入代码生成并行可执行代码的过程的另一实施例的流程图。 在各种实施例中,过程500可以在端用户的计算机上进行,或在软件开发时间在开发者的系统上进行。在502,对输入代码进行静态分析以标识该输入代码的数据流和控制流的方面。在一些实施例中,任选地实行动态分析以确定该输入代码的数据流和控制流的另外方面。在一些实施例中,动态分析被省略。在504,至少部分基于通过静态分析确定的数据流和控制流的所述方面生成所述输入代码的中间表示。如果已经实行了动态分析,则顶也还会至少部分地基于所述另外方面的。在506,对顶进行处理。标识顶中可并行化的部分, 并且生成并行化的可执行代码。在508,存储该并行化的可执行代码,以使得后期可以再次使用它。保持该并行化的可执行代码和原始输入代码之间的映射。在510,响应于执行该输入代码的请求,把存储的并行化的可执行代码加载到存储器并执行以代替原始代码。如下面将更加全面地描述的,在不同实施例中,可以使用多种高速缓冲技术来存储可执行文件。图6是图示静态分析过程的实施例的流程图。该过程开始于602,响应于用户请求、响应于程序调用等等而处于启动时间。在604,扫描文件系统以获得可执行文件、任何引用的动态链接库(dynamically linked libraries,DLL)、和/或共享对象(shared object, SO)文件。任选地,标识频繁使用/最近使用的和/或更新的应用和库。在606,对于每个文件,打开并读取该文件。在608,如果可获得则分析诸如来自先前运行的运行时统计之类的动态数据。在610,对该文件进行反汇编并转变成静态生成的中间表示。在612,对顶实行转换。在一些实施例中,所述转换涉及分析该代码并标识所述顶中能够并行运行的部分。 在一些实施例中,所述转换涉及添加测量代码,所述测量代码将便于对运行时信息的测量, 诸如热点和其它简档信息、分支目标信息、存储器别名信息、以及动态循环计数信息等等的分析。在一些实施例中,所述转换涉及修改所述代码。在614,创建可能的线程,包括检查器代码和其它测量,诸如针对要求运行时助手(runtime assistance)的项的向回到运行时的链接,诸如针对错误恢复。在616,发射 (emit)代码和注解。如果该应用尚未被并行化,则存储所述代码和注解。DLL或者其它库代码可以以不同的方式被并行化,这取决于调用代码。在一些实施例中,针对这些DLL生成多个并行化,且每个拷贝都与调用应用/功能相关联。图7是图示动态分析过程的实施例的流程图。过程700起始于702,响应于用户请求、响应于程序调用等等而处于启动时间。该过程观察(observe)以获得程序调用。在 704,发现了调用且所述代码被截取。在706,确定该程序是否已经被加速。如果存在所存储的部分或完全并行化的版本,则该程序被认为已经被加速。所述并行化的和/或加强的版本可能来自上面描述的静态分析过程,或来自先前的动态分析过程。在708,如果该程序已经被加速,则获取先前存储的代码。在710,在适宜时实行优化和链接。在712,转移控制并执行该代码。在714,在执行期间,在适宜时收集诸如运行时统计之类的动态数据。诸如被添加到该代码的计数器之类的测量代码可以提供这样的运行时统计。存储所述数据。然而,在716,如果未发现并行化的和/或加强的版本且该程序未被预并行化,则该过程截取该代码并开始诸如测量之类的最小侵犯性监测以标识热点。在717,分析以及并入诸如来自先前或当前的执行的运行时统计之类的动态数据。在718,对该程序代码进行反汇编并转变成中间表示。在720,分析和转换所述顶,其中,根据需要插入测量代码,并且可以对该代码进行并行化。在722,创建可能的线程。在724,发射可执行代码和注解,并在适宜时写入和存储到非易失性存储器。在未修改/最低限度的测量代码和被修改的/并行化的代码之间建立映射。然后,在712,将控制转移到被修改的/并行化的代码,并且收集诸如运行时统计之类的动态数据。如果需要,可以重复过程700。例如,该运行时系统可以指示应当重复该过程并应当重新生成代码,这是因为所述热点已经随时间改变了,或者,如同后面将更详细地描述的,推测选择不正确。图8是图示实现图4和5中所描述的过程的性能得以增强的系统的实施例的框图。在示出的该示例中,所述输入代码包括一个或多个源可执行文件1,其通常通过对以高级语言编写的应用程序的编译过程来创建。在一些实施例中,所述源可执行文件包括二进制代码,诸如由编译器生成的代码、动态链接库(DLLs)、共享对象文件(SOs)、或组合。在示出的该示例中,所述源可执行文件被安装在与所述性能增强器相同的系统中。该应用可以包括直接的、显式的线程化,基于线程库的间接线程化,或者组合。假设示出的该系统将存储器组织为多个段,诸如可执行区域,已初始化和未初始化的静态分配的数据,堆栈和动态分配的数据。当程序被调用(作为用户动作(诸如鼠标点击)的直接结果或者其它原因(例如,由另一程序触发或响应于网络事件))时,对存储器空间进行初始分配。操作系统将使用加载器把可执行文件加载到存储器中,并在必要时重新分配并与其它可执行文件链接。控制随后被转移给新调用的程序。在示出的该示例中,所述性能增强器包括下列功能组件反汇编器/转变器5,并行化器7,代码发射器8,执行管理器9,配置管理器12,以及文件高速缓冲存储器管理器4。 一些组件的操作可以部分或完全包括在其它组件中。所述组件中的一些是任选的。在接收指向代码的区域(S卩,用于存储操作码的第一位的存储单元)的指针时,反汇编器/转变器5对该指令进行反汇编。此过程标识所述输入代码中的指令和操作数,并将此信息连同其它全局信息(诸如处理器模式)转变为中间表示(IR)6。该中间表示表示所述输入代码的数据结构和程序信息。可以由编译器分析和操纵该IR,该编译器基于所述顶实行优化和转换。一些编译器采用多个IR,以使得数据格式随着时间改变以便于不同的编译阶段。顶通常包括关于要实行的操作的信息、这些操作所依赖的(源)数据以及目标数据。图9是图示中间表示的示例的图。在此示例中,示出了用于计算斐波纳契 (Fibonacci)序列的功能的低级虚拟机(Low Level Virtual Machine, LLVM) IR0针于该功
能的源代码如下
lntfib(intn){
if (n=l) return 0; fi (n=2) return 1; return (fib(n-l>ffib(n-2));
}返回到图8,从反汇编得到的该顶被并行化器7处理,该并行化器7生成新的IR。 在此示例中,该并行化器类似于现代的、优化的编译器,其包含最终导致可执行代码的生成的多个优化“遍次(pass)”。在源输入已经被转变为中间表示之后,这些遍次将对所述中间表示进行转换。每个遍次直接或间接地改进了顶,这为随后的优化阶段准备顶。示例优化包括死代码消除、常量传用、循环不变量分析以及循环展开。在一些实施例中,一些遍次可能简单对顶进行分析并为随后的遍次创建另外的优化结构。除了多个优化和转换算法它们自身之外,还存在指导何时或在何种环境下应用这些优化的程式化地编码判断(也被称作启发式)。例如,如果展开循环将增加代码大小并超出存储需求,因此抵消了展开的好处的话,则可能并不希望展开循环。另外,还存在对各种遍次进行排序的较高级别控制。在所述并行化器的一些实施例中,采用多个遍次来标识和提取线程级并行性。这些优化使得能够在共享公共存储器的各自CPU上运行的独立的执行线程得以创建。并行化器可以静态或动态操作。在一些实施例中,并行化器混合了静态/脱机分析和动态/运行时分析二者以改进性能。当并行化器正动态操作以实行比简单的运行时检查更复杂的优化时,可以改变实行这些操作的地方和方式以使该另外处理的性能影响最小化。在一些实施例中,所述操作和分析在来自于正在运行的应用的单独的进程或线程中实行。在一些实施例中,所述操作在与该应用相同的进程或线程中实行。在一些实施例中,并行化器可以调用涉及性能增强的线程级并行性的猜测(guess)的优化。在这样的情况下,所述并行化器被说成用以对并行性进行“推测 (speculate)”。插入代码以证实该推测正确。例如,所述并行化器推测长运行过程调用将返回结果“0”。推测使得先前需要等待此结果的代码能够并行运行。然而,在允许此代码提交结果之前,有必要验证前述过程确实真返回结果“0”。在另一示例中,如果循环的多次迭代在不同的线程中执行,则可能有必要确保仅仅提交来自编程者规定数目次迭代的结果。因而,错误迭代的影响可能需要被消除或者缓冲。在这些类型的推测并行化中,生成的代码被构造为依赖于与运行时环境11结合描述的运行时支持并与其紧密工作。可以存在控制推测、数据推测以及存储器定序推测中的任何或全部。在一些实施例中,所述并行化器把所述推测和存储器模型视为是事务性的。在一些实施例中,推测在系统中实行,所述系统允许实时或者脱机但仍在目标系统上的重新编译。在推测的和/或事务性的系统中,有必要检测冲突并支持数据版本化 (data versioning)。各种实施例利用被分类为“热切”或“懒慢”的方法。例如,热切数据版本化方法将采用撤消-日志以把不正确计算的值恢复到它们的先前状态,而懒慢方法将采用把数据的不同版本写入到的写缓冲器。每种方法都有优点和缺点。在静态编译器中,尤其是不具备简档引导的反馈的编译器,该编译器能猜测哪个模式将是最好的并选择那个选项。实际上,最好的技术常常依赖于在编译时间不可获得的运行时信息(诸如实际延迟)。 换句话说,最好的选择可能是在运行时做出的选择。此外,由于程序可能经受不同的执行阶段(各阶段之间具有非常不同的特性),所以可能不存在单个的最好选择。动态并行化器可以对要采用的技术的最好组合做出初始猜测,随着时间的推移观察该程序的行为,并随着该程序变化改进其选择以及生成采用产生更好结果的替换技术的新代码。返回到图8,代码发射器8处理并行化的顶以创建二进制编码的、可运行的指令。 通常在此阶段分配寄存器并选择具体指令。在一些实施例中,除了直接对应于原始源程序的指令之外,可以包括用以执行测量的另外指令。所述测量能够标识程序特性,诸如代码被反复调用的热点、诸如分支目标或存储器别名信息之类的运行时信息。在一些实施例中,所述代码发射器操作在来自正运行的所述应用的单独的进程或线程中被实行。在一些实施例中,所述代码发射器操作被包含在并行化器7中或执行管理器9中。修改的(例如,测量的和/或并行化的)应用可以包括控制/指令的多个线程、 静态和/或动态分配的数据、以及用以提供另外的运行时支持的到库的钩子(hook)或者链接。在具有动态反汇编的和动态生成的代码的环境中,存储器中映像(in-memory image) 10,其中,每个代码块末尾可以包括返回到控制/管理过程的分支。在诸如此之类的协作的、多线程化的环境中,每个线程都被看作是“轻量”的并希望将计算组织成这样的线程的工作队列。所述工作队列由运行时系统11管理。在应用被安装并运行的系统上对应用进行并行化的环境中(与在软件开发时间进行并行化相反),为该应用创建修改的操作环境以便维持单个线程的操作的外部特征 (appearance)和正确性。例如,经修改的应用可以具有同时在多个CPU上运行且需要共享存储器的多个线程。所述多个线程需要具有对应的资源拷贝,诸如多个“程序计数器”和多个堆栈。这些资源被组织和管理为虚拟机和运行时环境11。运行时资源可以包括线程管理器、存储器管理器、异常处理程序和通用程序库和OS设备的新/替换的拷贝。这些中的所有都被用于便于推测的/事务性的操作。在一些实施例中,运行时功能可以是该经修改的应用的存储器中映像的一部分。当进行在计算上昂贵的优化和转换并发射代码时,在一些实施例中,此工作的输出被保存以供调用该源程序的未来时机使用。例如,在分析之后,创建添加了用以收集简档信息的测量代码的该程序的新版本。下一次运行该程序,添加的测量代码被用来搜集信息,诸如程序花费了其大量执行时间的“热点”的位置。另一示例是插入运行时存储器别名分析。另一示例是该应用的并行化版本,或者具有另外的、最小运行时检查的多个并行化版本。新的加强的可执行文件被写到一个或多个文件。在一些实施例中,为了限制用来存储这些文件的空间量,任选采用文件高速缓冲存储器管理器4。在一些实施例中,文件高速缓冲存储器管理器管理保留最频繁使用的文件的高速缓冲存储器。在其它实施例中,可以采用不同的管理策略。例如,可以使用最近使用的策略或最频繁使用的策略的一些组合。保持(一个或多个)源可执行文件和这些文件之间的映射。只要程序被调用且并行化被认为是希望的,就要对此高速缓冲存储器进行检察以确定该应用的并行化的(或测量的版本)是否存在。如果有,则把此信息送给执行管理器9,以使得将对应的文件加载到存储器中并运行以代替原始调用的可执行文件。在一些实施例中,包括任选的执行管理器9以跨越上述多个模块和多个“静态”和 “动态”步骤进行协调。在目标系统上在公共管理器下将这些功能链接在一起允许根据需要混合和调用该动态和静态工作。例如,执行管理器可以注意到由于已经下载并安装了更新所以应用已经改变。因此所述执行管理器会启动静态分析。在一些实施例中,执行管理器操作可以被包含在高速缓冲存储器管理器4中、并行化器7中、或代码发射器8中。图10是图示程序表示以及它们彼此的关系的若干示例的图。例如,程序可以以源形式(以高级语言或汇编环境编码)、作为二进制可执行文件的目标形式(已编译但仍不可执行)存在。系统模块能够将多个目标文件链接在一起,这创建了更大、更完整的可执行文件。当程序被调用时,其它系统模块能够将该程序加载到存储器中。运行的驻留存储器应用可以直接或在解释器内运行。该程序也可以以其中间表示的形式存在于编译器内,且编译器的代码生成器能够将那个相同的程序转换成可执行形式,该可执行形式可以被写入文件,加载到存储器中,并直接运行或者传递给解释器或运行时以供执行。尽管为了清楚理解的目的,已经对上述实施例进行了详细描述,但本发明并不限于所提供的细节。存在许多实现本发明的替换方式。这里所公开的实施例是例证性的而并非限制性的。
权利要求
1.一种用于从输入代码生成并行化的可执行代码的系统,包括 一个或多个处理器,其被配置成静态分析所述输入代码以确定所述输入代码的数据流和控制流的方面; 动态分析所述输入代码以确定所述输入代码的数据流和控制流的另外方面; 至少部分基于通过所述静态分析标识的所述输入代码的数据流和控制流的所述方面以及通过所述动态分析所标识的所述输入代码的数据流和控制流的所述另外方面生成所述输入代码的中间表示;以及处理所述中间表示以确定所述中间表示的可能合格于并行执行的部分;以及生成并行化的可执行代码。耦合到所述一个或多个处理器的一个或多个存储器,其被配置成向所述一个或多个处理器提供指令。
2.如权利要求1所述的系统,其中,所述输入代码是二进制代码。
3.如权利要求1所述的系统,其中,所述静态分析包括对所述输入代码进行反汇编并将所述输入代码转换成静态生成的中间表示。
4.如权利要求1所述的系统,其中,所述静态分析包括标识所述静态中间表示中可能合格于并行执行的部分。
5.如权利要求1所述的系统,其中,所述静态分析包括插入测量代码。
6.如权利要求1所述的系统,其中,所述静态分析包括插入测量代码;以及所述动态分析包括执行所述测量代码。
7.如权利要求1所述的系统,其中,所述动态分析包括确定简档信息。
8.如权利要求1所述的系统,其中,所述动态分析包括确定热点信息。
9.如权利要求1所述的系统,其中,所述动态分析包括确定分支目标信息。
10.如权利要求1所述的系统,其中,所述动态分析包括确定存储器别名信息。
11.如权利要求1所述的系统,其中,所述动态分析包括确定动态循环计数信息。
12.如权利要求1所述的系统,还包括修改所述中间表示以包含并行化的部分;以及基于修改的中间表示生成加速代码。
13.如权利要求1所述的系统,其中,推测地确定所述中间表示的合格于并行执行的部分。
14.如权利要求1所述的系统,其中推测地确定所述中间表示的合格于并行执行的部分,并插入验证代码。
15.一种从输入代码生成并行化的可执行代码的方法,包括静态分析所述输入代码以确定所述输入代码的数据流和控制流的方面; 动态分析所述输入代码以确定所述输入代码的数据流和控制流的另外方面; 至少部分基于通过所述静态分析标识的所述输入代码的数据流和控制流的所述方面以及通过所述动态分析标识的所述输入代码的数据流和控制流的所述另外方面生成所述输入代码的中间表示;以及处理所述中间表示以确定所述中间表示的合格于并行执行的部分。
16.一种从输入代码生成并行化的可执行代码的计算机程序产品,所述计算机程序产品被包含在计算机可读存储媒体中,并包括用于下列的计算机指令静态分析所述输入代码以确定所述输入代码的数据流和控制流的方面; 动态分析所述输入代码以确定所述输入代码的数据流和控制流的另外方面; 至少部分基于通过所述静态分析标识的所述输入代码的数据流和控制流的所述方面以及通过所述动态分析标识的所述输入代码的数据流和控制流的所述另外方面生成所述输入代码的中间表示;处理所述中间表示以确定所述中间表示的合格于并行执行的部分。
17.一种从输入代码生成并行化的可执行代码的系统,包括 一个或多个处理器,其被配置成静态分析所述输入代码以确定所述输入代码的数据流和控制流的方面; 至少部分基于数据流和控制流的所述方面生成所述输入代码的中间表示; 处理所述中间表示以生成并行化的可执行代码; 存储所述并行化的可执行代码;以及响应于执行所述输入代码的请求,执行所存储的并行化的可执行代码;以及耦合到所述一个或多个处理器的一个或多个存储器,其被配置成向所述一个或多个处理器提供指令。
18.一种从输入代码生成并行化的可执行代码的方法,包括静态分析所述输入代码以确定所述输入代码的数据流和控制流的方面; 至少部分基于数据流和控制流的所述方面生成所述输入代码的中间表示; 处理所述中间表示以生成并行化的可执行代码; 存储所述并行化的可执行代码;以及响应于执行所述输入代码的请求,执行所存储的并行化的可执行代码。
19.一种从输入代码生成并行化的可执行代码的计算机程序产品,所述计算机程序产品被包含在计算机可读存储媒体中,且包括用于下列的计算机指令静态分析所述输入代码以确定所述输入代码的数据流和控制流的方面; 至少部分基于数据流和控制流的所述方面生成所述输入代码的中间表示; 处理所述中间表示以生成并行化的可执行代码; 存储所述并行化的可执行代码;以及响应于执行所述输入代码的请求,执行所存储的并行化的可执行代码。
全文摘要
从输入代码生成并行化的可执行代码包括静态分析所述输入代码以确定所述输入代码的数据流和控制流的方面;动态分析所述输入代码以确定所述输入代码的数据流和控制流的另外方面;至少部分基于通过所述静态分析标识的所述输入代码的数据流和控制流的所述方面,以及通过所述动态分析标识的所述输入代码的数据和控制流的所述另外方面,生成所述输入代码的中间表示;并处理所述中间表示以确定所述中间表示的合格于并行执行的部分;以及根据所处理的中间表示生成并行化的可执行代码。
文档编号G06F15/00GK102165428SQ200980131425
公开日2011年8月24日 申请日期2009年8月13日 优先权日2008年8月13日
发明者I·D·贝夫, J·K·琼斯, M·D·夏普, R·S·德雷耶 申请人:特兰斯塞拉公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1