MIPS R10000 文献综述

论文地址:https://ieeexplore.ieee.org/document/491460

MIPS R10000 是动态超标量RISC处理器,是为克服性能限制(存储带宽和时延)而设计的,它在每个时钟周期可以取值和编码4条指令,并且能够动态的将他们发送到5级完全流水、低时延的时钟单元中。它拥有4项分支栈,可以在分支之前预测式的执行。采用动态乱序执行技术,尽管指令的执行是无序的,但是指令是按顺序逐步完成的,处理器能提供连续的内存一致性和精确的异常处理。它采用层次化的,非阻塞式的存储子系统,能够通过两级组相连写回式高速缓存隐藏存储时延,同时使用映射表完成寄存器重命名。下面将针对几个重要功能实现及逻辑展开论述:

指令编/解码

处理器每个时钟周期取4条指令,使用16字高速缓存行的任意对齐方式下并行取指令-通过修改高速缓存的读出放大器实现。在第二阶段,处理器并行解码映射4条指令,并在第三阶段将指令写入适当的队列。每个周期解码4条指令,因此需要4个独立的解码器,除乘法和除法指令外的其他指令一般不需要超过一个结果的寄存器。结构冒险或者特殊指令引起的未及时解码的指令仍要留在8字指令缓存中。

Branch Unit(分支单元)

分支指令发生频率较高,并且需要快速执行。因此处理器预测一个条件分支的方向,并沿着预测的路径推测式的取指令,这种预测使用一个基于512项分支历史表(BHT-Branch History table)的2位算法。当程序执行需要跳转或者分支时,引入一个“分支气泡”周期,在这个周期中R10K不解码任何指令。

当解码一个分支时,处理器通过4目分支栈来保存它的状态,它会替换分支地址同时备份整形和浮点寄存器映射表。如果分支预测不正确,处理器会立刻停止所有沿着错误路径获取的指令,并从分支栈当中恢复它的状态。每条指令对应的4位分指标记用于表明待处理非分支是否预测正确等信息。

为什么要引入分支气泡周期:

该处理器没有重定向指令获取,直到在第二个流水线级(解码)中检测到分支,因此即使具有正确的预测,所采用的分支也引入了一个循环气泡。在某些周期之后可能无法确定不正确的预测,因为执行在第四个流水线阶段开始,并且指令是无序执行的。(错误预测的已采用分支可能会解码已采取的分支气泡中已获取的指令,因为这些指令存储在“恢复缓存”中。)流水线中,分支指令执行时因为确定下一条指令的目标地址(紧随其后 or 跳转目标处?)一般要到第 2 级以后,在目标确定前流水线的取指级是不能工作的,即整个流水线就“浪费”(阻塞)了一个时间片,为了利用这个时间片,在体系结构的层面上规定跳转指令后面的一个时间片为分支延迟槽(branch delay slot)。位于分支延迟槽中的指令总是被执行,与分支发生与否没有关系。这样就有效利用了一个时间片,消除了流水线的一个“气泡”。

寄存器映射

逻辑寄存器中的值可能是不确定的操作值,物理寄存器中的值总是确定的值。处理器使用5位指令位域选择逻辑寄存器同时在相应的寄存器堆中通过6位地址来识别物理寄存器。可消除WAR和WAW冒险,同时能支持推测中断和精确中断。

寄存器映射表:整型表在一个33*6位的多路RAM中实现对r1-r31、Hi和Lo的映射,浮点表在32*6位的多路RAM中实现对f0-f31的映射。空闲列表中包含了当前未分配的物理寄存器列表,包含4路并行的8位长(共32位)循环FIFO列表。活动列表也包含一个4路并行的8位长(共32位)循环FIFO列表,所有的“in flight”的指令都包含在这个FIFO列表中,每个指令都通过唯一的5位标志与活动列表的地址比较来确认。当执行单元完成一条指令时,会将指令标志送入活动列表并标记完成位。活动列表包含了逻辑目的寄存器编号和每一条指令旧的物理寄存器编号。忙位表标记为忙时,表示寄存器正在被写入。R10k每个周期以相反的顺序取消映射四条指令,以防重命名相同的逻辑寄存器两次。

队列

指令队列的设计受时钟周期的约束。处理器会根据类型将每条除了跳转和无操作数指令的已经解码的指令放入整型队列,浮点队列和地址队列中的一个。整形队列包含不定序的16个条目,为了解决RAW冲突,每个条目都包含一个6位比较码。浮点队列同整型队列类似,但浮点队列不包含立即数值,负载有三个周期的延迟。整型队列实现了两个周期的加载延迟,当加载指令读数据缓存时,相关指令必须在执行的前一周期发出。地址队列也包含16个条目,不同于其他两个队列,地址队列保存了指令的原始顺序。地址队列使用指令顺序来时决定内存依赖,最早的指令可以获得优先权。同时队列创建了一个加载指令的软件异常,当外部接口使用加载寄存器,但是加载指令提交之前的缓冲行无效时,这个异常会清空流水线,清空装载和其他后续指令。

寄存器堆

整点寄存器堆包含64个物理寄存器,7个读端口和3个写端口,有单独的64字×1位条件字判断对饮的物理寄存器的值是非零的。浮点寄存器堆也有64个物理寄存器,但只包含5个读端口,有3个写端口。

执行单元

执行单元

时延(周期)

重复率(周期)

指令

所有的ALU

1

1

add,sub,logical,trap

ALU1

1

1

branch

ALU2

10

10

64-bit multiply

ALU2

67

67

64-bit divide

Load/Store

2

1

load integer

Add

2

1

add,sub,compare

Multiply

2

1

DP multiply

Divide

19

21

DP divide

Load/store

3

1

load FP value

存储层次结构

内存延迟对处理器性能影响极大,R10K的主要指令和数据高速缓存能够在低延迟带宽下同时工作。

load/store单元:R10k将虚拟寄存器地址计算为两个64位寄存器的总和或寄存器与16位立即数字段的总和。TLB将虚拟地址转化为物理地址。TLB定义了64位寻址,64个条目中每个条目映射一组虚拟页。

指令cache:一个32位的指令缓存包含了8192个指令字,这些指令不需要在四字地址上对其但是不能跨越一个16字(128B)的缓存行。数据cache:为了增加带宽使用使用了两个16kb大小的bank,设置了8个字的行大小,这样可以使得二级缓存的带宽能够支持三到四个重叠填充。处理器将每个bank的标签和数据队列独立分配,实现非阻塞式响应以下四个请求流水线:外部接口,地址计算标志检查,cache重装和提交存储指令。二级缓存使用128b宽的接口,使用外部同步静态RAM来实现512KB-16MB,二路组相连的二级缓存(R10K使用标准同步SRAM和一个额外的地址引脚实现了双向虚拟组相连二级缓存)。

 

 

综上,MIPS R10K通过将取指令和解码阶段从执行阶段中分离出来实现了动态调度,充分利用了处理器的五个执行单元,而无阻塞cache使处理器在等待数据输入时仍保持激活状态,大大提高了代码的执行效率。通过推测执行,如果做出错误预测,可以在一个时钟周期内使处理器复位,这允许处理器处于正常待用状态时继续工作,大大提高了代码执行的速度。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值