轮廓技术编译的优化方法及装置的制造方法_2

文档序号:8298901阅读:来源:国知局
过程如下:首先遍历控制流图,识别出可以形成环的边,构造循环域和异常域。找出控制流图中所有的环边,并确定哪些环边是回边,回边指的是边的目标节点是出发节点的必经节点的环边,剩下的不是回边的环边就是不可归约环边。找出所有循环以后,这些自然循环构成循环域(允许彼此间的嵌套),对控制流图中有不可归约环边的域使用强连通分量查找算法,找出最大强连通分量,剩下的强连通分量就是不可归约部分,它们将构成异常域。循环域和异常域被化简成区域节点之后,在控制流图上沿着路径将连通的节点(基本块或者区域节点)若干个构成区域。
[0044]本实施例中按照结点内插桩函数的个数来划分不同的区域。划分的规则主要为区域中包含的插桩函数的数量个数,设插桩函数数量的最大值为N、最小值为M,N、M的值采用启发的方式确定,即采用经验值确定,区域中包含的插桩函数尽量平均,不能太多也不能太少,区域之间的连接关系尽量简单。如图4所示,控制流图中包含20个基本块以及连接上述基本块的27条边,插入了 8个插桩函数,插桩函数为Instru (),取N=3,M=2,根据上述规则将图4中的控制流图划分为3个区域,如R1、R2和R3,划分区域之后的控制流图如图5所
/Jn ο
[0045]划分区域之后,将每个区域(不包含出口基本块)对应程序包含的插桩函数替换为计数操作。
[0046]可选地,将各个区域对应程序包含的插桩函数替换为计数操作,包括:
[0047]在各个区域对应程序的入口处,开辟一个大小为N*2的二维数组空间,N为各个区域对应程序包含的插桩函数个数的最大值;
[0048]将二维数组的第i*2个元素赋值为程序控制流图中边的序号,二维数组的第i*2+l个元素用于计数,i表示第i个插桩函数,i取值为大于等于O且小于等于N。
[0049]具体地,如图6所示,在各个区域对应程序的入口处,开辟一个大小为N*2的二维数组空间(可以是在堆上开辟空间),例如取名为a_id (id表示区域id),其大小为N*2,N为各个区域对应程序包含的插桩函数个数的最大值,例如图6中区域个数为3个,N=3,将二维数组的第i*2个元素赋值为程序控制流图中边的序号(edge_id),二维数组的第i*2+l个元素用于计数,例如 a_l [O] [O] =2 (2 为 edge_id),a_l [O] [I]用于计数,a_l [I] [0]=6,a_l [I]
[I]用于计数,a_l[0][l]以及a_l[l][l]初始值为0,由于区域I中只有两个插桩函数则a_l [2] [O]以及a_l [2] [I]为初始值,a_l [2] [I]初始值为O。
[0050]为各个区域中的每个插桩函数实施替换操作,设当前插桩函数为该区域中的第i个;其原有插桩函数的形式为Instru (edge_id);现在替换为操作a_id[i] [0]=edge_id;a_id[i] [I]++ ;即将原有的插桩函数插桩替换数组的计数操作。数组操作比调用函数执行效率更高。
[0051]步骤302、将各个区域对应程序在主线程上执行,执行至一个区域对应程序结束时,启动至少一个微线程执行区域对应程序包含的插桩函数除计数操作外的操作,用于记录区域对应程序执行时的信息;微线程与执行下一个区域对应程序的主线程并行执行。
[0052]具体地,在编译执行时,将各个区域对应程序在主线程上执行,执行至一个区域对应程序结束时,启动至少一个微线程执行区域对应程序包含的插桩函数除计数操作外的操作,即将各个区域内的插桩函数进行集中,将除计数操作外的操作在微线程上执行,根据插桩函数的个数选择启用的微线程个数;执行本区域对应程序的插桩函数的微线程与执行下一个区域对应程序的主线程并行执行。
[0053]微线程是一种软硬件协同工作的新技术,其主要特征是:线程启动代价小;线程长度可以较短,而且轮廓技术编译时具有“启动频繁、计算量小、单向通信”的特征,例如边轮廓技术中可能需要为每个跳转进行插桩,适合利用微线程启动代价小的特性,插桩函数的基本功能是计数,同时伴有一些数据处理方面的工作,但是总体来说计算量很小,适合利用微线程的线程长度较短的特性;轮廓技术是对程序执行信息进行检测,因此需要知道程序执行的状态,但是这些状态的结果并不对程序的正常执行造成影响,不同阶段的轮廓技术之间也不存在通信问题,适合将程序放在主线程执行、轮廓技术分在多个微线程上进行,且不需要显式同步,所以轮廓技术编译十分适合使用微线程解决。
[0054]如图5可知,上述控制流图对应程序有两种运行情况,一种是Rl — R2结束,一种是Rl — R2 — R3结束,如图7A、7B所示,对应的有两种执行方式,第一种执行方式,如图7A所示,RU R2、R3在主线程上执行,对应区域的插桩函数集中起来在一个或多个微线程上执行,执行Rl区域的插桩函数(InstruRl)的微线程与执行R2区域的主线程并行执行,执行R2区域的插桩函数(InstrUR2)的微线程与执行R3区域的主线程并行执行,执行R3区域的主线程结束之后启动微线程执行R3区域的插桩函数(InstruR3);第二种执行方式,如图7B所示,RU R2在主线程上执行,对应区域的插桩函数集中起来在一个或多个微线程上执行,执行Rl区域的插桩函数(InstruRl)的微线程与执行R2区域的主线程并行执行,执行R2区域的主线程结束之后启动微线程执行R2区域的插桩函数(InstrUR2)。
[0055]可选地,执行至一个区域对应程序结束时,启动至少一个微线程执行区域对应程序的插桩函数除计数操作外的操作,包括:
[0056]若二维数组的第i*2+l个元素的值不为0,则执行插桩函数的次数等于第i*2+l个元素的值,插桩函数的输入参数为二维数组的第i*2个元素。
[0057]具体地,如图6所示,例如a_l[i] [I]不为0,则微线程执行第i个插桩函数(如edge_id=2上的插桩函数,除计数外的操作)的次数等于a_l [i] [I]次,新的插桩函数为Instru_new (a_l [i] [O]),调用 a_l [i] [I]次,区域 R2 以及区域 R3 类似;如果 a_l [i] [I]等于0,则不在微线程中执行此插桩函数。
[0058]可选地,执行至一个区域对应程序结束时,启动至少一个微线程执行区域对应程序的插桩函数除计数操作外的操作,包括:
[0059]执行区域对应程序的插桩函数结束后,释放二维数组空间。
[0060]具体地,执行区域对应程序的插桩函数结束后,例如区域Rl的插桩函数结束之后,如图7A、7B所示,InstruRl结束之后,释放大小为N*2的二维数组空间a_l (N=3)。
[0061]本实施例,通过在程序控制流图上划分出至少两个区域,将各个区域对应程序包含的插桩函数替换为计数操作;将所述各个区域对应程序在主线程上执行,执行至一个区域对应程序结束时,启动至少一个微线程执行所述区域对应程序包含的插桩函数除计数操作外的操作;所述微线程与执行下一个区域对应程序的主线程并行执行,因为将程序中每个区域内的插桩函数的一部分操作转移到微线程上,此微线程与执行下一个区域对应程序的主线程并行执行,并且利用数组操作替换插桩函数的计数操作,数组操作的执行效率比调用函数计数的执行效率更高,在微线程执行插桩函数之后,释放数组空间提高资源的利用率,最终提高了轮廓技术编译时的执行效率,解决了现有技术中执行效率较低的问题。
[0062]图8为本发明轮廓技术编译的优化装置实施例的结构示意图,如图8所示,本实施例的轮廓技术编译的优化装置80可以包括:预处理模块801和处理模块802,其中,预处理模块801,用于在程序控制流图上划分出至少两个区域,将各个区域对应程序包含的插桩函数替换为计数操作;处理模块802,用于将所述各个区域对应程序在主线程上执行,执行至一个区域对应程序结束时,启动至少一个微线程执行所述区域对应程序包含的插桩函数除计数操作外的操作,用于记录所述区域对应程序执行时的信息;所述微线程与执行下一个区域对应程序的主线程并行执行。
[0063]本实施例的装置,可以用于执行图3所示方法实施例的技术方案,其实现原理和技术效果类似,此处不再赘述。
[0064]可选地,预处理模块801具体用于:
[0065]在各个区域对应程序的入口处,开辟一个大小为N*2的二维数组空间,所述N为所述各个区域对应程序包含的插桩函数个数的最大值;
[0066]将所述二维数组的第i*2个元素赋值为所述程序控制流图中边的序号,所述二维数组的第i*2+l个元素用于计数,所述i表示第i个插桩函数,所述i取值为大于等于O且小于等于N。
[0067]可选地,处理模块802具体用于:
[0068]若所述二维数组的第i*2+l个元素的值不为0,
当前第2页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1