一、实验内容
- 在WinDLX环境下,运行下面代码。
- 提交第三部分的DLX 代码的汇编文件。
- 按每部分的实验内容完成各自的任务。
二、代码实现及分析
1.结构相关
在下面的代码中,如果存在结构相关,使用windlx找到由此引起的暂停,指出其指令对和结构相关的百分比。
LHI R2,(A>>16)&0xFFFF
ADDUI R2,R2,A&0xFFFF
LHI R3,(B>>16)&0xFFFF
ADDUI R3,R3,B&0xFFFF
ADDU R4,R0,R3
loop:
LD F0,0(R2)
LD F4,0(R3)
ADDD F0,F0,F4
ADDD F2,F0,F2
ADDI R2,R2,#8
ADDI R3,R3,#8
SUB R5,R4,R2
BNEZ R5,loop
TRAP #0
A: .double 1,2,3,4,5,6,7,8,9,10
B: .double 1,2,3,4,5,6,7,8,9,10
注意:这里虽然使用了数组,但实际上前四行代码中运算用到的A和B并不是数组的某一个元素,而是A数组和B数组的起始地址(通过WINDLX运行分析可知)。
一个简单的验证方法就是把A数组中的元素颠倒不改变数目即(10,9,8,7,6,5,4,3,2,1),再通过WINDLX可以发现运行得到的结果并没有发生变化!
再说结构相关的问题:
结构相关就是流水线处理机因为某些指令组合(同时使用相同的资源),而导致资源冲突使程序无法正常运行,也会因此产生暂停。
根据上述定义我们可以在流水线时空图中找到由结构相关引起的暂停:
使用WINDLX得到的暂停数:
WINDLX并没有将结构相关引起的暂停统计到“Stuctural stalls”中,但是我们依然可以通过Pipeline窗口单步执行找到引起结构相关的指令。
1.ADDD F2,F0,F2
2.ADDI R2,R2,#8
3.SUB R5,R4,R2
这三条指令都出现在循环体内,循环体执行了10次,总共发生了30次结构相关引起的暂停,每条指令