【日常】ICS的lab7攻略和最近生活的吐槽

开学有一段时间了,没怎么写博客,希望今天开笔能保持下去。

总要说点什么吧,那就说ICS的lab7关于流水线的优化吧。

lab7真心是到目前为止做的最艰难的lab了,用的是CSAPP新版的pipeline,貌似修复了一下组合情况下的bug?网上几乎所有的攻略都是老版本的。

TA君没怎么自己做,设置了个7.8分为满分,然后同志们就前赴后继了。这个跨越了国庆长假的lab耗费了我大量的时间,不过没有对面的tcbbd多。

 

回到正题,关于这个lab的优化。

由于新版本的lab的测试数据是正负随机出现,所以仅仅修改jxx的预测是没有用的。

首先在添加了iaddl和leave指令后,再使用unrolling和jumptable的话大概能到8.4 吧,但似乎距离7.8太遥远了,QA上出现了一些喷TA的声音。

之后怎么办呢?ncopy.ys优化到极限了,就只能修改hcl了,借助于tcbbd的经验,我的hcl修改的时间不算太长。

 

1.优化ret,可以做到3个bubble减少到1个bubble,因为整个程序就用了一次ret,大概能提高0.2不到的样子。

 

2.优化mrmovl+rmmovl,利用一下模拟器的漏洞,实际上1个周期的5个阶段模拟器也是按顺序执行的,可以做到0 bubble 0 stall。

 

3.最关键的优化,优化了一个组合instruction

(1) andl

(2) mrmovl

(3) xxxx

(4) jle

(5) xxxx

 

原来的模拟器中的jxx的分支预测是否正确是在jxx的execute阶段根据cc计算cond来判断的。这样就要拖延到jxx的execute阶段,如果预测失败就损失了3个周期。

于是,采取修改mrmovl的ifun使得能够在mrmovl的execute阶段计算出jle的cond,然后再在jle的下一条指令的fetch阶段读取mrmovl的cond来选择判断是否跳or不跳。

这样改可以做到一半的jle 100%预测正确。当然,hcl并不是那么好改的,(3)必须不能修改cc这一个条件不要忘记排除,bubble和stall对这一组合要排除也不要忘记,这些都是非常不好写的。

这样我做到7.7就懒得做下去了,利用这个思路可以优化全部的jxx可以做到7.2甚至更低。

 

正事说完啦,吐槽下最近驾照大路考挂了T^T,不爽,事情好多,大牛好多。我要去写lab8了。

 

 

 

posted @ 2013-10-25 20:27  Azard  阅读(1796)  评论(1编辑  收藏  举报