前言
看了龙哥的blog,感觉实验报告的内容变了一点,这里就更新一下
龙哥的blog
实验内容
观察一段代码并运行,观察其中的流水线冒险,并记录统计统计信息。
对所给的代码进行指令序列的调整,以期避免数据相关,并记录统计信息。
启动forward功能,以获得性能提升,并且记录统计信息。
(选做:用perf记录x86中的数据相关于指令序列调整后的时间统计、
调整指令,以避免连续乘法间的阻塞。)
实验说明
首先,我们给出一段C代码,该段代码实现的是两个矩阵相加。
设有44矩阵A和44矩阵B相加,得到4*4矩阵C:
for(inti = 0; i< 4; i++)
For(int j = 0; j < 4; j++)
C[i][j] = A[i][j] + B[i][j];
根据上述的C代码,我们将其转换成MIPS语言,然后运行,并进行分析。
MIPS代码如下:
.data
a: .word 1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4
b: .word 4,4,4,4,3,3,3,3,2,2,2,2,1,1,1,1
c: .word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
len: .word 4
control: .word32 0x10000
data: .word32 0x10008
.text
start:daddi r17,r0,0
daddi r21,r0,a
daddi r22,r0,b
daddi r23,r0,c
ld r16,len(r0)
loop1: slt r8,r17,r16
beq r8,r0,exit1
daddi r19,r0,0
loop2: slt r8,r19,r16
beq r8,r0,exit2
dsll r8,r17,2
dadd r8,r8,r19
dsll r8,r8,3
dadd r9,r8,r21
dadd r10,r8,r22
dadd r11,r8,r23
ld r9,0(r9)
ld r10,0(r10)
dadd r12,r9,r10
sd r12,0(r11)
daddi r19,r19,1
j loop2
exit2:daddi r17,r17,1
j loop1
exit1: halt
实验前请保证winMIPS64配置中“Enable Forwarding”没有选中。将这段代码加载到WinMIPS64中,运行后观察结果(提供Statistic窗口截图)。从Statistic窗口记录:本程序运行过程中总共产生了多少次RAW的数据相关。接下来,我们对产生数据相关的代码逐个分析,请列出产生数据相关的代码,并在下一步中进行分析和优化。