- 1、本文档共68页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
指令流调度,循环展开
Quiz 3 假设各种分支占所有指令数的百分比如下表所示: 现有一5段流水线,每段延迟时间均为一个时钟周期,分支转移地址在第3个时钟周期结束时才能计算出来,条件分支的转移条件在第4个时钟周期才能确定。假设第一个流水段是取指阶段,第二个流水段是指令译码阶段,理想CPI值为1。试通过计算说明应该采用哪种控制相关处理策略(冻结技术、预测分支成功策略以及预测分支失败策略)性能最高? 第4章 指令级并行 Review: 基本流水线 流水线提高的是指令带宽(吞吐率),而不是单条指令的执行速度 相关限制了流水线性能的发挥 结构相关:需要更多的硬件资源 数据相关:需要定向,编译器调度 控制相关:尽早检测条件,计算目标地址,延迟转移,预测 增加流水线的级数会增加相关产生的可能性 异常,浮点运算使得流水线控制更加复杂 编译器可降低数据相关和控制相关的开销 Load 延迟槽 Branch 延迟槽 Branch预测 指令级并行的概念 计算机系统的并行性,从执行程序的角度,分为: 指令内部并行:指令内部的微操作 指令级并行:并行执行两条或多条指令 任务级或过程级并行:并行执行两个或多个过程或任务 作业或程序级并行:在多个作业或程序间并行 从处理数据的角度,并行性等级分为: 字串位串 字串位并 字并位串 全并行 提高并行的三种途径 时间重叠 资源重复 资源共享 4.1 先进流水线技术和指令级并行(Instruction Level Parallelism) ILP: 无关的指令重叠执行 流水线的平均CPI Pipeline CPI = Ideal Pipeline CPI + Struct Stalls + RAW Stalls + WAR Stalls + WAW Stalls + Control Stalls 本章研究 减少停顿(stalls)数的方法和技术 基本途径 软件方法(编译器优化) Gcc: 17%控制类指令 5 instructions + 1 branch 在基本块上,得到更多的并行性 挖掘循环级并行 硬件方法 动态调度方法 以DLX的浮点数操作为例 采用的基本技术 本章遵循的指令延时 基本块内的指令级并行 基本块的定义 直线型代码,无分支 单入口 整个程序是由分支语句连接基本块构成 循环级并行 for (i = 1; i = 1000; i++) x(i) = x(i) + s; ? 计算x(i)时没有相关 ? 可以并行产生1000个数据 ?这里没有相关是指没有数据相关 ?问题是在生成代码时会有Branch指令-控制相关 ?预测比较容易,但我们必须有预测方案 向量处理机模型 ? load vectors x and y (up to some machine dependent max) ? then do result-vec = xvec + yvec in a single instruction 简单循环及其对应的汇编程序 for (i=1; i=1000; i++) x(i) = x(i) + s; FP 循环中的相关 Loop: LD F0,0(R1) ;F0=vector element ADDD F4,F0,F2 ;add scalar from F2 SD 0(R1),F4 ;store result SUBI R1,R1,8 ;decrement pointer 8B (DW) BNEZ R1,Loop ;branch R1!=zero NOP ;delayed branch slot FP 循环中的相关 FP 循环中的Stalls 10 clocks: 是否可以通过调整代码顺序使stalls减到最小 FP 循环中的最少Stalls数 6 clocks: 通过循环展开4次是否可以提高性能? 循环展开4次(straightforward way) Rewrite loop to minimize stalls? Stalls数最小的循环展开 代码移动后 SD移动到SUBI后,注意偏移量的修改 Loads移动到SD前,注意偏移量的修改 循环展开示例小结 移动SD到SUBI和BNEZ后,需要调整 SD中的偏移 循环展开对循环间无关的程序是有效降低stalls的手段(对循环级并行). 不同次的循环,使用不同的寄存器. 删除不必要的测试和分支后,需调整循环步长等控制循环的代码. 注意循环展开中的Load和Store,不同次循环的Load 和Store 是相互独立的。需要分析对存储器的引用,保证他们没有引用同一地址. 指令调度,必须保证程序运行的结果不变 从编译器角度看代码移动(1/5) 编译器分析程序的相关性依赖于给定
文档评论(0)