代码生成.

Slides:



Advertisements
Similar presentations
第七节 心 悸 郑祖平. 一、概述 心悸是一种自觉心脏跳动的不适感或心 慌感。当心率加快时感到心脏跳动不适, 心率缓慢时则感到搏动有力。心悸时,心 率可快、可慢,也可有心律失常,心率和 心律正常者亦可有心悸。 一般认为与心肌收缩力心搏量的变化及 患者的精神状态注意力是否集中等多种因 素有关。
Advertisements

全微分 教学目的:全微分的有关概念和意义 教学重点:全微分的计算和应用 教学难点:全微分应用于近似计算.
平面构成 第六章 平面构成形式与法则 — 破规与变异. 第七章 平面构成形式与法则 — 破规与变异 破规与变异构成的形式、有下列四类: 一、特异构成 特异构成。其表现特征是,在普遍相同性质的事物 当中,有个别异质性的事物,便会立即显现出来。
电冰箱 初中劳技 周健.
深圳市龙岗区科技创新局 深圳市高新技术产业协会
7.4 用矩阵初等行变换 解线性方程组 主要内容: 一.矩阵的行初等变换 二.用行初等变换求逆矩阵 三.用矩阵法求线性方程组.
建構 Beta電腦 – Fall /29/0.
2013年二手车市场环境分析.
第十章 依赖于机器的优化 在指令级并行的机器上,程序的运行速度依赖于下面几个因素
类风湿性关节炎的中医治疗 广州中医药大学第一附属医院 陈纪藩.
第3课 收复新疆.
第十一单元 第24讲   第十一单元 世界经济的全球化趋势.
凉山州2015届高考情况分析 暨2016届高三复习建议 四川省凉山州教育科学研究所 谌业锋.
揭秘 庄家 股市中的 为什么你的股票一买就跌,一卖就涨? 为什么出了利好,股价反而下跌? 为什么有的股票一直涨停?
法 师 带 观 修 互 动 答 题 法 师 答 疑. 法 师 带 观 修 互 动 答 题 法 师 答 疑.
9.1 抽签的方法合理吗.
动态规划(四).
小学生游戏.
恰当方程(全微分方程) 一、概念 二、全微分方程的解法.
§5.3 定积分的换元法 和分部积分法 一、 定积分的换元法 二、 定积分的分部积分法 三、 小结、作业.
乳猪断奶后拉稀,掉膘与教槽料.
逆转地理课堂 提高复习效率 鲁迅中学 耿夫相.
2012版中考二轮复习历史精品课件北师大版 (含2011中考真题) 专题五世界近代史
强连通分量 无向图 1、任意两顶点连通称该图为连通图 2、否则将其中的极大连通子图称为连通分量 A D C B E 有向图
建國國小英語教學線上課程 字母拼讀篇(一) 製作者:秦翠虹老師、林玉川老師.
第2章 计算机指令集结构 曲冠南
6.代码最优化.
啟示錄 人 子 七 教 會 寶 座 七 印 七 號 龍 與 獸 七 碗 巴 比 倫 千 禧 年 前 後 新 耶 路 撒 冷 第9章(第5號)
第八章 代 码 生 成 本章内容 一个简单的代码生成算法 涉及存储管理,指令选择,寄存器分配和计算次序选择等基本问题 前端 代 码 优 化
闪电定位仪原理介绍和日常维护 安徽省气象技术装备中心 技术保障科.
走进编程 程序的顺序结构(二).
辅导课程六.
元素替换法 ——行列式按行(列)展开(推论)
Zhao4zhong1 (赵中) C语言指针与汇编语言地址.
§2 求导法则 2.1 求导数的四则运算法则 下面分三部分加以证明, 并同时给出相应的推论和例题 .
容斥原理 若干应用 王瑶 张梦微 张雯露 2019/1/11.
动态规划(Dynamic Programming)
CPU结构和功能.
第二章 静电场(3) §2.3 电像法 教师姓名: 宗福建 单位: 山东大学物理学院 2016年10月18日
28.1 锐角三角函数(2) ——余弦、正切.
无向树和根树.
第九章 目标代码生成.
计算.
C语言程序设计 主讲教师:陆幼利.
线性规 Linear Programming
线 性 代 数 厦门大学线性代数教学组 2019年4月24日6时8分 / 45.
2019/4/29 计算机组成原理 辅导教师:陆明强.
機械製造期末報告- 加工切削 組員:高德全4A 林威成4A 陳柏源4A
工业机器人知识要点解析 (ABB机器人) 主讲人:王老师
機器語言, 組合語言, 與編譯器 參考: β 文件; 實驗 #5B; C 語言講議 當我在我的程式碼中發現一堆 麻煩時, 朋友和同事跟我說了
美麗的西子湖.
§6.7 子空间的直和 一、直和的定义 二、直和的判定 三、多个子空间的直和.
目标代码生成.
会计实务(第七讲) ——固定资产 讲师:天天老师.
夏昊珺 PB 体系结构习题课2 夏昊珺 PB
1.设A和B是集合,证明:A=B当且仅当A∩B=A∪B
第三章 函数的微分学 第二节 导数的四则运算法则 一、导数的四则运算 二、偏导数的求法.
College of Computer Science & Technology
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
第七、八次实验要求.
本节内容 进制运算 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
第15讲 特征值与特征向量的性质 主要内容:特征值与特征向量的性质.
楊氏係數測量 目的:測量材料之楊氏係數 原理:.
2019/5/21 实验一 离散傅立叶变换的性质及应用 实验报告上传到“作业提交”。 11:21:44.
本节内容 通用寄存器 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
电阻的并联 §2-2 学习目标 1.掌握电阻并联电路的特点。 2.掌握电阻并联电路的应用。.
使用Fragment 本讲大纲: 1、创建Fragment 2、在Activity中添加Fragment
§4.5 最大公因式的矩阵求法( Ⅱ ).
专题八 欧美代议制的确立与发展 (17—19世纪) 英    美 法 德 选修:日本 俄国.
最小生成树 最优二叉树.
Presentation transcript:

代码生成

动态规划代码生成算法 动态规划代码生成算法可以适用于更广泛的机器类型:具有r个可交换的寄存器,具有加载、保存和运算等指令形式;并且, 将表达式生成最优代码的问题分解为若干子表达式生成最优代码的子问题。如表达式E为E1+E2,则E的一个最优程序可以由E1和E2的最优程序以某种顺序组合而成,然后是对+的求值代码。

动态规划代码生成算法 所产生的最优代码具有连续求值的特征。所谓程序连续计算一棵树T(如表达式E = E1 OP E2对应的树T,其子树分别为T1、T2),先计算那些需要将结果存入内存的T的子树(如T1),然后再计算T的其余子树;计算的次序是T1T2OP根(或者T2T1OP根)。 在寄存器机器上,对于任意一个计算树T的程序P,可以证明,总能找到一个等价且采用连续计算方式的T的计算程序Q。Q所使用的寄存器数与代价不超过P中的对应值。由此,确保使用动态规划算法为树T产生最优代码!

动态规划代码生成算法 算法有三个步骤(设r个寄存器可用): 自底向上计算表达式树中每个结点n的代价数组C。C[ i ]表示有i(1≤i ≤ r)个寄存器可用时,计算以结点n为根的子树且结果存入一个寄存器的最优代价。显然,C[0]表示在所有r个寄存器可用时,计算并将结果放入内存的最优代价。 遍历树T,使用代价数组来决定选择哪棵子树须被计算且结果放入内存; 遍历树T,使用代价数组和相关指令生成最终的目标代码。而那些结果放入内存的子树须被优先处理并生成代码。

示例:动态规划代码生成 表达式(树): (a – b) + c * (d / e) 机器指令: LD Ri,Mj // Ri = Mj op Ri,Rj,Rk // Ri = Rj op Rk op Ri,Rj,Mj // Ri = Rj op Mj LD Ri,Rj // Ri = Rj ST Mi,Rj // Mi = Rj (假设以上指令代价均为1, 且有两个寄存器R0、R1可用) + - * a b c / d e

示例:动态规划代码生成 算法步骤一:自底向上计算各个结点的代价数组。 ( 8,9,7) + * ( 5,5,4) - ( 3,2,2) a ( 0,1,1) b ( 0,1,1) c ( 0,1,1) / ( 3,2,2) d ( 0,1,1) e ( 0,1,1) 算法步骤一:自底向上计算各个结点的代价数组。

示例:动态规划代码生成 叶子结点a的代价为(0, 1, 1): 类似地,叶子结点b、c、d和e的代价均为 (0, 1, 1)。 C[0]: 计算a且放入内存的代价。a初始在内存中,故代价为0; C[1]:有1个寄存器可用时计算a且存入寄存器的代价,可由指令LD R0,a完成,代价为1; C[2]:在2个寄存器可用时,计算a且存入寄存器的代价,显然,也可由类似指令:LD R0,a完成,代价为1。 类似地,叶子结点b、c、d和e的代价均为 (0, 1, 1)。

示例:动态规划代码生成 内部运算结点的代价的计算 如减运算结点的代价(3,2,2) 计算如下: - ( 3,2,2) 内部运算结点的代价的计算 如减运算结点的代价(3,2,2) 计算如下: C[1]:1个寄存器可用时,计算且结果存入寄存器的代价。此时,仅指令 op Ri,Ri,Mj与根结点计算需求最佳匹配。因此,根结点的代价是:寄存器数为1时左运算分量被计算且结果存入寄存器的代价+寄存器数为1时右运算分量被计算且结果放入内存的代价+1(上述运算指令的代价),即C[1] = 1+0+1=2 而此时,对应的指令序列是(右运算量须先计算):(R可选R0或R1) // 右运算量b已在内存中,无需生成代码 LD R,a // 左运算分量计算、放入寄存器 SUB R,R,b //计算根、放入寄存器;右运算量在内存中 a ( 0,1,1) b ( 0,1,1)

示例:动态规划代码生成 内部运算结点的代价的计算 如减运算结点的代价(3,2,2) 计算如下: - ( 3,2,2) 内部运算结点的代价的计算 如减运算结点的代价(3,2,2) 计算如下: C[2]:2个寄存器可用时,计算且结果存入寄存器的代价。此时,有两种指令: op Ri,Ri,Mj和op Ri,Ri,Rj分别与根结点计算需求匹配。因此,左、右运算分量计算过程中使用寄存器数和结果存放有以下三种情形: (1)左:2个寄存器且结果在寄存器中;右(须先计算) :2个寄存器且结果在内存中,此时,根计算代价=1+0+1=2; (2)左(须先计算):2个寄存器且结果在寄存器中;右:1个寄存器且结果在寄存器中;此时,根计算代价=1+1+1=3; (3)左:1个寄存器且结果在寄存器中;右(须先计算):2个寄存器且结果在寄存器中;此时,根计算代价=1+1+1=3; 显然,针对此减运算,情形(1)代价最优,其代码序列为: // 右:b就在内存中,无需生成代码 LD R0,a // 左:加载a到寄存器 SUB R0,R0,b //根计算指令 a ( 0,1,1) b ( 0,1,1)

// 计算且结果存入寄存器R的代码(使用全部寄存器) ST M,R // 保存寄存器R到内存 类似地,可以计算出其他内部运算节点的代价向量 示例:动态规划代码生成 - ( 3,2,2) 内部运算结点的代价的计算 如减运算结点的代价(3,2,2) 计算如下: C[0]:2个寄存器可用时,计算且结果存入内存的代价。显然,最优的代码序列应该是在2个寄存器可用时计算且结果存入寄存器;然后再将结果保存到内存。因此代价=C[2]+1=2+1=3;其指令序列如下: // 计算且结果存入寄存器R的代码(使用全部寄存器) ST M,R // 保存寄存器R到内存 类似地,可以计算出其他内部运算节点的代价向量 (数组)。 a ( 0,1,1) b ( 0,1,1)

示例:动态规划代码生成 表达式树中各结点的代价向量(分量)的计算过程,其实就是寻找最优代价的计算路径,然后可以根据该路径生成最优代价的代码序列。而这也就是动态规划代码生成算法的第二与第三步! 如果某个代价分量的计算具有多种组合情况,则可能存在多条最终的最优代价相同的计算路径。例如,在上述C[2]计算时,存在三种组合情形,算法只选择代价最小的,但如果三种情形中的代价相同,则存在多种选择,可以任选其一。 在结点左右分量的计算次序上,首先考虑结果放入内存的分量须优先计算(此时将使用全部的寄存器),其次是按使用寄存器多少安排分量的计算次序。

示例:动态规划代码生成 在2个寄存器 可用时,计算 该表达式树 的最优计算 路径如图所示。 (结点标号从小 到大) 最优代码序列如下: LD R1,d DIV R1,R1,e LD R0,c MUL R0,R0,R1 LD R1,a SUB R1,R1,b ADD R1,R1,R0 9 + ( 8,9,7) 5 8 - * ( 5,5,4) ( 3,2,2) 3 a b c ( 0,1,1) ( 0,1,1) ( 0,1,1) / ( 3,2,2) 7 6 4 d e ( 0,1,1) ( 0,1,1) 2 1