Arch Lab
环境准备
需要先安装flex、bison,直接安装就好。
安装tcl/tk
sudo apt install tcl tcl-dev tk tk-dev |
需要修改相应makefile文件,不需要GUI界面的话第一个就注释掉,第二个需要修改路径。通过命令行直接安装的话时8.6版本,而原来的路径为8.5的,会出现找到到相应文件的问题。后面相应实验出现问题都要修改相应的makefile文件。
Part A
sum.ys 迭代求和
.pos 0 |
rsum.ys 递归求和
.pos 0 |
在递归调用前先保存当前内存位置值到%r8寄存器中,再保存到栈中。
copy.ys 复制到目标位置
.pos 0 |
Part B
参考OPq rA, rB和irmovq V, rB指令的执行阶段
iaddq执行数据流
在instr_valid、need_regids、need_valC
srcB、dstE
aluA、aluB、setCC
相应位置添加IIADDQ
测试
make SIM=../seq/ssim TFLAGS=-i |
Part C
未修改:
Average CPE: 15.18
添加iaddq指令,向Part B那样添加iaddq指令后修改代码,得到CPE: 12.70
# You can modify this portion |
Average CPE: 12.70
采用循环展开,通过增加每次迭代计算的元素的数量,减少循环的迭代次数。
要减少CPE,需要尽可能充分利用时钟周期,即让每个时钟周期执行对我们的结果有意义的指令。
mrmovq (%rdi), %r10 # read val from src... |
第二条指令在译码阶段需要读取%r10寄存器中的值,但第一条指令直到访存阶段才能读取出应该放到%r10寄存器中的值,出现加载/使用数据冒险,编译器会在此间加入一个气泡,可以利用这个时钟周期,执行有意义的指令,预先读出后面内存中的值来提高时钟周期的利用率。
这里采用四次循环展开,前面4个为一组处理后,剩下的长度可能为1,2,3。通过在Recover中恢复剩余的元素个数。如果小于等于0的话,说明初始长度为4的倍数,直接返回,否则还要复制相应个数的元素。
# You can modify this portion |
这里会有条件跳转,在pipe-full.hcl的描述中,是跳转到跳转条件满足的位置,即跳转到Done,但Done后面紧跟ret返回,而大多数情况是跳转到跳转条件不满足的位置,继续向下执行。因此如果跳转到Done执行后面的指令会浪费时钟周期,而如果继续向下执行,读取内存中的值时,如果之后需要用到,则可以利用当前的时钟周期。修改pipe-full.hcl为分支条件不满足的位置,即jmp后面的那条指令位置。
最终Score: 60