队伍介绍:报名编号:CICC3941 团队名称:
蜡笔小新
这是我们队伍的第2篇帖子
1.蜂鸟E203的原有分支预测
蜂鸟E203处理器为了能够连续不断的取指令,需要在每个时钟周期都能生成一条待取的指令。因此,在取指令的阶段,IFU单元模块进行了简单的译码处理,用以判别当前指令的类型是普通指令还是分支跳转指令。当译码信息指示当前指令为分支跳转指令时,则在一个周期内进行分支预测。
蜂鸟E203的分支预测十分简单,是常见的静态分支预测,通过简单译码得到的立即数的信息进行判断是否跳转。首先是跳转方向的预测:当通过简单译码后,指示当前指令为分支指令时(beq、 bne、blt、bltu、 bge 、bgeu),通过进一步判断立即数的符号位,进行跳转与不跳转的预测。即如果立即数为负数,则说明向后跳转,预测为跳转;反之如果立即数为正数,则说明要向前跳转,预测为不跳转。当位无条件跳转指令
JAL、JALR时预测跳转。
其次是跳转目标地址的预测:当预测为不跳转时,PC值顺序执行,即对于32位指令pc值加4,16位指令,pc值加2;当预测为跳转时,则需要根据不同分支跳转指令的目标地址计算方法进行计算。例如,JALR指令的跳转目标地址为指令中的16位立即数与指令中指定的寄存器中的值相加得到。16位立即数与寄存器地址均通过简单译码器得到。同时E203对于JALR指令目标地址的预测还专门对x0与x1寄存器进行了加速。即x0与x1寄存器的值不需要通过通用寄存器的读端口进行读取,而是直接从通用寄存器组中取出。
总之,蜂鸟E203使用较小的资源和面积实现的最简单的静态分支预测,这与其强调的低功耗和小面积的设计理念实相符的。
2.蜂鸟E203分支预测的改进
由于E203的分支预测是最简单的静态分支预测,其预测的命中率并不是很高,因此流水线常常需要因为冲刷而浪费很多周期,导致CPU的性能下降。因此,针对题目通过对E203微架构进行优化提升处理器性能的要求,我们想到了对其分支预测模块进行优化。将简单的静态分支预测改为动态分支预测。
动态分支预测是指依赖已经执行过的指令的历史信息和分支指令本身的信息进行综合的方向预测。最简单的分支方向动态预测器是一位饱和计数器。每次分支指令执行后,通过使用此计数器记录上次的方向。这种预测器结果简单,但预测精度不如两位饱和计数器。
两位饱和计数器是最常见的分支方向动态预测器,其对应的状态机转换图如下图所示:
可见共有四个状态,分别为强不需要跳转、弱不需要跳转、弱需要跳转与强需要跳转,当前状态为弱需要跳转与强需要跳转时,则预测进行跳转,否则不跳转。
两位饱和计数器对于预测一条分支指令很优秀,但当处理众多不同的分支指令时需要大量的计数器,占用太多资源,因此,不太现实。因此,常通过将有限个两位饱和计数器组织为一个表格,通过使用部分pc值进行索引。
3. 分支历史表技术---BHT(Branch
History Table): BHT中包含一系列的双模态预测器Bimodal Counter, 用他们来预测分支指令(branch)是否需要跳转(taken or not taken) 我们将有限个的两位饱和计数器组织成分支历史表,构成一个局部的历史分支预测器。通过部分pc值进行索引,将对应指令的跳转历史进行存储。以此跳转历史作为分支跳转的预测依据之一。
BHT中就是一系列的双模态预测器(BIM),由exu模块进行更新,更新过程如下:
1) 如果是分支指令,并且分支是taken, 则饱和计算器 +1;
2) 如果是分支指令,但是分支没有taken, 则饱和计算器 -1;
BHT的查找(预测)过程:直接采用当前PC的部分位定位BHT表项,如果该表项BIM大于等于2,则预测为跳转,否则预测为不跳转。