Architecture Lab记录

by Gu Wei
2021年10月

Architecture Lab 一共有三个部分。第一个部分让你手写Y86-64汇编代码,并利用提供的assembler模拟器将.ys汇编成目标文件.yo。第二部分让你给顺序执行的处理器增加iaddq指令。第三部分是建立在前两者之上,我们既要手写Y86-64汇编来从算法上提高程序性能,还要修改处理器来使它执行这个程序更加快。

在开始之前,建议直接把Makefile中的GUIMODE、TKLIBS、TKINC三个全部注释掉,不使用GUI模式只用TTY模式。本人一开始也想要用GUI,于是下载了tcl、tk等工具,但是在编译的时候,发现tcl8.6会报错:error: ‘Tcl_Interp’ has no member named ‘result’。查了一下是tcl8.6相比tcl8.5把result给去掉了,使得编译不成功。准备下载tcl8.5,可是ubuntu20.04的包管理器似乎已经不提供tcl8.5了,要么去网上下载tcl8.5的deb文件再安装。但是嫌麻烦就不做了。


 

1. Part A

在seq/misc文件夹下,将三个C程序翻译成Y86-64汇编程序(*.ys)。利用提供的yas程序将.ys变成.yo目标文件(.yo这里是ASCII格式的,虽然严格意义上应该是二进制文件,但是这样才有可读性),再通过yis程序来模拟机器代码的运行,会输出内存和寄存器的变化。三个C程序分别是链表求和、递归链表求和以及拷贝内存地址,其中handout要求的sample list以及copy block分别为:

1.1 sum_list

链表求和。C程序如下:

本人手写的汇编如下:

利用yas生成.yo程序:

sum.yo如下:

利用yis查看结果:

可以看出返回值%rax为0xcba,没毛病!

1.2 rsum_list

递归版链表求和。c程序如下:

本人手写的汇编如下:

测试有:

可以看出返回值%rax为0xcba,没毛病!

1.3 copy_block

把src地址上的内存拷贝到dest地址上,返回拷贝值的异或。c代码如下:

本人写的汇编如下:

测试有:

可见返回值%rax没有问题,0x111、0x222、0x333也改成了0xa、0xb、0xc。没毛病!


 

2. Part B

在sim/seq文件夹中,修改seq-full.hcl文件,实现iaddq指令

2.1 初识

在书中Practice Problem 4.3找到iaddq指令,可见它是把一个八字节的常数V加到rB之中。

 

参考Figure 4.18的OPq和irmovq可以依葫芦画瓢得到iaddq在六个阶段的操作:

Stageiaddq V, rB
Fetchicode:ifun <--- M1[PC]
 rA:rB <--- M1[PC+1]
 valC <--- M8[PC+2]
 valP <--- PC+10
DecodevalB <--- R[rB]
ExecutevalE <--- valB + valC
Memory 
Write backR[rB] <--- valE
PC updatePC <--- valP

2.2 修改seq.hcl

参考4.3.4节修改seq.hcl,增加iaddq有(只列出修改部分):

2.3 测试

  1. make一下

  2. 测试一个简单的Y86-64程序

  3. 测试除了加法运算的操作

  4. 测试除了iaddq以外的所有指令

  5. 测试所有指令

全部succeed就好了!


 

3. Part C

在sim/pipe文件夹下,修改ncopy.ys和pipe-full.hcl两个文件,使得ncopy.ys跑得越快越好。handout里面写测试写的复杂极了,有点事无巨细的感觉。我就只用到以下几个:

ncopy的c源码如下:

3.1 加入iaddq指令

这里从略,和之前两个Part及其类似,CPE从15.18变为12.70

3.2 循环展开

观察ncopy.c可以看出程序具有数据相关。根据第五章的知识,我们可以采用循环展开突破延迟界限达到吞吐量界限——一种完全流水线下且利用所有功能单元的终极性能。抄了网上的代码如下:

跑个分有CPE为8.63,得分37.4/60.0

从某种角度上来说,这个lab就这样差不多结束了。


 

4. 写在后面

本人于2021/10/24完成了Architecture Lab,耗时三天。难以评价这个lab,个人觉得自己水平还没有到去真正吸收这个lab的地步吧。回头想想当初读第四章的时候觉得,这章许多内容有点冗杂,同一个知识点讲述不集中。现在觉得作者还是有自己的初衷的,作者设计了Y86-64汇编语言和它的汇编工具,汇编工具又是由作者设计用来描述硬件的HCL语言所生成。所以第四章需要花费笔墨和读者讲述自己的Y86-64以及HCL,而对处理器的讨论却给冲淡了。有一种作者很用心,但是读者却难以收获什么的感觉。。。

现在主要还有三个lab没有做——cache lab、shell lab、malloc lab。performance lab被cmu替换成cache lab了,那我也不做;poxy lab用到的是第三部分的知识,主要就是套接字编程,当初也没看的很懂第三部分,网上虽然说这个lab体量很小,但是限于个人时间精力还是不做为妙。我想接下来要做这些: