经 yyh 提醒,加了一条优化,在一些测试点上有很大提升(final2)。
本来没打算写的,一是因为最近太忙了,二是因为这个东西太玄学了,很多地方都在吊打我的常识。开始做的时候已经是提交当天下午了(当时还没有延期的通知),所以前面没做好数据记录。
拿到代码以后我首先试了很多种平凡的改法,比如 PC xor ghr 改为 (PC << 2) xor ghr 之类的,改进不大,大多数情况下都要比基本的 gshare 劣。
然后实现了一个仅用局部历史的预测器,测量几组数据发现比 gshare 优秀。嗯,很好。然后我又写了个预测器来选择是采纳局部信息的预测器还是全局信息的预测器,效果出乎意料的好。
本来故事到这里一帆风顺,当时单纯的我还有点疑惑为什么大家都花那么多时间来做这个作业——直到我发现我的基于局部历史的预测器有一个bug:我想写的是把 PC 和局部历史信息拼接起来作为地址去查表,但我写成了 (PC << 8) ^ lhr,其中 lhr 不止 8 位。这个东西看起来就没有什么道理,于是我顺手把这个 bug 改掉了,再一跑结果差的难以想象。好吧,那就像 gshare 一样改成 PC ^ lhr 呗,结果还是差,就是要左移八位再异或才是最优的。
这有什么道理?
后面还发生了很多很多的类似的情况,我完全解释不通为什么这么改会更好,事情已经朝着我无法控制的方向发展了。
后面的一个多小时我做的东西就是:随机改动某几个参数/某个地方的写法,在测试集上跑,根据结果的变化反过来再来改参数。这不就是在测试集上人肉梯度下降么?认识到这一点的时候我就一点往下优化的欲望都没了。
那就这样吧,最后放一个表:
LONG-1 | LONG-2 | LONG-3 | LONG-4 | SHORT-1 | SHORT-2 | SHORT-3 | SHORT-4 | SHORT-24 | SHORT-25 | SHORT-27 | SHORT-28 | SHORT-30 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
gshare | 0.5772 | 1.3861 | 7.7871 | 0.0052 | 2.9176 | 11.3901 | 3.7208 | 5.1629 | 0.0005 | 0.0018 | 0.471 | 0.0074 | 7.0143 |
21bits | 0.1073 | 0.9139 | 6.7534 | 0.0066 | 0.6838 | 4.1696 | 3.3100 | 1.8959 | 0.0005 | 0.0018 | 0.0408 | 0.0074 | 1.3241 |
24bits | 0.0912 | 0.8466 | 6.8111 | 0.0073 | 0.6040 | 3.5591 | 3.2130 | 1.6789 | 0.0005 | 0.0018 | 0.0498 | 0.0075 | 1.0796 |
mixed | 0.1231 | 0.9547 | 6.9000 | 0.0053 | 0.8251 | 4.0981 | 3.2070 | 2.6527 | 0.0010 | 0.0023 | 0.2445 | 0.0110 | 1.4643 |
final | 0.0902 | 0.8460 | 6.8150 | 0.0073 | 0.6028 | 3.4396 | 3.2123 | 1.6686 | 0.0005 | 0.0018 | 0.0498 | 0.0075 | 1.0663 |
final2 | 0.0888 | 0.7670 | 6.6121 | 0.0065 | 1.1672 | 0.5602 | 2.3001 | 1.1348 | 0.0005 | 0.0018 | 0.1404 | 0.0083 | 0.2364 |