编译

不安装图形界面: 修改sim/Makefile,把前三行非注释部分用#注释掉,变成

# GUIMODE ...
# TKLIB ...
# TKINC ...

保存后运行 make

图形界面

安装Tcl/Tk库

  • Redhat 9: 可以在Redhat菜单->System Settings->Add/Remove Applications中添加X Software Development,根据提示载入相关镜像文件。 然后在 sim 目录下运行 make

  • Arch Linux: 有包管理机制的发行版直接用相关软件安装(比如 Arch 中 pacman -S tcl tk),注意安装好以后生成的动态链接库可能带有版本号(比如 libtcl8.5.so libtk8.5.so)

具体版本号通过 pacman -Ql tcl tk | grep '.so' 查得

接着只要修改Makefile中的TKLIBS参数,或者用ln建个链接即可

  • Ubuntu 由于ubuntu默认没有lex词法分析工具,在编译时需要先安装flex:sudo apt-get install flex

图形界面和Arch类似 sudo apt-get install tcl8.5-dev tk8.5-dev tcl8.5 tk8.5

然后修改 Makefile

  ltcl->ltcl8.5
  ltk->ltk8.5
  /usr/local/lib/.. -> /usr/lib/..
  /usr/local/include/ -> /usr/lib/tcl8.5/include/

Part A

用y86写三个小程序,基本上仿照seq/asum.ys写就行了。装了图形界面的模拟器的话调试起来也很方便。

相关命令(假设在seq目录下):

  • 编译 make asum.yo
  • 运行 ../misc/yis asum.yo
  • 调试 ./ssim -g asum.yo

Part B

同样不需要花多少力气,把Homework 16的答案写成HCL语言就行,可以参照opl, irmovl, popl这三个指令的写法。

通过ICS主页上的Lab4.pdf中的几个测试命令即可。

Part C

通过修改HCL和y86代码优化程序,最麻烦的一块。

在pipe目录下运行./benchmark.pl -f ncopy.ys,这个脚本就会自动运行一系列测试程序并计时,最后一行显示了平均所需的时间。

优化方法很多,系版的精华区的讨论帖里就有不少。

另外可以看看pipe/README这个文件,里面也说了几种方法。

最简单的就是实现iaddl指令,用它替换部分语句缩短时间;还有一个比较重要的就是loop unrolling,所谓loop unrolling就是把一个循环中的语句合并,减少循环次数。 用C语言简单的举一个例子。

for (int i = 0; i < 10; i++)
    dst[i] = src[i];

把相邻两个循环合并起来,变成

for (int i = 0; i < 10; i += 2) {
    dst[i] = src[i];
    dst[i + 1] = src[i + 1];
}

这样增加i的值的语句就从原来的10个减少到了现在的5个。

另外这里还有一个潜在的好处,dst[i] = src[i] 在执行的时候有个Load/Use Data Hazards,会产生一个bubble,如果先读出src[i],再读出src[i+1],然后依次写入dst[i],dst[i+1],这样就可以消去这个bubble,从而为每个元素节约一个左右的时钟数。

测试方法:

先保证pipe-full.hcl中的iaddl语句的正确,make以后在ptest目录下运行 make SIM=../pipe/psim TFLAGS=-i TFLAGS=-i

之后在pipe目录下运行./correctness.pl -f ncopy.ys测试样例程序,通过以后再运行./benchmark.pl -f ncopy.ys就能看到这个程序的性能了。

其他一些补充

  1. correctness.pl这个脚本测试时报的错误可能会和实际不一致,比如Bad count和Incorrect copying貌似会混淆。

  2. unrolling的时候建议写个专门生成相关代码片段的脚本,否则改起来太麻烦了。