Skip to content

Latest commit

 

History

History
32 lines (32 loc) · 2.2 KB

lab4.md

File metadata and controls

32 lines (32 loc) · 2.2 KB

archLab

PartA

  • 利用Y86-64写三个小程序
  • 可以使用yas工具进行汇编,并且利用yis工具用于仿真
  • 答案如下:

PartB

  • 目标: 实现SEQ模型下的IIADDQ指令,通过修改seq-full.hcl指令的方式进行修改各种信号的作用时机(此时不用管ALU的计算活动,只用关注输入信号即可)
  • SEQ结构如下: alt text
  • 对于五个阶段(其实不包含写回)分别进行如下操作(针对于IIADDQ指令,也就是为一个寄存器加上一个立即数字):
    • 取指: 获取rA,rB,valC
    • 译码: 获取R[rB] = valB即可
    • 执行: valE = valB + valC(此时可以设置 CC)
    • 写回: valE -> dstE
    • 访存: 没有对应的操作
    • 更新: PC
  • 注意dstE 表示需要写入valE 的寄存器的地址,dstM 表示需要写入valM 的寄存器地址

PartC

  • 目标: 通过修改: pipe-full.hclncopy.ys来提高ncopy.ys的效率,测试脚本在: run.sh
  • 这里使用的几种改善方法:
    • 修改pipe-full.hcl实现iaddq指令,完成立即数和寄存器中目标数字的直接相加,减少了寄存器操作
    • 利用循环展开,大量的数据使用六路循环展开,剩余的数据使用三路循环展开提高效率
    • 在相邻并且相关的内存操作之间插入特定的操作,来达到气泡的效果,但是有充分利用了五级流水线
  • 改善程序效率的几种方法:
    • 减少内存引用的次数: 也就是减少内存操作的次数,最好使用累积变量来存储操作的结果,最后把这一个累积变量写入到内存中
    • 进行循环展开,注意循环展开是为类提高各个指令的并行程度从而缩短关键路径的长度
    • 进行表达式的结合,这一种行为也是为了提高指令的并行程度
    • 使用内联函数提到具体函数
    • 可以使用条件传送(cmove)来代替条件控制(JXXX)