Computer Archiecture 3rd Edition 读书笔记(1)-Tomasulo算法
2007-11-28 18:54:57
版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://wenbodai.blog.51cto.com/267289/52629 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1.书中P121提到Tomasulo算法对记分板技术做了较大的改进,可以较好消除W-W冲突和R-W冲突。那么这些技术是什么呢?答案:是寄存器重命名(依赖于保留站)、W-W冲突时只允许后面的那条指令执行写操作。那具体是如何实现的? 2.P123 “通过有效地址的计算,读数和写数都得以保留源程序的执行顺序,从而避免了访问内存的冲突” 在P129有较详细的讲解,可是没看懂……(待解决) 为了解释如何消除W-W冲突和R-W冲突造成的停顿,结合P127的图3.5,考虑如下代码段: ( 图3.5中有错误: “动作或记录工作”列 第14行: RS[r].Qk ← RegisterStat[rs].Qi 应为 RS[r].Qk ← RegisterStat[rt].Qi “动作或记录工作”列 倒数第6行: RS[x].Qi ← 0 应为 RS[x].Qj ← 0 这些应该是印刷错误吧,工艺啊…… ) (1) DIV.D F2, F1, F3 (2) ADD.D F5, F2, F4 (3) MUL.D F6, F3, F2 (4) ADD.D F2, F1, F4 (1)与(2)、(1)与(3)之间存在W-R冲突,为真数据相关。 (1)与(4)之间存在存在W-W冲突,为输出相关。 (2)与(4)、(3)与(4)之间存在W-R冲突,为反相关。 让我们来看看Tomasulo算法是如何解决这些冲突的: ◆ (1)发射之后的寄存器状态表:
◆ (2)、(3)发射之后的保留站表:
else RS[r].Vj←Regs[rs], RS[r].Qj←0) ◆ (4)发射之后的寄存器状态表:
而在写结果时有:∨x(if(RegisterStat[x].Qi = r) {Regs[x]←result; RegisterStat[x].Qi←0}); 由此使得W-W冲突时只有后面那条指令执行了写操作,解决了W-W冲突。 这时你可能要问了,如果(4)先于(1)完成,对F2写入了值,此时(2)、(3)还未执行,它们执行时读到的F2是否是正确值呢?注意一下(2)、(3)发射后保留站表中的Qi、Qk项,然后继续往下看,看看Tomaluso是如何实现寄存器重命名的。) ◆ (4)执行完成、写回结果后,寄存器状态表:
故此时F2中的值已经为(4)的结果,是正确的) ◆ (1)执行完成、写回结果后(其实(1)的结果并未写回,因为此时RegiterStat[F2].Qi = 0),保留站表:
由此(2)、(3)虽然在(4)写回结果后才读到操作数,但读到的操作数是从保留站MUL1中通过CDB得到的,而不是从F2中去读,这就是寄存器重命名啦,也解决了R-W冲突) 本文出自 “Wenbo_Dai's_Tech_Blog” 博客,请务必保留此出处http://wenbodai.blog.51cto.com/267289/52629 本文出自 51CTO.COM技术博客 |


WenboDai
博客统计信息
热门文章
最新评论
友情链接