记一下 partC 能改的几个小地方
- 把
ret
改成jmp $0x31
,也就是跳回到主程序的地方(因为不能halt),但是这样可以消除掉三个ret
产生的气泡 - 修改
hcl
文件的最基础的方法是把mrmovq
和rmmovq
之间的气泡通过传送消除掉,具体而言是传送到e_val
里面,同时修改pipeline
的F_stale
,D_stale
,E_bubble
,取消掉这时候的气泡 - 一种修改
iaddq
的方法是,当iaddq
的值val
为类似于0x8394
这种看上去用不到的很随机的时候,我们定义它的效果是if M[rB]>0 : rax = rax + 1
,注意到后面这部分是可以在hcl
中实现的。- 能否继续进一步卡进去?
- 如果合理一点的话,可以全程不用
iaddq
的寄存器加立即数的方法,这样看上去不是取巧而是很合理。
- 常规的方法例如循环展开和三叉跳转。
- 一种实现跳转表的取巧方法是利用
pushq
和ret
,将要跳转的地址存放在栈中,再通过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 的实现