首页> 中国专利> 基于LLVM的科学计算程序自动性能预测方法

基于LLVM的科学计算程序自动性能预测方法

摘要

基于LLVM的科学计算程序自动性能预测方法,属于程序性能预测技术领域。本发明的目的是实现科学计算程序的自动化分析,提高静态分析的精确性,同时能够最后给出程序预测的时间。技术要点:将预测的源程序转化为LLVM中的中间代码bitcode;分析中间代码bitcode获得识别通讯指令MPI的调用、循环次数、静态分支概率;对所述中间代码bitcode进行混合插桩;对进行混合插桩后的中间代码bitcode进行代码删减以优化处理;运行经优化处理后中间代码bitcode得到llvmprof.out文件;分析llvmprof.out文件结合指令时间预测执行时间。本发明方法适用于科学计算程序的性能预测。

著录项

  • 公开/公告号CN105183650A

    专利类型发明专利

  • 公开/公告日2015-12-23

    原文格式PDF

  • 申请/专利权人 哈尔滨工业大学;

    申请/专利号CN201510578801.0

  • 申请日2015-09-11

  • 分类号G06F11/36;

  • 代理机构哈尔滨市松花江专利商标事务所;

  • 代理人杨立超

  • 地址 150001 黑龙江省哈尔滨市南岗区西大直街92号

  • 入库时间 2023-12-18 12:59:36

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2018-03-16

    授权

    授权

  • 2016-01-20

    实质审查的生效 IPC(主分类):G06F11/36 申请日:20150911

    实质审查的生效

  • 2015-12-23

    公开

    公开

说明书

技术领域

本发明科学计算程序自动性能预测方法,属于程序性能预测技术领域。

背景技术

高性能计算是计算机科学的一个重要的分支,而性能则是高性能计算的关键特征。程 序的执行时间是用户最关心的性能特征,用户之所以选择使用成百上千个处理器处理程 序,必然是需要在有限的时间内得到程序运行结果。因此,预测并行程序在某个平台上执 行的时间得到了越来越多的研究,这种技术称为程序性能评测。

性能评测方法可以分为动态分析和静态分析。

所谓动态分析的方法,就是通过小规模预测大规模,即在小的输入规模和并行度下多 次测量,将得到的数据绘制在一个坐标图上并进行曲线拟合或是回归分析,最后通过曲线 拟合得到的公式,就能够预测更大规模和更大并行度下的运行时间。

但这种方法的问题在于:

操作繁琐:因为需要运行许多小规模,同时同一规模下还需要多次运行取平均值,因 此需要耗费大量的时间来搜集数据。而且程序执行时多种因素相互影响,平均值很难趋于 稳定。而且还会要求大量的采样数据,于是更加使得预测代价增加。

预测范围小:在选择采样规模的时候,还必须尽量平均分布其间距。若是为了测量 1024并行度,而选择的采样规模范围只有[0-128]这样一个小范围所拟合出来的曲线,很 难保证在1024规模下是合理的。即使拟合函数在前面一段范围能很好的重合,也不能保 证在大规模下也能拟合的很好。这样就限制了预测的应用范围。而且有的程序的并行度是 有要求的,不能连续变化,这样,采样的数据点不能做到平均分布。

结果合理性不足:因为整个拟合过程都是从纯数学上分析的,忽略了许多程序内部的 依赖,因此也就忽略了需要程序特征。这种分析出来的结果即使精度能够接受,也不能证 明对于其他所有情况和实验平台也能够保持同样的精度。

对输入有限制:动态分析的干净的表达式是其优点,同样也是其缺点。首先它需要识 别参数,这一步只能由人工标注完成,妨碍了自动化。

静态分析就是基于编译器来分析代码,获取程序的一些特征。LLVM就提供了一种静 态分析的方法,即静态分支概率技术,下面会有相应的介绍。但是该方法存在相应的问题:

合理性不足:分支概率只是应用了先验概率和分支指令的类型,实际上并不能代表目 标程序。

结果为常数:无论是多大的输入规模和多大的并行度,计算出来的基本块频率为常数, 因为使用的先验概率就是常数。然而这并不能满足我们的要求。

发明内容

本发明为了实现科学计算程序的自动化分析,提高静态分析的精确性,同时能够最后 给出程序预测的时间,进而提供了一种基于LLVM的科学计算程序自动性能预测方法。

本发明为解决上述技术问题采取的技术方案是:

一种基于LLVM的科学计算程序自动性能预测方法,所述方法的实现过程为:

步骤一、将待预测的源程序转化为LLVM中的中间代码bitcode;

步骤二、分析中间代码bitcode,从而获得识别通讯指令MPI的调用、循环次数、静 态分支概率;

步骤三、对所述中间代码bitcode进行混合插桩,分别为:进行通讯指令MPI的通讯 量及通讯类型的插桩,循环次数结合静态分支概率获得基本块执行次数进行插桩;

步骤四、对进行混合插桩后的中间代码bitcode进行代码删减,并进行优化处理;

步骤五、运行经优化处理后中间代码bitcode,得到llvmprof.out文件;

步骤六、分析llvmprof.out文件,并结合指令时间预测执行时间。

在步骤二中,分析中间代码bitcode获得循环次数的具体过程为:

根据公式%tc=(%end-%start)/%stride获得循环次数%tc,其中,%end表示循环结 束值,%start表示循环起始值,%stride表示循环步进;

%end是真退出的终止指令,认为是比较指令icmp;

%start是在循环外离循环最近的写入循环归纳变量的存储指令;

分析基本块Header中的phi指令,获得含有%start、%stride的指令,从而分析得 到%stride值。

通讯指令MPI的通讯量及通讯类型的插桩过程为:

首先,通过LLVM找到中间代码bitcode中的MPI指令,然后分析MPI指令的通讯数 量count和通讯类型datatype,根据公式count×sizeof(datatype)求得该MPI指令总的通 讯量,sizeof表示计算类型的大小;插桩内容包括计算器数组、转换表和访问表。

本发明的有益效果是:

本发明提出利用自动化程度高的方法来实现科学计算程序自动性能预测,因此选择了 利用现有的编译技术来直接分析源代码,设计一系列方法来提高静态分析的精确性,同时 能够最后给出程序预测的时间。本发明解决了背景技术中现有方法存在的诸多的不足和不 便。然而编译技术不是万能的,程序代码复杂多样,在编译器的基础上实现数据依赖也只 是简单直接的数据依赖,不能够太复杂。因此本发明方法正适合用于科学计算并行程序。 科学计算并行程序具有计算密集、高度并行、依赖简单的特点,所以可能实现程序性能的 自动化分析。

本发明方法的具体优点体现在以下几个方面:

泛用性:或者称可迁移性或可移植性,指我们取得的性能模型等可以应用于不同的机 器平台上。

自动性:完全不需要手工设定复杂的参数,不需要对原始程序有任何的了解,所有数 据都通过工具计算得到,实现科学计算程序的自动化分析。

易用性:利用该方法得到的系统对程序执行时间进行预测,方便用户使用,没有动态 分析的繁琐操作和比较大的时间消耗。

精确性:将动态分析和静态分析有机的结合起来,即有静态方法的简便快捷,又不失 动态分析方法的准确性,对程序执行时间预测的结果比较准确,误差不至于太大。

附图说明

图1是本发明的整体架构图(图1中出现的英文bitcode,其含义为程序的二进制中 间代码,英文MPIProfiling,其含义为MPI插桩过程,英文PredProfiling,其含义为基 本块次数插桩过程,英文Reduced,其含义为代码删减过程,英文DwarfCode,其含义为 删减代码之后生成的可执行程序,英文llvmprof.out,其含义为程序DwarfCode执行所 生成的数据文件,英文EdgeProfiling,其含义为LLVM提供的基本块插桩过程,英文 inst-timing,其含义为中间代码指令执行时间测量程序,英文TImingSource,其含义为 inst-timing程序生成的数据文件),图2为插装过程中的数据结构设计图,图3为删减 原理示意图;图4为EP的D规模在taub上的预测结果对比图;

图5表示CGPOP在taub上预测结果对比图,

其中,

a表示在180x120数据规模下的实验结果,横坐示表示并行度,纵坐示表示程序执行 时间,

b表示在120x80数据规模下的实验结果,横坐示表示并行度,纵坐示表示程序执行 时间,

c表示在90x60数据规模下的实验结果,横坐示表示并行度,纵坐示表示程序执行时 间,

d表示在60x40数据规模下的实验结果,横坐示表示并行度,纵坐示表示程序执行时 间。

具体实施方式

具体实施方式一:如图1所示,本实施方式对本发明所述基于LLVM的科学计算程序 自动性能预测方法进行详细阐述:

1、整体架构:

实现所述基于LLVM的科学计算程序自动性能预测方法的整体架构图,如图1所示;

对于性能模型,我们的解决方案并不是像传统动态分析方法那样给出一个公式然后交 由人工计算,因为若是公式太复杂,也需要实际写程序来进行计算。所以我们跳过公式这 个步骤,然后直接给出一个程序,执行该程序就能够汇报预测的程序时间,称这个程序为 DwarfCode。构建DwarfCode时选择的是直接从源代码中构建,保留源代码中从输入到循 环次数的计算代码,删除程序中无用的核心计算部分,这样DwarfCode比原来的程序运行 的快,进而减少了模型构建所消耗的时间。

如图1所示是自动构建DwarfCode的整体过程。首先,最下面的虚线部分 EdgeProfiling过程指的是动态分析的过程,在此处只是用于对比,不属于架构的一部分。 对于动态分析,直接从bitcode插EdgeProfiling桩,然后直接运行,生成大量的 llvmprof.out文件。合并llvmprof.out取平均值便于分析,然后用于曲线拟合。最后根 据曲线拟合预测大规模并行度下程序的执行时间。

对于框架中计算部分,首先通过LLVM的静态分支概率结合我们分析得到的循环次数, 插桩成我们的PredBlockProfiling。其中插桩输出格式与和Edge插桩相同,便于我们分 析。同时插桩位置的设计是将EdgeProfiling的插桩点提升,视点提升的过程中需要尽量 的保证其结果不变(精确性)。由于我们在循环外就“看到”了循环次数,也就是提高了 预测性,因此实际上循环是不需要实际运行的。在不改变后面的数据的前提下,可以将该 循环通过删减过程删除掉。通常,删减后还依然有可优化的空间,所以可以继续经过一个 O3优化来精简代码。此时删减后的程序就是DwarfCode。即达到了执行时间比原程序少, 却能得到原程序的程序特征。然后根据profiling的结果,我们再去预测程序执行时间。

对于通讯部分,一些通讯量为常数的MPI语句可以通过静态分析方法得到,但和基本 块频率一样,若要提高精度还是需要插桩的方法。因此,我们加入了MPIProfiling来对 MPI语句的通讯量进行插桩。

删减时会将所有的MPI调用都删除,从而将一个并行程序转化为一个单机程序。好处 是运行时更加方便,若是并行度要求很高的话也不需要依靠集群来运行,在单机上即可完 成预测,真正实现单机模拟多机。

2、计算模型和通讯模型

2.1计算时间建模

抽象地,程序的计算时间可以表述为下面的形式:

T=ΣiBiIt=ΣiBiΣjNijGt---(1)

其中Bi表示基本块i在一次运行中的执行的总次数,It表示该基本块内的指令的执行 时间。在实际中一个基本块内的指令都是按类型来统计的,Gt为类型为G的指令的执行 时间,Nij则表示该基本块中属于G类型的指令的数量。

把程序计算模型分为程序特征和机器特征,所谓程序特征就是指程序本质上最原始最 根本的特征,即它随着程序本身的改变而改变,亦即它不会随着运行平台的不同而相异, 我们可以迁移它到不同的机器上。机器特征则是和具体的运行环境的不同而不同。一个程 序在高性能的机器上运行速度更快是由于其机器特征发生了变化。我们在建模的时候需要 将程序特征和机器特征分离出来区别对待,只有程序特征才能进行建模,而机器特征只能 称为采样、测量。这样程序特征就可以用于迁移的目的。而机器特征则无论如何都需要每 次从新的环境中重新测量。

另外的一些研究中没有明确的将机器特征同程序特征分离出来。这必然导致最后的性 能模型中的系数已经包含了机器特征,当换了一个平台之后,必然导致结果的偏离,因此, 我们说分离了机器特征和程序特征是泛用性的必然条件。

对于机器特征的获取,可以运行其他的一些基准测试程序来进行测量。我们的计算部 分选择的是lmbench,它给出了常见计算操作的时间(以纳秒为单位)。对于其没有包含 的部分,我们独立开发了inst-timing,以LLVM的IR指令为目标测量其平均时间,而对 于通讯部分的机器特征(MPI相关),我们选择了MPBench来测量相关参数。

对于程序特征的获取,主要靠插桩的方式在程序执行期间动态的获取。细致的区分基 本块执行次数,可以分为:

B=F1(Bplain+Bloop(1)+Bloop(M)+Bloop(M,R))(2)

其中F1表示基本块所属函数的执行次数,Bloop(1)表示所在循环的次数为常数的基本 块的执行次数,Bloop(M),表示循环次数非常量,依赖此次运行时本进程中的其它计算指 令的结果(所以其输入是Module)。Bloop(M,R)表示这个循环次数不仅仅依赖其它计算指 令的结果(Module),还依赖运行时期其它进程中的数据(所以输入中有其它Rank)。Bplain则 表示不属于任何循环的基本块的执行次数。其值要么为常数,要么依赖分支跳转的结果。 绝不可能依赖其它指令内容。

2.2通讯时间建模

对于1条P2P语句的通信时间主要包括启动延迟和在网络上传输数据花费的时间,即 对于指令i一次通信有通过计算模型,我们能够取得该语句所在的基 本块的执行频率Bi.因此简单计算该条通信指令的总时间为:

Ti=Bi×(Tl,i+Div).

对于通信模型,其机器特征为Tl,v。程序特征为D,Bi。具体的说,以MPI_Send函 数为例分析,其函数原型为:

intMPI_Send(constvoid*buf,intcount,MPI_Datatypedatatype,intdest, inttag,MPI_Commcomm,MPI_Request*request)

若要完成一次传输,其通信量D=count×sizeof(datatype)。datatype只是对应与MPI 中的一个数据类型,一般是一个常数。例如openmpi中用MPI_INTEGER表示Fortran语言 中的integer类型。而MPI_INTEGER是一个枚举量,其值等于7。7并不能表示integer 类型的数据长度。在Fortran中对应于C语言的int类型,即其长度为4。sizeof便是将 MPI的数据类型转化为数据长度。count可能不是常数,亦即我们需要记录的只有count 的值,其它的都可以从bitcode中找到。而count值可以从IR中分析数据依赖关系,或 者是插桩。

对于一条汇集通信由于是树形的通信过程,因此对于并行度R的通信需要log(R)层, 于是有对于双向汇集函数如MPI_Allreduce是先汇集后广播,因此c为2。 而单向汇集函数如MPI_Reduce,则c等于1。同样地结合基本块频率有:

Ti=Bi×(Tl,i+clog(R)Div)

同上,我们也只需要关注count值。然而事实上也有一些程序如EP,数据类型是经过 一个判断选择而来的。因此我们需要修改设计,将datatype也在运行时保存下来。由于 Profiling只能保存一个累加和,因此我们选择插桩捕获每次的通信量D,而非count值。 所以需要找到count参数和datatype参数插入乘法指令。然后计数器中则是保存乘法累 和其中j表示第j次执行该基本块(中的通信语句)。然 后计算公式则修改为:

Ti=Bi×Tl,i+Div

Ti=Bi×Tl,i+clog(R)Div

这样,预测时间=计算时间+通信时间+其它时间。

3混合插桩

3.1循环次数

将循环内的基本块频率由LLVM的静态基本块概率替换成插入的循环次数。循环次数 获取的基本思想是:,其中循环结束值%end,循环起始值%start,循环步进stride,循 环次数用%tc表示。寻找循环次数的过程主要是寻找上述变量值,下述循环次数获取的算 法描述。

采用如下算法实现寻找循环次数并插桩:

输入:循环结构

输出:在Preheader中插桩或返回找不到

3.2视点及视点提升

循环内基本块次数找到后,接下来是对插入点的设计。本文将插入点称为视点,在不同视 点”看到”基本块频率是不同的。用二元组(Ep,Bv,N)表示基本块频率,其中Ep指视点, Bv,N指相对该视点的基本块频率。视点是动态预测和静态预测的结合,为了提高预测性, 保持精度,同时为后续删减代码做准备工作,提出了提升视点的概念。视点D的选择需要 满足的条件如下:其中start表示循环中循环变量的初始值,end表示循 环中循环标量的终止值,stride是循环中循环变量的步进值,δ指的是支配关系,即在 视点D可以获取三个变量的值。对于c基本块,其视点在外数第m个父循环,那么有循 环基本块次数:

(Ec,%tcc)=(EVn(VnPn)%tcn(HnPn-1)%tcn-1(Hn-1Pn-2)%tcn-2...%tcc)

其中Ei,Pi,Vi,%tci分别表示第i个循环的头节点,Preheader,视点,循环次数。具体的视 点提升过程在算法描述。

采用promote算法来实现,其过程如下:

输入:插入在Preheader中的循环次数指令(LoopTripCount)

输出:提升后的视点

得到循环次数变量,在提升后的视点位置计算所有预测的基本块次数并进行统一插桩, 称为PredBlockProfiling。插桩后运行待预测程序将输出二进制llvmprof.out文件,文 件记录了所有基本块预测次数。

采用如下算法来计算循环内基本块次数并插桩:

输入:LoopInfo,LoopTripCount

输出:基本块插桩

MPI通讯插桩

对于MPI插桩而言,针对通信模型,记录count×sizeof(datatype),由于平台不同 datatype的大小不确定,编写程序时加入常见的数据类型构成转换表。如果漏掉某类型, 那么其大小为0,整体乘积为0。然而这样无法检测是没有执行该通信还是因为转换表不 全。因此设计访问表标志通信类型是否被访问。数据结构设计见图2,通信插桩算法描述 如下:

输入ModulePass

输出:MPI通讯插桩

删减模块

删减过程描述如下:

删减过程类似于优化中的消除死代码,但这里创新之处在于所有的优化过程都是基于 语义的等价变换,需要保证最后的结果一致。但删除是激进的破坏性的优化,因为我们只 需要使得程序特征即循环次数信息不被破坏,其它的信息对我们而言都变成了‘死代码’ 一般。因为这点,我们能够做得比编译器自带的优化更多更远。我们选择删除法来消除‘死 代码’,首先选择一些没有被使用的、可以被删除的语句,由于该语句还依赖其它语句。 当删除后,就打开了依赖关系。因而那些语句变成了未被使用语句,于是也是可以被删除 的。如此反复递归下去,直到删除干净。

如图3,一般程序的执行过程都分为初始化、计算、输出三部分。我们首先能够确定 输出语句是不重要的,由于它只是显示信息,不会影响循环次数即程序特征,因此可以被 安全的删除。由于现在程序已经不再将计算结果输出了,那计算结果也就变成未使用的了, 因而同样可以删除了。而当没有了计算结果,那计算过程也就无意义了,因而计算过程也 可以被删除。当删除到初始化语句的时候,由于其数据不仅仅会被计算过程使用,还会被 PredBlockProfiling使用,因此它是删除不了的。最后一个程序被删除得只剩下初始化 语句和插桩语句,没有了整个计算部分,因而其运行速度会大大提高,即为DwarfCode。 而且由于我们插桩需要这些初始化语句,因此它无论如何都是必要的,若是从文件中初始 化的,那读文件是必须的,由于这部分的拖累,因此不可再压缩其速度了。当然实际上如 果一些循环次数依赖中间计算结果,那么这部分计算也会被插桩依赖无法删除。这样会造 成DwarfCode的效果大减。

由于删减了一部分代码,使得程序内部结构松散,比如一些死代码等等,很多可以被 再次优化。因此我们进行一个可选的编译器O3优化,以进一步的压缩DwarfCode的执行 时间。

经过删减过程,我们得到了DwarfCode,特点如下:

(1)DwarfCode保留了初始化语句,所以只需要像使用原始的程序一样,使用相同的运 行选项,无需手动写配置文件标注参数的类型、范围等等。

(2)DwarfCode是经过删减过程之后得到的程序,执行该程序所消耗的时间更少,可以 更快的得到预测的结果。

(3)删减的过程中还会删除掉所有的MPI调用,从而使得单机预测多机成为可能。例如, 如果想得到并行程序在并行度很大的情况下程序的执行时间,但是又没有这么大的集群环 境,这样的话,单机预测多机这个特点将显得尤为重要。

(3)运行DwarfCode可以生成包含程序特征(基本块次数等)的输出文件,分析该文件 同时结合相应的机器特征即可获取最后预测的时间。

数据依赖分析

删减过程能够自动的决定哪些语句是对插桩无用的,因此,需要分析数据依赖关系。 在具体的分析过程中,我们实现了基于规则的分析框架ResolveEngine。具体名称和作用 如表1所示,每一条规则都涉及到相应的数据依赖算法和具体的程序实现,将不同的规则 组合进框架进而可以适应不同环境中寻找依赖的需求。

表1规则

ResolveEngine循环规则求解算法如下:

输入:被分析的指令的Use:u

输出:指令的数据依赖DataDepGraph

删减指令类型

由于已经分析了数据依赖关系,之后就可以对一些无用的指令和其依赖的指令进行删除, 具体删除的指令的类型如下:

删除gfortran的输出

我们只需要最后预测程序的执行时间,不需要程序执行的结果,所以我们可以从输出语句 开始入手。

删除时间函数

时间函数主要是指MPI的mpi_wtime_和_gfortran_system_clock_4。我们假设时间函数 主要是用来输出统计时间的,并不参与运算。所以可以直接删掉,并且那些用了时间的指 令也级联删除。

删除MPI点对点通信函数

删除MPI汇集通信函数

删除MPI_Allreduce函数

删除MPI_Bcast函数

删除return指令

删除store指令

等等

删除这些指令之后,就可以打开依赖关系,其依赖的指令也会被删除,之后再可以调用 LLVM编译器的死代码消除的Pass,得到更干净的DwarfCode程序。

预测时间

我们通过执行DwarfCode,其运行时间小于原程序的执行时间,并且程序特征同原程序一 致。因此我们可以利用DwarfCode来完成预测。比起那些需要一堆配置的解决方案,其一 大优势就是使用方便,运行改程序会生成出和EdgeProfiling完全一致的llvmprof.out 文件。该文件包含了所有基本块的总执行次数,亦即是程序特征。但是DwarfCode的执行 时间远小于EdgeProfiling的。而接下来的处理步骤DwarfCode和EdgeProfiling是一致 的,尽量的重用代码和工具。

由于DwarfCode生成的是单个的llvmprof.out,因此免去了EdgeProfiling的合并 llvmprof.out的步骤。之后,利用该文件,结合bitcode,再结合机器特征,最后得到预 测计算部分时间。通信时间也是类似处理,最后将两个时间加起来,即是最后的预测结果。

针对本发明方法进行如下验证,并获得如下发明效果:

在Taub集群上对CGPOP和NPB程序进行实验。其中CGPOP和NPB都是用于科学计算的 基准测试程序。

实验环境介绍:Taub集群是地处美国阿巴纳市和香槟市的伊利诺伊大学(UIUC)的HP Linux集群。每个节点是6个双核处理器Intel至强X5650(2.67GHz、高速缓存12288KB、 共12核心)。一个时钟周期大约0.37纳秒。支持constant_tsc、nonstop_tsc;内存大 小为49547272kB。一共有208个结点共计2496核心可用。但由于上面同时进行着许多 其它科学计算任务,使用时需要排队。所以实际上永远也不可能申请到全部的208结点, 毕竟任何一个时间结点上都有排队着任务的。软件方面,操作系统为RedhatEnterprise Server6.4;提供gcc4.7.1/4.9.2、openmpi1.4。

基于NPB中EP程序实验结果如图4和表2。

表2:预测结果详细(时间单位:秒)

基于CGPOP程序实验结果如图5和表3所示:

表3:CGPOP预测结果详细(时间单位:秒)

由表2、3和图4、5可看出,NPB中EP程序实验中,除了前4个并行度误差比较大之 外,其他的相对误差都在10%以内,而且大并行度下的效果都是比较好的,满足我们的要 求。而且预测的代价是比较小的。

CGPOP程序实验中,预测代价就是进行一次预测的代价,即执行DwarfCode的时间。 通常时间比都是10:1,即CGPOP运行10秒,DwarfCode需要运行1秒,预测代价是对删 减过程最好的证明,将原程序的时间等比缩小,而且还保持输出接近一致。这和传统动态 分析方法的时间代价小的多。

通过实验结果可以看到,本发明的系统方案达到了预期的效果:

将机器特征和程序特征进行分离,因此泛用性可以得到了满足。

整个过程都是通过程序实现,完全不需要手工设定复杂的参数,自动性得到了满足。 由实验结果可以看到,只运行DwarfCode程序就可以获取程序特征,预测代价相对于传统 动态分析的训练方法来说事非常小的,因此,易用性得到了满足。

预测的结果相对于程序真实的执行时间误差在可接受的范围内,精确性得到了满足。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号