引言
“喂饱饥饿的CPU”,是计算机体系结构设计者时刻要考虑的问题。要解决这个问题,方法大体可分为两部分,第一就是利用principle of locality而引进的cache技术,缩短取指时间,第二就是采用各种转移预测技术,提高取指正确的概率。
只有cache,没有好的转移预测,取指时间再短,每次提前取的指令都是错的,不行。
只有转移预测,没有cache,即使每次取得指令都对,但是每次取指都需要很长时间,也不行。
所以,只有两部分通力合作,才能喂饱饥饿的ALU。
“吃的是草,挤出来的是奶”,赞颂的是牛的奉献精神,但是要想让牛奉献更多,没有足够的草也不行啊。
之前我们分析了or1200的cache和MMU模块,了解了如何缩短取指时间,本小节就来介绍一下or1200的IF(取指)模块。
1,转移预测
咱们都知道,cache的本质原理是局部性原理,但是上天是公平的,上帝在赐给程序具有局部性特性的同时,还赐给了局部性的克星,这就是分支指令(控制相关指令)。控制相关指令的转移地址是会破坏局部性的,如果一个程序中的分支指令很多,而又没有好的转移预测技术,那么在遇到转移指令之后,如果事先取的指令不是最终的跳转入口指令,那么就需要刷新整个流水线,这样,CPU的整体性能就会受到很大影响。所以,为了减少犯错几率,就需要研究各种转移预测技术。
大体来说,解决控制相关指令的方式可分为两个方面,软件,硬件。
软件解决控制相关的技术主要有循环展开,软流水,条件指令等。
循环展开的核心思想是将一个多级循环进行处理,首先将循环间相关变成循环内相关,然后通过编译器中的循环展开技术消除循环内相关,这其中会用到寄存器重命名技术(register rename)。
软流水的核心思想是将循环最小单元进行扩大,消除相关性。比如把一个100次的小循环,变成20次的大循环。软流水技术就相当于软件tomasulo算法。
关于tomasulo算法,请参考:http://en.wikipedia.org/wiki/Tomasulo_algorithm
条件指令的核心思想是在执行指令的同时判断转移条件,如果条件为真,则将指令加到流水线执行,如果条件为假,则空一个clock(相当于NOP指令)。
硬件转移预测技术主要有PHT(pattern history table),BTB(branch target buffer),BHT,tomasulo算法等。
PHT的核心思想是记录每次转移的方向(PC的低位偏移值),转移时根据前面的记录预测下次转移方向。
由于PHT记录所有的转移地址,不止是只记录跳转指令的跳转方向,而是记录所有的下一条指令的地址。这是一个方面,另外一个方面,PHT只记录转移方向,不记录转移目标。
为了解决这两个问题才引入了BTB,BTB首先要判断是否是转移指令,如果是才记录其转移方向和转移目标的地址。
上面两种方式只是记录某转移指令本身的历史,其实转移指令之间还有相关性,所以需要把所有转移指令的转移情况记录下来,存放这些转移指令历史的地方这就是BHR(branch history register),把BHR和PHT结合起来就既能考虑到某条指令的历史,也能考虑到转移指令之间的历史,这就是两级转移预测器。
BHR和PHT的组合有很多方式,其中gshare算法简单而高效,所以在现在很多CPU中使用。
虽然两级转移预测器的效率很高,但是仍然有一个问题,就是所有的转移指令使用同一个PHT,这就造成的分支别名干扰的问题,为了解决这个问题,人们想了很多办法,如Bi-Mode预测器和Agree预测器等。
后来,人们为了提高预测成功率,就把上面所有的预测方法进行组合,找出适合自己系统的预测器。
2,or1200的IF模块分析
1>整体介绍
上面我们介绍了很多分支预测技术,遗憾的是,