10.2代码调度的约束 10.2.5控制相关 在非数值计算中,基本块非常小,其中的操作通 常高度相关,几乎不能并行 调查跨基本块的并行是至关重要的 若一条指令很可能被执行且有空闲的资源可“免 费”用于完成该指令的操作,则可以投机地执行 该指令;若投机成功,则程序运行得快一些 例if(a>t) b=a*a依赖于比较a>的结果 b=a*a; 若a*a不会产生副作用,则 d=a+c; a*a可以投机地执行
10.2 代码调度的约束 10.2.5 控制相关 – 在非数值计算中,基本块非常小,其中的操作通 常高度相关,几乎不能并行 – 调查跨基本块的并行是至关重要的 – 若一条指令很可能被执行且有空闲的资源可“免 费”用于完成该指令的操作,则可以投机地执行 该指令;若投机成功,则程序运行得快一些 例 if (a > t) b = a a依赖于比较a > t的结果 b = a a; 若a a不会产生副作用,则 d = a + c; a a可以投机地执行
10.2代码调度的约束 10.2.6投机执行的支持 内存读取是一类使用频繁,且能从投机执行大大 获益的指令 但在f(p!=nul q 中,投机地对p脱引用将引起该程序因p等于nul 而错误地停止 许多高性能处理器提供专门的特性来支持投机地 内存访问
10.2 代码调度的约束 10.2.6 投机执行的支持 – 内存读取是一类使用频繁,且能从投机执行大大 获益的指令 – 但在 if (p != null) q = p 中,投机地对p脱引用将引起该程序因p等于null 而错误地停止 – 许多高性能处理器提供专门的特性来支持投机地 内存访问
10.2代码调度的约束 10.2.6投机执行的支持 预取指令 在数据使用前将其从内存取到缓存 若该单元无效或访问它会引起缺页,则忽略 抑制位 允许投机地从内存将数据读取到寄 存器堆,若出现非法内存访问或缺页,则设置目 标寄存器的抑制位 判定指令 在判定条件为真时才执行的指令 例f(a=0) 翻译成ADDR3,R4,R5 b=c+d; CMOVZ R2,R3,R1 假定a、b、c和d分别被分配了R1、R2、R4和R5 可用来将相邻基本块组合成一个更大基本块
10.2 代码调度的约束 10.2.6 投机执行的支持 – 预取指令 在数据使用前将其从内存取到缓存, 若该单元无效或访问它会引起缺页,则忽略 – 抑制位 允许投机地从内存将数据读取到寄 存器堆,若出现非法内存访问或缺页,则设置目 标寄存器的抑制位 – 判定指令 在判定条件为真时才执行的指令 例 if (a == 0) 翻译成 ADD R3, R4, R5 b = c + d; CMOVZ R2, R3, R1 假定a、b、c和d分别被分配了R1、R2、R4和R5 可用来将相邻基本块组合成一个更大基本块
10.2代码调度的约束 10.2.7一个基本的机器模型 机器模型M=(R,T -T:操作类型集,如读取、 存储和算术运算等 R=【r1,r2,]:硬件资源向量集,如内存访问部 件、算术运算部件和浮点功能部件 r代表第类资源中可用的部件数 每个操作有一组输入操作数、一组输出操作数和 一个资源需求 和每个输入操作数相关的是一个输入延迟 和每个输出操作数相关的是一个输出延迟
10.2 代码调度的约束 10.2.7 一个基本的机器模型 • 机器模型M = (R, T) – T:操作类型集,如读取、存储和算术运算等 – R = [r1 , r2 , …]:硬件资源向量集,如内存访问部 件、算术运算部件和浮点功能部件 ri代表第i类资源中可用的部件数 – 每个操作有一组输入操作数、一组输出操作数和 一个资源需求 – 和每个输入操作数相关的是一个输入延迟 – 和每个输出操作数相关的是一个输出延迟
10.2代码调度的约束 10.2.7一个基本的机器模型 机器模型M=R,T 对每种操作类型,资源使用由一张二维资源预留 表RT来建模 条目RTi,升是类型的一个操作在它被发射时钟 周期后,使用第种资源的部件数 对任何t、和j,RTIi,必须小于或等于川
10.2 代码调度的约束 10.2.7 一个基本的机器模型 • 机器模型M = (R, T) – 对每种操作类型t,资源使用由一张二维资源预留 表RTt来建模 – 条目RTt [i, j]是t类型的一个操作在它被发射i时钟 周期后,使用第j种资源的部件数 – 对任何t、i和j,RTt [i, j]必须小于或等于R[j]