赞
踩
体系结构这门课程中,指令调度和循环展开可以说是课程最困难的地方,很多初学者(包括我)都只能凭感觉进行指令调度和循环展开。
在复习这门课程的过程中,我找出了一种比较通用的求解循环展开题型的思路。这种思路不仅能获得循环展开完全填充的最优解,同时还可以在使用的过程中自动确定循环展开的次数,因此在此和大家分享一下。直接用例题进行分析:
这是一道很典型的循环展开例题。循环展开来减少每个循环平均的时钟周期并不难,但是难就难在确定最优展开方式。
遇到循环展开题型,首先应该分析代码,将循环体的执行内容大致理解一下,并记录各个寄存器的作用,如下所示:
整数寄存器:
浮点寄存器:
由此可知,每个循环体都要使用到的寄存器包括四个整数寄存器以及一个浮点寄存器F0,另外,每个循环体都需要单独配备三个浮点寄存器(第一个循环体中为F2 F4和F6)。
循环体内容语句是指循环体本身在每个循环中需要进行的操作;循环体控制语句则是控制循环的行进和终止的语句。
本题中,循环体内容语句如下:
循环体控制语句如下:
可以得出:内容语句共有五句,控制语句为四句。
通过多次的循环展开,可以使得多个循环体共用这四句控制语句,从而减少多次循环的时钟周期数,这也是循环展开的本质。
本题中,由于数据相关的存在,使得循环体内容语句执行后可能会需要停顿,这样就导致了系统性能的下降,因此应该避免。
不同的语句与其后跟随的语句确定了每一次的停顿周期数。本题中每个循环体重各条指令的停顿周期数如下:
对循环体内容中各条指令的代价从大到小排序:
MULD指令(6个周期)>ADDD指令(4个周期)>两条LD指令(2个周期)。
过程与上面类似,可以得到下面的递减排列顺序:
DADDIU(2个周期)>其他三条指令
接下来到了循环展开的重点部分了!就是如何实施循环展开。本方法的循环展开基本思路是基于贪婪原则的,因此得到的三条展开原则如下:
最后的循环展开结果如下所示,下面对结果进行分析:
1.LD F2,0(R1)
2.LD F8,8(R1)
3.LD F14,16(R1)
4.MULD F4,F2,F0
5.MULD F10,F8,F0
6.MULD F16,F14,F0
7.LD F6,0(R2)
8.LD F12,8(R2)
9.LD F18,16(R2)
10.DADDIU R1,R1,#24
11.ADDD F6,F4,F6
12.ADDD F12,F10,F12
13.ADDD F18,F16,F18
14.DADDIU R2,R2,#24
15.DSLTU R3,R1,R4
16.SD F6,-24(R2)
17.SD F12,-16(R2)
18.BNEZ R3,foo
19.SD F18,-8(R2)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。