硬件动态提高ILP

ILP与流水线的关系:ILP即指令级并行,两条或多条指令并行不悖,就要求他们之间不存在数据依赖,现代处理器中采用流水线技术,较高的ILP就能带来更多级的流水线阶段,流水线段数增加,那么CPI就会降低,整个系统的指令throughput变大。

所以ILP的提高很重要。

硬件动态提高ILP,这里有一个重要的算法:Tomasulo算法。在介绍算法之前,先把上面所提到的提高ILP所要求指令间数据依赖性的降低了解一下。

指令间的依赖关系有数据相关(真数据相关),名相关(反相关,输出相关)

真数据相关比较符合我们原有观念,上一条指令的结果要被下一条指令所用,亦即写后读,在程序中造成RAW冲突,这种冲突在顺序执行的程序里是经常出现的。在五段流水线中,一条指令的执行结果是在WB阶段得到的,一条指令的源操作数是在ID阶段获取的,通常使用旁路技术,将上条指令的执行结果通过一条线路传回ID阶段的硬件结果上,进而使得下条指令能够不用等到上条指令在WB阶段才获得结果。当然这也增加了处理器中硬件的复杂度,但是由于我们有Moore's Law的保证,工艺技术不断提高,同样的芯片面积可以集成更多的晶体管,不用白不用。

名相关,分为反相关和输出相关

反相关是针对上述的真相关来说的,因为,反相关与真相关的依赖顺序恰好相反,是读后写,WAR冲突,这种冲突只可能发生在乱序执行的流水线中,在静态流水线中一般不可能发生。

输出相关是指,顺序程序中上下两条指令的输出结果对应同一变量,可能造成修改无效,同样这种冲突WAW冲突一般也只发生在乱序执行的流水线中 

好,讨论完指令间的依赖,我们可以看到,要提高ILP确不是一件易事,尤其在现代处理器中的乱序执行,更使得问题变得复杂,IBM的工程师Tomasulo在上世纪60年代提出了一个以自己名字命名的算法用来解决上述三种在乱序执行程序中的数据依赖 

采用寄存器重命名技术和源操作数缓存技术 

renaming可消除WAR,WAW冲突:对应名相关,如上,名相关一般只发生在乱序执行的流水线中,在顺序程序中,后一条指令写结果若在前一条指令完成之前,WAR,读后写,若后一条指令写结果在前一条指令读之前,则读出一个脏数据,WAW,最后的变量结果应为后一条指令执行结果,若后一条指令提前完成,造成最后结果为前一条指令执行结果。

采用renaming,通常是将后一条指令要写的寄存器名进行替换,亦即后一条指令写的结果是计入其他寄存器的,后续指令也要对要使用的寄存器号进行修改,保持正确性,这是一种以空间换时间的思想,利用多余的寄存器来空分复用寄存器。

同样WAW也是这样,不同的是前一条指令写结果进一重命名的寄存器中,因为,后一条指令才会对寄存器造成真正的修改。 

源操作数缓存技术,尽可能早地缓存取得并缓存一个操作数,避免必须读操作数时才去寄存器中读取。 

Tomasulo算法中有个保留站,其中缓存了即将要发射的指令所需要的操作数,当发现操作数都已准备完毕,就可以执行该条指令,指令执行结果不是写入寄存器,而是保留站中,下一条指令若需要数据,同样根据保留站号来获得操作数,这一过程是在指令发射阶段renaming时进行的,只允许最后一个写操作更新寄存器

 

你可能感兴趣的:(算法,IBM)