在网上找tomasulo算法和记分牌算法,发现基本只有一个哥们的文档,在所有的网页间转载粘贴。不过我发现现在书上已经没有多少介绍记分牌算法了。所以就详细研究下这两个算法。
参考了网页资料:
http://wenku.baidu.com/view/65206e8fbceb19e8b9f6ba05.html
1、指令级并行的相关性
1.1、对于指令的相关性:
- 结构相关是无法实际解决的,因为处理器已经造好了;
- 控制相关是通过分支预测解决的,控制相关包括:分支指令、函数调用;
- 数据相关其实本质是对寄存器的读写操作先后顺序造成的相关。对于此类相关,就有记分牌算法和tomasulo算法来解决。
进一步分析,数据相关分为:RAW、RAR、WAR、WAW这四类,其中的RAR不是真正的数据相关,因此寄存器不会因为读而改变。真正需要处理的是RAW以及WAW和WAR这三种。在顺序执行的指令流水线中,WAR和WAW是不会出现问题的,因为指令顺序指令,后面的W不会覆盖前面的R或者W;但是对于乱序执行就不一样了,需要有算法解决;而对于RAW,道理也一样。
2、记分牌算法
2.1、记分牌算法核心思想
记分牌算法的实现核心是系统中存在有一个“记分牌”,这个记分牌记录了运算部件和寄存器的数据相关性,即如果运算部件需要的寄存器数据准备好,就可以执行,执行完之后,释放寄存器。在这种情况下,就可以实现指令的乱序执行。
2.2、记分牌算法执行四个过程:
- 过程1:指令流出阶段,检测结构相关——如果当前功能部件空闲、并且没有其他指令使用相同的目的寄存器,则记分牌把指令发射到该功能部件,如果存在结构相关或WAW相关,则停止发射,等待;(这个阶段仅观察目的寄存器,不管源寄存器)
- 过程2:读操作数阶段——如果之前的指令已经完成对源操作数寄存器的写,则记分牌允许指令读取源操作数,可以执行;(这个阶段处理源寄存器,解决RAW相关,这样指令就可以乱序执行了);
- 过程3:执行——部件执行指令,并在执行完毕后通知记分牌;
- 过程4:写回——这个时候检测是否出现WAR相关,即是否有前面的指令要读目的寄存器,如果没有WAR相关,则写回;如果有,则暂停该指令写回过程。