开学有一段时间了,没怎么写博客,希望今天开笔能保持下去。
总要说点什么吧,那就说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了。