- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第4章指令级并行张晨曦刘依www.Arch365.net微信公众号
对指令序列进行优化调度,以减少空转周期: 指令流出时钟 Loop: L.D F0,0(R1) 1 L.D F6,-8(R1) 2 L.D F10,-16(R1) 3 L.D F14,-24(R1) 4 ADD.D F4,F0,F2 5 ADD.D F8,F6,F2 6 ADD.D F12,F10,F2 7 ADD.D F16,F14,F2 8 S.D F4,0(R1) 9 S.D F8,-8(R1) 10 DADDIU R1,R1,#-32 12 S.D F12,16(R1) 11 BNE R1,R2,Loop 13 S.D F16,8(R1) 14 4.5 循环展开和指令调度 结果分析: 没有数据相关引起的空转等待。 整个循环仅仅使用了14个时钟周期。 平均每个元素的操作使用14/4=3.5个时钟周期。 通过循环展开、寄存器重命名和指令调度,可以有效地开发出指令级并行。 4.5 循环展开和指令调度 循环展开和指令调度时要注意以下几个方面: 保证正确性。 在循环展开和调度过程中尤其要注意两个地方的正确性:循环控制,操作数偏移量的修改。 注意有效性。 只有能够找到不同循环体之间的无关性,才能有效地使用循环展开。 使用不同的寄存器。 (否则可能导致新的冲突) 删除多余的测试指令和分支指令,并对循环结束代码和新的循环体代码进行相应的修正。 4.5 循环展开和指令调度 注意对存储器数据的相关性分析 例如:对于load指令和store指令,如果它们在不同的循环迭代中访问的存储器地址是不同的,它们就是相互独立的,可以相互对调。 注意新的相关性 由于原循环不同次的迭代在展开后都到了同一次循环体中,因此可能带来新的相关性。 4.5 循环展开和指令调度 根据表4.4给出的延迟条件,超标量处理器如何进行循环展开和指令调度? 4.5.2 静态超标量处理机中的循环展开 4.5 循环展开和指令调度 例4.8 下面是前面使用的循环程序段,对其进行循环展开,并在超标量流水线上进行调度。 Loop: L.D F0,0(R1) // 取一个数组元素放入F0 ADD.D F4,F0,F2 // 加上在F2中的标量 S.D F4,0(R1) // 存结果 DADDIU R1,R1,#-8 // 将指针减少8(每个数据占8个字节) BNE R1,R2,Loop // 若R1不等于R2,表示尚未结束,转移到Loop继续 解 将循环展开5遍并调度,可得如下代码: Loop: L.D F0,0(R1) L.D F6,-8(R1) L.D F10,-16(R1) L.D F14,-24(R1) L.D F18,-32(R1) ADD.D F4,F0,F2 ADD.D F8,F6,F2 ADD.D F12,F10,F2 ADD.D F16,F14,F2 ADD.D F20,F18.F2 S.D F4,0(R1) S.D F8,-8(R1) S.D F12,-16(R1) DADDIU R1,R1,# -40 S.D F16,16 (R1) BNE R1,R2,Loop S.D F20,8(R1) 进一步针对超标量进行调度后的指令序列如下所示 整数指令 浮点指令 时钟周期 Loop: L.D F0(R1) 1 L.D F6,-8(R1) 2 L.D F10,-16(R1) ADD.D F4,F0,F2 3 L.D F14,-24(R1) ADD.D F8,F6,F2 4 L.D F18,-32(R1) ADD.D F12,F10,F2 5 S.D F4,0(R1) ADD.D F16,F14,F2 6 S.D F8,-8(R1) ADD.D F20,F18,F2 7 S.D F12,-16(R1) 8 DADDIU R1,R1,#-40 9 S.D F16,16 (R1) 10 BNE R1,R2,Loop 11
文档评论(0)