分支预测,GS464E采用的是分支目标缓冲+动态分支预测器+返回地址堆栈+间接目标缓冲的组合,涵盖了非条件分支,条件分支,调用返回,间接分支几乎所有分支指令类型。LA464应该沿用了这款组合,但规模可能比GS464E要更大一些。
具体分开来分析,GS464E的分支目标缓冲规模非常小,LA664应该会增大,但不知道会不会引入目前高端核心常见的多级BTB。
GS464E的动态分支预测器采用的是本地/全局复合预测器,本地应该是双模预测器,全局应该是按地址分set的两级自适应预测器,这套设计和推土机非常的类似,但推土机也证明了本地/全局复合预测器并不适用与多线程的环境,在多线程模式下,推土机的全局两级自适应预测器被2个线程互相干扰,几乎无法发挥正常的作用。牙膏厂在SNB重新引入SMT后,为避免线程间干扰,配备了2套动态分支预测器,分别为2个线程所使用,当然这个方案非常蠢,浪费了面积和功耗,所以在Haswell就换成了变种的TAGE。农企在ZEN上使用的是所谓的神经网络预测器,其在分类上属于本地预测器,所以并不受多线程影响,但预热非常的慢,到了ZEN2,为了解决神经网络预测器的问题,在其后又加一套TAGE,后来农企也发现这么做非常的蠢,到了ZEN3去掉了神经网络预测器,直接使用TAGE。这两家在面对SMT对分支预测造成的影响时,兜兜转转最后殊途同归,都采用了TAGE或者类TAGE的分支预测器。龙芯在上SMT时应该会参考这两家的教训,估计LA664会直接一步到位采用TAGE作为动态分支预测器。
返回地址堆栈没什么好讲的,加规模就是了。间接目标缓冲,记得龙芯之前讲到过,二进制翻译缺少对间接跳转的支持,估计龙芯会类似具有二级地址翻译的TLB一样,搞出个具备二级地址预测的间接目标缓冲,具体怎么搞我也不知道,只不过理论上TLB能X86虚地址-LA虚地址-实地址这么映射,间接目标缓冲应该也能这么映射,大不了翻译模式下损失一半的容量,总比没有要强,兆芯你说是不是。