基于RL的超优化编译器建立、代码超优化方法及系统

文档序号:26138999发布日期:2021-08-03 14:22阅读:155来源:国知局
基于RL的超优化编译器建立、代码超优化方法及系统
本发明属于计算机编译器超优化
技术领域
,具体涉及一种基于rl的超优化编译器建立、代码超优化方法及系统。
背景技术
:编译器是将“一种语言”翻译为“另一种语言”的程序,在许多应用领域中,尽可能地生成高性能的代码具有很大的价值,故传统的编译器翻译过程产生的代码指令序列还存在进一步优化的空间。超优化是一种产生完美优化代码的想法,它的核心思想是对于每一个代码而言,超优化编译器都能找到其对应的最优的指令序列,即能在现有编译器的基础上对编译器进行进一步的优化以达到“超优化”。代码超优化在搜索时,通常通过对每个可能的指令序列进行暴力搜索,检查它是否执行了代码相关操作并选择是否接受该序列。但是通过蛮力搜索的方式解决问题显然会受问题规模的影响,随着指令序列的长度的增加,其大小呈爆炸性增长,即使可以通过设置条件限制来进行剪枝,其搜索空间大小仍及其可观。因此,除了传统的通过蛮力搜索实现的超级优化器之外,现有技术中还研究有关机器学习和约束求解方法实现优化搜索的超级优化器。例如,stoke是x86-64指令集的随机优化器和程序合成器。stoke使用随机搜索来探索所有可能的程序转化的极高维度空间,其中任何随机变换都不太可能产生所需的代码序列,因此stoke重复应用数百万个变换来产生新的的代码序列,但这种随机搜索存在的问题是搜索空间巨大,且消耗大量时间和资源。技术实现要素:本发明的目的在于提供一种基于rl的超优化编译器建立、代码超优化方法及系统,用以解决现有技术中在进行编译器超优化时,搜索时间长,搜索效率低下,以及编译器本身使用的随机搜索方法牺牲了搜索完整性等问题。为了实现上述任务,本发明采用以下技术方案:一种基于rl的超优化编译器建立方法,包括如下步骤:步骤1:获取源代码,将源代码转换为二进制文件后输入编译器中进行搜索,输出搜索过程中的所有搜索路径;步骤2:对每条搜索路径进行解析,获得每条搜索路径包含的多个词条,其中,每个词条包括代码优化程度、突变代码和随机突变方向;步骤3:将所有搜索路径包含的词条作为训练集,将随机突变方向的种类作为标签,对编译器通过强化学习方法进行训练,所述强化学习方法包括reward、action和state三个参数,其中,将每个词条的代码优化程度作为reward,将每个词条的随机突变方向作为action,将每个词条的突变代码作为state;将训练好的编译器作为超优化编译器,所述的超优化编译器的突变方向为优化后的随机突变方向。进一步的,所述的随机突变方向包括9种,分别为:opcode、operand、globalswap、localswap、addnops、delete、instruction、weighted和resize。一种代码超优化方法,该方法用于获取待优化源代码,将待优化源代码输入采用基于rl的超优化编译器建立方法建立的超优化编译器中,获得待优化源代码的突变方向,直至代码收敛时优化结束,输出超优化代码。一种代码超优化系统,包括输入单元、预处理单元、模型训练单元和超优化编译器;所述的输入单元用于获取源代码,将源代码转换为二进制文件后输入编译器中进行搜索,输出搜索过程中的所有搜索路径;所述的预处理单元用于对每条搜索路径进行解析,获得每条搜索路径包含的多个词条,其中,每个词条包括代码优化程度、突变代码和随机突变方向;所述的模型训练单元用于将所有搜索路径包含的词条作为训练集,将随机突变方向的种类作为标签,对编译器通过强化学习方法进行训练,所述强化学习方法包括reward、action和state三个参数,其中,将每个词条的代码优化程度作为reward,将每个词条的随机突变方向作为action,将每个词条的突变代码作为state;所述的超优化编译器为训练好的编译器,所述的超优化编译器的突变方向为优化后的随机突变方向,所述的超优化编译器用于获取待优化源代码,将待优化源代码输入超优化编译器中,获得待优化源代码的突变方向,直到代码收敛时优化结束,输出超优化代码。进一步的,所述的随机突变方向包括9种,分别为:opcode、operand、globalswap、localswap、addnops、delete、instruction、weighted和resize。本发明与现有技术相比具有以下技术特点:(1)采用本发明进行超优化后的编译器,生成的优化代码指令集更短,执行速度更快。可以学习快速适应以前未见过的代码优化设计空间,既可以加快搜索速度,又可以提高输出性能。(2)本发明将深度强化学习的方法引入到代码超优化工作中,为代码超优化提供新的思路,该算法不仅着眼于降低实际硬件测量的样本,而且使用领域知识启发型逻辑来改善样本本身,缩短了代码执行时间,提高代码执行效率。填补当前研究领域的空白,为后续编译器超优化的技术研究提供参考。(3)本发明在深度强化学习端构建一个服务器,将超优化编译器作为一个客户端,每当客户端需要优化搜索空间时,服务器端根据前面的搜索经验和结果反馈,向客户端提供一个深度强化学习模型计算出的最优的突变,而不再是编译器原始的随机突变。附图说明图1为本发明的超优化算法流程图;图2为数据解析流程图;图3为搜索路径保存格式图;图4为强化学习流程图;图5为训练流程图;图6为超优化流程图。具体实施方式首先对本发明中出现的技术词语进行解释:强化学习(rl):是一种用于描述和解决智能体(agent)在与环境的交互过程中通过学习策略以达成回报最大化或实现特定目标的问题,即针对一个具体问题得到一个最优的policy,使得在该策略下获得的reward最大。在本发明中agent即待优化的编译器。不同于监督学习和非监督学习,强化学习不要求预先给定任何数据,而是通过接收环境对动作的奖励(反馈)获得学习信息并更新模型参数。强化学习的关键要素有:environment、reward、action和state。强化学习要完成的目标是:从要完成的任务提取一个环境(environment),从中抽象出状态(state),动作(action),以及执行该动作所接受的瞬时奖赏(reward),agent对每次所处的state以及上一状态的reward确定当前要执行什么action,执行action要达到最大化期望reward,直到最终算法收敛。reward:表示第t个timestep的返回瞬时奖赏值,所有强化学习都是基于reward假设的。reward在本发明中具体表示stoke搜索空间中,每一次随机突变生成的优化代码与未优化代码的优化比较程度。action:来自于动作空间,表示编译器每个随机突变的突变方向。policy:表示一系列action的sequentialdata,即当前agent所处的状态。policy是从state到action的映射,分为确定策略和与随机策略,确定策略就是某一状态下的确定动作,随机策略以概率来描述,即某一状态下执行这一动作的概率。搜索路径:利用编译器的成本函数生成成本较低的代码这一索索过程中产生的中间路径。gcc-o3:gcc是“gnucompilercollection”的缩写,它是一个编译器集。gcc可以编译c语言,还能用于c++,java,object-c等语言程序。stoke-extract:stoke开源工具,用于将二进制文件里面包含的所有函数反编译为汇编指令集,保存到bins/对应函数名.s中;例如:一个二进制文件test.out中的函数有print(),hello(),main()三个函数,执行stokeextract-i./test.out-obins,会在bins文件夹中生成三个文件print.s,hello.s,main.s。stoke-testcase:stoke开源工具,用于生成一组测试用例,以指导stoke的搜索过程。ppo:增强学习算法,openai把ppo作为目前的baseline算法。gym:关于强化学习框架搭建的python开源库openaigym(github:https://github.com/openai/gym#atari)提供了一套比较完善的强化学习工具包。llvm:编译器,编译器框架,包含一系列编译器工具,编译器工具链,是一种基于c++实现的开源软件。在本实施例中公开了一种基于rl的超优化编译器建立方法,包括如下步骤:步骤1:获取源代码,将源代码转换为二进制文件后输入编译器中进行搜索,输出搜索过程中的所有搜索路径;步骤2:对每条搜索路径进行解析,获得每条搜索路径包含的词条,其中,每个词条包括代码优化程度、突变代码和随机突变方向;步骤3:将所有搜索路径包含的词条作为训练集,将随机突变方向的种类作为标签,对编译器通过强化学习方法进行训练,所述强化学习方法包括reward、action和state三个参数,其中,将每个词条的代码优化程度作为reward,将每个词条的随机突变方向作为action,将每个词条的突变代码作为state;训练停止条件即代码收敛或超时。将训练好的编译器作为超优化编译器,所述的超优化编译器的突变方向为优化后的随机突变方向。在本实施例中,编译器采用stoke编译器,其中,stoke在搜索过程中定义的参数transform_current作为随机突变方向(action),参数(original_cost-new_cost)/original_cost作为代码优化程度(reward),state.current.get_code()作为突变代码(code),将上述action,reward和code组成词条。具体的,步骤1包括如下子步骤:通过gcc-o3对待优化的源代码生成待优化的二进制文件(a.out),然后在stoke编译器中利用stoke-extract将二进制文件(a.out)反编译为汇编指令格式的文件保存到bins/文件夹中,每个文件夹包含汇编指令函数文件(定义为_z6popcntm.s),利用stoke-testcase将待优化的汇编指令函数文件_z6popcntm.s生成一组测试用例进行搜索,stoke通过不停的进行随机突变操作进行二进制指令序列的搜索空间中完成搜索,输出搜索过程中的所有搜索路径。具体的,生成搜索路径的过程如下:通过对指令集进行深度优先搜索,给每个节点生成9个子节点,如果搜索深度为n,则深度优先搜索节点为9n次方,而每一个节点可能是搜索路径上的一个点,所有搜索路径是在这个9n节点上随机搜索的路径。具体的,所述的随机突变方向包括9种,分别为:opcode、operand、globalswap、localswap、addnops、delete、instruction、weighted和resize。stoke对于x86-64的二进制优化,把候选重写表示为长度为l的有限指令循环序列,其中使用一个专有的标记unused为候选重写中的占位标志。每种随机突变的定义如下表:具体的,采用nlp技术中文本转embedding方法doc2vec算法对每条搜索路径进行解析,包括如下子步骤:1)将搜索路径文件search.txt里面的每轮出现的reward/code/action分成一个词条,将每个搜索路径保存成如下字典形式log_data={"action":none,"reward":none,"code":none,"cost":none};2)将解析出来的词条(10w+)和"code"索引项通过遍历保存成一个list格式的数据集,同时将索引号码保存成另一个list格式的数据标签;3)将数据集和对应的数据标签打包成机器机器学习模型doc2vec数据集的格式,通过doc2vec方法,设定embedding的长度vector_size=128,窗口大小为10,最小词条长度为1,训练次数epochs=20,训练出一个词法相关的模型model,然后在通过这个训练好的model,用model.infer_vector对每一个条目生成对应的codeembedding。例如:code[1]作为model.infer_vector的输入,输出[0.2829849,1.38647834,…,8.38975521].4)获得每个action的独热编码(one-hot)将分类的变量作为二进制向量表示。例如:第一种action类型opcode的one-hot编码为[1,0,0,0,0,0,0,0,0]具体的,在强化学习指导stoke搜索空间搜索时,所述的reward采用每次优化后代码执行时间的双曲正切值。具体的,所述强化学习方法采用ppo方法。深度强化学习可以捕获不同的指令,依赖关系和数据结构,从而能够学习一个复杂的模型,该模型可以更好地预测实际性能成本,并确定最佳的指令集突变因素。具体的,ppo方法的目标是计算一个策略(π)——环境状态和行为之间的映射——使期望的回报最大化,其中,τ是定义单个情节的一系列状态和行为,学习者试图在当前状态下找到一个最佳行动,它包括学习寻找最佳行动和反复试验。在该方法中定义action=[0,1,2,3,4,5,6,7,8]分别是随机突变的9中方式,定义observation_space是数据预处理阶段的embedding模型,定义reward是突变后的指令函数运行在llvm中执行时间通过numpy包中的tanh双曲正切函数计算得到的。深度强化学习与其他机器学习方法的区别在于自我探索和利用的存在,以及两者之间的权衡,rl可以使用比监督学习方法所需的更少的样本进行学习,并且可以针对多个目标进行协同优化,例如编译时间,代码大小和执行时间。具体的,步骤3将stoke生成的搜索空间和搜索路径以及搜索过程中经历的action和reward输入到待优化的编译器中,让编译器学习stoke的搜索策略,找到随机突变对代码优化的影响,最后得到一个优化的编译器保存在了~/ray_results/ppo_*中。在本实施例中还公开了一种代码超优化方法,该方法用于获取待优化源代码,将待优化源代码输入超优化编译器中,向超优化编译器请求突变方向,直到代码收敛或者超时,优化结束,输出超优化代码。具体的,本实施例所述的代码超优化对于代码长度较长的情况时需要分段对每段代码进行一次优化,每次优化具体的步骤如下:将待优化源代码输入超优化编译器中,通过每次计算得到的reward和生成的新的优化代码code-enbedding,作为强化学习模型ppo的每次step的输入,ppo计算出一个最优的下一步突变的方向action,来指导stoke的突变方向,以实现在同样或者更大的搜索空间内,使用更短的时间,得到更高效,更精简的优化代码。本实施例还公开了一种代码超优化系统,包括输入单元、预处理单元、模型训练单元和超优化编译器;所述的输入单元用于获取源代码,将源代码转换为二进制文件后输入编译器中进行搜索,输出搜索过程中的所有搜索路径;所述的预处理单元用于对每条搜索路径进行解析,获得每条搜索路径包含的词条,其中,每个词条包括代码优化程度、突变代码和随机突变方向;所述的模型训练单元用于将所有搜索路径包含的词条作为训练集,将随机突变方向的所有种类作为标签,对编译器通过强化学习方法进行训练,所述强化学习方法包括reward、action和state三个参数,其中,将每个词条的代码优化程度作为reward,将每个词条的随机突变方向作为action,将每个词条的突变代码作为state;所述的超优化编译器为训练好的编译器,所述的超优化编译器的突变方向为优化后的随机突变方向,所述的超优化编译器用于获取待优化源代码,将待优化源代码输入超优化编译器中,获得待优化源代码的突变方向,直到代码收敛时优化结束,输出超优化代码。所述的优化截至条件也可以为时间超时。实施例1本实施例使用stoke/examples/hacker的测试用例作为rl-stoke编译器的数据集,总共有25种基础指令集,每种指令集的数据单独训练并测试.使用halide数据集作为深度强化学习的数据训练集,对生成强化学习模型的过程中,首先对所有源代码文件进行自动化的静态分析,生成所有的代码执行基准时间(llvm–o0),使用stoke编译器超优化功能对所有代码生成搜索路径,并获得9种突变方向作为标签,然后将搜索路径通过doc2vec转化为embedding,与标签一同进行rl-stoke编译器的训练和测试。表1halide数据集中llvmgcc优化和stoke优化结果本实施例中训练模型的硬件平台采用:nvidiageforcegtx1080gpu、intelxeone5-1620cpu。本实施例中将深度强化学习视作一个黑盒,输入代码的stoke超优化搜索路径的当前指令集,输出为深度强化学习网络给出的最优action突变,因此简要介绍训练时是如何迭代的。输入的当前指令集通过深度强化学习端,首先将指令集通过doc2vec转化为embedding矩阵,然后进行深度强化学习中,每一次迭代都对深度强化学习中的参数节点的特征向量进行更新,在更新某个节点的特征向量时,会综合考虑这个节点本身的特征向量与对这个节点产生影响的邻接节点的特征向量,将这些特征向量与一个矩阵参数相乘之后就是这个节点更新之后的特征向量,矩阵参数在训练过程中会不断更新。经过一定的迭代次数之后,将特征矩阵和一个矩阵参数相乘,得到模型的输出即二维向量,这个矩阵参数同样会在训练的过程中不断更新。编译器中的参数为:深度强化学习网络和自然语言处理领域常用的参数值,设置节点的特征向量为128维,训练的batchsize为8,学习率为0.001,特征矩阵的迭代次数为20。表2hacker数据集中llvmgcc优化和stoke优化结果speedupstoke(30)stoke(100)rl(30)rl(100)llvm(o0)gcc(o3)p011.1891.2531.4681.5831.0001.218p021.2121.2781.4321.6031.0001.169p031.3871.4231.4981.5881.0001.231p041.6861.7011.7131.7971.0001.354p051.2341.4251.4391.5821.0001.311p061.7521.7801.8531.8871.0001.540p071.4711.6001.8331.8711.0001.488p081.7321.7691.7891.8711.0001.587p091.8911.9102.0192.1291.0001.919p101.7981.8711.9132.1401.0001.871p111.8001.8111.9781.9991.0001.789p121.8721.9131.9542.1921.0001.891p131.7611.7901.8111.8921.0001.782p141.7841.8711.8911.9821.0001.843p151.6001.6981.7351.8911.0001.687p161.6921.7241.8001.8521.0001.711p171.6921.7441.8711.9111.0001.735p181.6801.7241.7541.8991.0001.689p191.5911.6551.6911.7821.0001.652p201.5911.6091.6891.7341.0001.598p211.4911.5091.6141.6981.0001.514p221.7011.7571.8031.9541.0001.812p231.7121.7901.9822.1111.0001.891p241.8121.8902.0102.1141.0001.910p251.6891.7181.8151.9841.0001.812mean1.6331.6881.7741.8821.0001.640实验结果表明本实施例中的方法命中率高,加速比高,经过rl-stoke训练,针对hacker数据集测试结果如下表所示。按照llvm–o0,编译执行的结果作为基准,与gcc–o3stoke本身比较,度量值主要考虑sppedup=base_time/optimization_time.stoke30表示epoch等于30轮。以下给出优化前和优化后的一段代码的比较:优化前优化后由超优化后代码和优化前代码可以得到:优化前代码冗余较多,比如nop空位,另外优化前代码长度和执行效率较低,比如计算100次i++,可能优化前是从1-100次相加,优化后会变成10*10次相加,因此可以说明,所有优化后代码长度和代码执行效率都会提高。当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1