【ICS】archlab小记

记一下 partC 能改的几个小地方

  • ret 改成 jmp $0x31,也就是跳回到主程序的地方(因为不能halt),但是这样可以消除掉三个 ret 产生的气泡
  • 修改 hcl 文件的最基础的方法是把 mrmovqrmmovq 之间的气泡通过传送消除掉,具体而言是传送到 e_val 里面,同时修改 pipelineF_stale , D_stale , E_bubble ,取消掉这时候的气泡
  • 一种修改 iaddq 的方法是,当 iaddq 的值 val 为类似于 0x8394 这种看上去用不到的很随机的时候,我们定义它的效果是 if M[rB]>0 : rax = rax + 1 ,注意到后面这部分是可以在 hcl 中实现的。
    • 能否继续进一步卡进去?
    • 如果合理一点的话,可以全程不用 iaddq 的寄存器加立即数的方法,这样看上去不是取巧而是很合理。
  • 常规的方法例如循环展开和三叉跳转。
  • 一种实现跳转表的取巧方法是利用 pushqret ,将要跳转的地址存放在栈中,再通过ret的时候跳转回去。但这样有三个气泡,未曾实践,不知效果。但是是否能通过iaddq来实现这部分?
  • 如果使用朴素的三叉搜索,使用比较判断的时候根据分支预测的方法,顺序是比较重要的。

上面几个优化效果最大的应该是改iaddq的条件加法,舍友直接实现就能到5.0+。

如果只实现循环展开(9路)和三叉搜索,大概是7.50~7.60。

如果实现了iaddq的立即数加法,大概还是7.50+。

如果实现消除mrmovq和rmmovq的气泡,那么就能到7.4-。

另一个书上推荐改的hcl部分是分支预测,但据说难度略大。

然后听晗晗的话改了个jmp $0x31,直接到7.1+了。

至于3.0+的大佬那只能顶礼膜拜的。


另转树洞大牛关于 archlab GUI 的实现

https://pkuhelper.pku.edu.cn/hole/##4216428