第九章机器无关的优化学习培训模板课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《第九章机器无关的优化学习培训模板课件.ppt》由用户(林田)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第九 机器 无关 优化 学习 培训 模板 课件
- 资源描述:
-
1、第九章 机器无关的优化优化的主要来源 编译器只能通过一些相对低层的语义等价转换来优化代码;冗余运算的原因 源程序中的冗余;高级程序设计语言编程的副产品 比如Aij.f=0;Aij.k=1;中的冗余运算;语义不变的优化 公共子表达式消除 复制传播 死代码消除 常量折叠优化的例子(1)快速排序算法优化的例子(2)三地址代码Quicksort的流图 循环:B2 B3 B2、B3、B4、B5全局公共子表达式 如果E 在某次出现之前必然已经被计算过,且 E的分量在该次计算之后一直没有被改变,那么E的本次出现就是一个公共子表达式 如果上一次E的值赋给了x,且x的值至今没有被修改过,那么我们就可以使用x,而
2、不需要计算E;例子见左边t7=4*it10=4*j不需要重新计算;基本块内的公共子表达式全局公共子表达式的例子 右图 在B2、B3中计算了4*i和4*j 到达B5之前必然经过B2、B3;t2、t4在赋值之后没有被改变过,因此B5中可直接使用它们;t4在替换t8之后,B5:at8和B3:at4又相同;同样:B5中赋给x的值和B2中赋给t3的值相同;B6中的at13和B1中的at1不同,因为B5中可能改变a的值;消除公共子表达式后的结果复制传播 形如u=v的复制语句使得语句后面的程序点上,u的值等于v的值;如果在某个位置上u一定等于v,那么可以把u替换为v;有时可以彻底消除对u的使用,从而消除对u
3、的赋值语句;右图所示,消除公共子表达式时引入了复制语句;如果尽可能用t来替换c,可能就不需要c=t这个语句了。复制传播的例子 右图显示了对B5进行复制传播处理的情况 可能消除所有对x的使用死代码消除 如果一个变量在某个程序点上的值可能会在之后被使用,那么这个变量在这个点上活跃;否则这个变量就是死的,此时对这个变量的赋值就是没有用的死代码;死代码多半是因为前面的优化而形成的;比如,B5中的x=t3就是死代码;消除后得到at2=t5at4=t3goto B2x=t3at2=t5at4=t3goto B2=代码移动 循环中的代码会被执行很多次 循环不变表达式:循环的同一次运行的不同迭代中,表达式的值
4、不变 把循环不变表达式移动到循环入口之前计算可以提高效率 循环入口:进入循环的跳转都以这个入口为目标while(i=limit-2)如果循环体不改变limit的值,可以在循环外计算limit-2t=limit-2while(i=t)归纳变量和强度消减归纳变量 每次对x的赋值都使得x的值增加c,那么x就是归纳变量;把对x的赋值改成增量操作,可消减计算强度,提高效率;如果两个归纳变量步调一致,还可以删除其中的某一个;例子 如果在循环开始时刻保持t4=4*j 那么,j=j-1后面的t4=4*j每次赋值使得t4减4 替换为t4=t4 4;t2也可以同样处理继续优化 对t2强度消减 B4中对i和j的测试
5、可以替换为对t2,t4的测试数据流分析 数据流分析 用于获取数据沿着程序执行路径流动的信息的相关技术。是优化的基础 例如 两个表达式是否一定计算得到相同的值?(公共子表达式)一个语句的计算结果有没有可能被后续语句使用?(死代码消除)数据流抽象(1)程序点 三地址语句之前或之后的位置 基本块内部:一个语句之后的程序点等于下一个语句之前的程序点 如果流图中有B1到B2的边,那么B2的第一个语句之前的点可能紧跟在B1的最后语句之后的点后面执行;从p1到p2的执行路径:p1,p2,pn 要么pi是一个语句之前的点,且pi+1是该语句之后的点 要么pi是某个基本块的结尾,且pi+1是该基本块的某个后继的
6、开头。数据流抽象(2)出现在某个程序点的程序状态:在某个运行时刻,当指令指针指向这个程序点时,各个变量和动态内存中存放的值 指令指针可能多次指向同一个程序点 因此一个程序点可能对应多个程序状态 数据流分析把可能出现在某个程序点上的程序状态集合总结为一些特性;不管程序怎么运行,当它到达某个程序点时,程序状态总是满足分析得到的特性;不同的分析技术关心不同的信息;为了高效、自动地进行数据流分析,通常要求这些特性能够被高效地表示和求解;例子(1)路径 1,2,3,4,9 1,2,3,4,5,6,7,8,9 第一次到达(5),a=1;第二次到达(5),a=243;且之后都是243。我们可以说:点(5)具
7、有特性a=1 or a=243。表示成为性质和算法 根据不同的需要来设置不同的性质集合;然后设计分析算法 程序点上的性质被表示成为数据流值;求解这些数据流值的过程实际上就是推导这些性质的过程 例子 如果要求出变量在某个点上的值可能在哪里定值,可以使用到达定值(reaching definition)性质形式:x由d1定值 如果希望实现常量折叠优化,我们关心的是某个点上变量x的值是否总是由某个特定的常量赋值语句赋予的。性质形式:x=c,以及x=NAC 分析得到的性质集合应该是一个安全的估计值 即根据这些性质进行优化不会改变程序的语义数据流分析模式 数据流分析中,程序点和数据流值关联起来 数据流值
8、表示了程序点具有的性质;和某个程序点关联的数据流值:程序运行中经过这个点时必然满足的这个条件;域 所有可能的数据流值的集合称为这个数据流值的域 不同的应用选用不同的域;比如到达定值:目标是分析在某个点上,各个变量的值由哪些语句由哪些语句定值;因此数据流值是定值(即三地址语句)的集合,表明集合中的定值对某个变量定值了。数据流分析 对一组约束求解,得到各个点上数据流值。约束分成两类:基于语句和基于控制流 基于语句语义的约束 一个语句之前和之后的数据流值受到该语句语义的约束;语句语义通常用传递函数表示,它把一个数据流值映射为另一个数据流值;INs=fs(OUTs)(逆向)OUTs=fs(INs)(正
9、向)基于控制流的约束 在基本块内部,一个语句的输出和下一语句的输入相同;流图的控制流边也对应新的约束例子(1)假设我们考虑各个变量在某个程序点上是否常量 s是语句x=3;考虑变量x,y,z;INs:x:NAC;y:7;z:3 那么OUTs就是:x:3;y:7;z:3 如果 s是x=y+z,OUTs是?s是x=x+y,OUTs是?例子(1)设有如右图的流图 且数据流值 OUTs1:x:3,y:4,z:NAC OUTs2:x:4,y:3,z:NAC 则 INs:x:NAC,y:NAC,z:NAC OUTs是什么?能推出z:7吗?s1:x=3s2:y=3x=4;y=4;z=a+b;s:z=x+y基本
10、块上的数据流模式 基本块的控制流非常简单 从头到尾不会中断 没有分支 基本块的效果就是各个语句的效果的复合 可以预先处理基本块内部的数据流关系,给出基本块对应的传递函数;INB=fB(OUTB)或者 OUTB=fB(INB)设基本块包含语句s1,s2,sn;fB=fsn fs2 fs1基本块之间的控制流约束 前向数据流问题 B的传递函数根据INB计算得到OUTB;INB和B的各前驱基本块的OUT值之间具有约束关系;逆向数据流问题 B的传递函数根据OUTB计算INB;OUTB和B的各后继基本块的IN值之间具有约束关系;B1B3BB2前向数据流的例子:假如:OUTB1:x:3y:4z:NAC OU
11、TB2:x:3y:5z:7 OUTB3:x:3y:4z:7则:INB:x:3y:NACz:NAC数据流方程解的精确性和安全性 数据流方程通常没有唯一解。目标是寻找一个最“精确的”、满足约束的解 精确:能够进行更多的改进 满足约束:根据分析结果来改进代码是安全的到达定值(1)到达定值 如果存在一条从定值d后面的程序点到达某个点p的路径,且这条路径上d没有被杀死,那么定值d到达p 杀死:路径上对x的其他定值杀死了之前对x的定值;考虑到间接赋值,如果定值可能不是对x进行复制,则不能杀死这个定值 直观含义 如果d到达p,那么在p点使用的x的值就可能是由d定值的。到达定值(2)到达定值的解允许不精确,但
12、必须是安全的 分析得到的到达定值可能实际上不会到达;但是实际到达的一定被分析出来,否则不安全 用途:确定x在p点是否常量 忽略实际的到达定值使得变化的值被误认为常量;将这些值替换为常量会引起错误,不安全 过多估计则相反 确定变量是否先使用后定值到达定值的例子 B1中全部定值到达B2的开头;d5到达B2的开头(循环)d2被d5杀死,不能到达B3、B4的开头;d4不能到达B2的开头,因为被d7杀死;d6到达B2的开头语句/基本块的传递方程(1)定值 d:u=v+w 生成了对变量u的定值d;杀死其他对u的定值;生成-杀死形式:fd(s)=gend(x-killd)gend=d,killd=程序中其他
13、对u的定值 生成-杀死形式的函数的并置(复合)仍具有这个形式 f2(f1(x)=gen2 (gen1 (x-kill1)-kill2)=(gen2(gen1-kill2)(x-kill1kill2)生成的定值:由第二部分生成、以及由第一个部分生成且没有被第二部分杀死;杀死的定值:被第一部分杀死的定值、以及被第二部分杀死的定值语句/基本块的传递方程(2)设B有n个语句,第i个语句的传递函数为fi fB(s)=genB(x-killB)genB=genn(genn-1-killn)(genn-2-killn-1-killn)(gen1-kill2-kill3-killn)killB=kill1ki
14、ll2 killn killB 为被B各个语句杀死的定值的并集 genB是被第i个语句生成,且没有被其后的句子杀死的定值的集合gen和kill的例子 基本块:d1:a=3 d2:a=4 gen集合:d2 kill集合:流图中所有针对a的定值到达定值的控制流方程 只要一个定值能够沿某条路径到达一个程序点,这个定值就是到达定值;INB=P是B的前驱基本块OUTP 如果从基本块P到B有一条控制流边,那么OUTP在INB中;一个定值必然先在某个前驱的OUT值中,才能出现在B的IN中 称为到达定值的交汇运算符P1P3BP2d:x=y+zdd此路径上x不一定被覆盖控制流方程的迭代解法(1)ENTRY基本块
15、的传递函数是常函数;OUTENTRY=空集 其他基本块OUTB=genB(INB-killB)INB=P是B的前驱基本块OUTP 迭代解法 首先求出各基本块的gen和kill 令所有的OUTB都是空集,然后不停迭代,得到最小不动点的解控制流方程的迭代解法(2)输入:流图、各基本块的kill和gen集合 输出:INB和OUTB 方法:控制流方程的迭代解法(3)解法的正确性 直观解释:不断向前传递各个定值,直到该定值被杀死为止;为什么不会死循环?各个OUTB在算法执行过程中不会变小;且OUTB显然有有穷的上界;只有一次迭代之后增大了某个OUTB的值,算法才会进行下一次迭代;最大迭代次数是流图的结点
16、个数n 定值经过n步必然已经到达所有可能到达的结点 算法结束时,各个OUT/IN值必然满足数据流方程到达定值求解的例子7个bit从左到右表示d1,d2,dnfor循环时依次遍历B1,B2,B3,B4,EXIT每一列表示一次迭代计算;B1生成d1,d2,d3,杀死d4,d5,d6,d7B2生成d4,d5,杀死d1,d2,d7B3生成d6,杀死d3B4生成d7,杀死d1,d4活跃变量分析 活跃变量分析 x在p上的值是否会在某条从p出发的路径中使用;一个变量x在p上活跃,当前仅当存在一条从p点开始的路径,该路径的末端使用了x,且路径上没有对x进行覆盖。用途 寄存器分配/死代码删除/数据流值(活跃)变
17、量的集合基本块内的数据流方程 基本块的传递函数仍然是生成-杀死形式,但是从OUT值计算出IN值(逆向)useB,可能在B中先于定值被使用(GEN)defB,在B中一定先于使用被定值(KILL)例子:基本块:i=i+1;j=j-1 use i,j;def USEB和DEFB的用法 语句的传递函数 s:x=y+z uses=y,z defs=x-y,z/x=y+z是模板,y、z可能和x相同 假设基本块中包含语句s1,s2,sn,那么 useB=use1(use2-def1)(use3-def1-def2)(usen-def1-def2-defn-1)defB=def1def2defn活跃变量数据流
18、方程 任何变量在程序出口处不再活跃 INEXIT=空集 对于所有不等于EXIT的基本块 INB=useB(OUTB-defB)OUTB=S是B的后继基本块INS 和到达定值相比较 都使用并集运算作为交汇运算 数据流值的传递方向相反:因此初始化的值不一样活跃变量分析的迭代方法 这个算法中INB总是越来越大,且INB都有上界,因此必然会停机;可用表达式分析 x+y在p点可用的条件 从流图入口结点到达p的每条路径都对x+y求值,且在最后一次求值之后再没有对x或者y赋值 主要用途 寻找全局公共子表达式 生成-杀死 杀死:基本块对x或y赋值,且没有重新计算x+y,那么它杀死了x+y;生成:基本块求值x+
19、y,且之后没有对x或者y赋值,那么它生成了x+y;计算基本块生成的表达式 初始化S=从头到尾逐个处理基本块中的指令x=y+z 把y+z添加到S中;从S中删除任何涉及变量x的表达式 遍历结束时得到基本块生成的表达式集合;杀死的表达式集合 表达式的某个分量在基本块中定值,且没有被再次生成基本块生成/杀死的表达式的例子可用表达式的数据流方程 ENTRY结点的出口处没有可用表达式 OUTENTRY=其他基本块的方程 OUTB=e_genB(INB-e_killB)INB=P是B的前驱基本块OUTP 和其他方程类比 前向传播 交汇运算是交集运算可用表达式分析的迭代方法 注意:OUT值的初始化值是全集 这
20、样的初始集合可以求得更有用的解三种数据流方程的总结数据流分析的理论基础 问题:数据流分析中的迭代算法在什么情况下正确?得到的解有多精确?迭代算法是否收敛?方程组的解的含义是什么?基于群论,首先给出数据流模式的预期特性,并证明这些特性所蕴含的对上面问题的回答。数据流分析框架 数据流分析框架(D,V,F)D:方向,FORWARD、BACKWARD V,:半格,值域为V,交汇运算(meet)为 F:V到V的传递函数族 包含刻画边界条件的函数,包含单元函数 对于组合运算封闭,即如果f1和f2在F中,那么f1 f2仍然在F中。半格 半格的定义:对于V中所有的x,y,z:xx=x,xy=yx,x(yz)=
展开阅读全文