CSAPP 的第四章《处理器体系结构》大多讲述的是 CPU 的实现,比较偏硬件。大约也是这个原因,很多高校在选用此教材讲述计算机系统导论课程时会直接跳过这一章。与之配套的 Lab 4,Architecture Lab 则更是无人问津。我趁着考完期中的空闲时间,花了近一天时间啃了下第四章,并顺便做了个下这个 Architecture Lab。
Architecture Lab 的主要目标是修改一个 Y86-64
汇编程序写就的函数 ncopy
以及我们使用的流水线 CPU 的 HCL 代码,使之在我们的 Y86-64
处理器上的效率尽量高(CPE(Clocks Per Element) 尽量小)。在这个任务之前,有两个小的任务来帮助我们熟悉相关的操作。
实验前的准备
我们需要一个能用的 Linux 操作系统(笔者使用的是 elementaryOS )。首先我们需要下载最新的实验材料:
1 | $ wget http://csapp.cs.cmu.edu/im/labs/archlab.tar |
之后对其解压:
1 | $ tar xvf archlab-handout.tar |
因为本套件依赖 Tcl/tk,我们需要安装这两个软件:
1 | sudo apt install tcl tcl-dev tk tk-dev |
因为 Makefile 里写的 tcl 的版本已经比较老了,我们需要修改一下 Makefile:
1 | $ sed -i "s/tcl8.5/tcl8.6/g" Makefile |
之后即可正常编译套件了。执行编译:
1 | $ cd sim |
Part A - 编写 Y86-64 汇编程序
在这里我们需要做的是将 sim/misc
下的 example.c
内含的三个函数改写成汇编版本的。直接以书上的图 4-7 为样本照猫画虎即可:
1 | # sum_list.ys by name1e5s |
写完第一个之后我们就可以使用如下指令进行测试辣:
1 | $ ./yas sum.ys |
输出结果在 %rax
内,直接进行比对即可。
与之类似的,我们可以写出剩下两个函数的 Y86-64 版本:
1 | # rsum.ys by name1e5s |
1 | # cblock.ys by name1e5s |
Part B - 添加 iaddq 指令
直接按照 iaddq 的属性在 sim/seq/seq-full.hcl
中特定的位置添加 “IIADDQ” 即可,在此按下不表。
在添加完后,需要对其进行测试,执行如下指令:
1 | $ make VERSION=full |
如果没有问题,会返回如下结果:
1 | All 756 ISA Checks Succeed. |
Part C - 优化函数
这里我们要做的就是修改 sim/pipe/pipe-full.hcl
以及 ‘sim/pipe/ncopy.ys’ 的内容。使我们的程序运行效率尽量高。在为 pipe-full.hcl
实现完 iaddq
之后。我们就可以分别使用如下指令测试我们的代码:
1 | $ ./correctness.pl #结果是否正确 |
笔者的答案如下:
1 | #/* $begin ncopy-ys */ |
笔者仅仅使用了两个最基础的优化策略:循环展开和提前为下一个步骤读取内存。这样就可以更好的利用 CPU 的流水线特性。笔者最终的得分是 48.6 分,中规中矩吧(但在网上有关新版 Architecture lab 的博文中也是最高的了(逃 )。如果能为小的样例特殊优化下的话,结果应该能更好。
如果要继续优化的话,尝试修改下 CPU 的流水线策略也许是一个不错的选择。
评论