【日常】ICS的lab7攻略和最近生活的吐槽
2013-10-25 20:27
337 查看
开学有一段时间了,没怎么写博客,希望今天开笔能保持下去。
总要说点什么吧,那就说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了。
总要说点什么吧,那就说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了。
相关文章推荐
- 设计模式
- 流行的一些技术术语
- 合并两个单链表练习,多项式合并
- mysql基于mysqlslap的压力测试
- 好累啊
- Linux shell脚本
- POJ 1144 - Network 用tarjan求无向图的割点
- iOS开发个人独立博客收集
- 练习1-20:请编写程序detab,将输入中的制表符替换成适当数目的空格,适空格充满到下一个制表符中止的地方。假设制表符终止位的位置是固定的,比如每隔n列就会出现一个制表符终止位。n应该作为变量还是符号常量呢?
- 文本切换器(TextSwitcher)的功能和用法
- vmware虚拟机工具vmware tools介绍及安装排错
- struts2 中chain、redirect、redirectaction的区别
- 如何在word中使代码高亮
- 静态类 内部 用法 作用
- nginx常用配置项位置参数宏说明
- Android控件拖动的实现
- Python 学习入门(0)—— 简明教程
- C语言冒泡排序
- 阿里云开发者大会
- poj 2074