当前位置:网站首页>超标量处理器设计 姚永斌 第2章 Cache --2.3 小节摘录

超标量处理器设计 姚永斌 第2章 Cache --2.3 小节摘录

2022-06-11 21:42:00 岐岇

2.3 多端口Cache

在超标量处理器中,为了提高性能,处理器需要能够在每周期同时执行多条load/store指令,这需要一个多端口的D-Cache,以便支持多条load/stroe指令的同时访问。

其实在超标量处理器中,有很多重要部件都是多端口结构的,比如寄存器堆register file、发射队列issue queue和重排序缓存ROB等。由于这些部件本身容量不是很大,所以即使采用多端口结构,也不会对芯片的面积和速度产生太大的影响,但是D-Cache不同,它的容量本身就很大,如果采用多端口设计,会有很大负面影响,因此需要采用一些办法来解决这个问题,本节重点介绍True Multi-port、Multi Cache Copies和Multi-banking。

2.3.1 True Multi-port

虽然在现实中,不可能对Cache直接采用多端口设计,但是本节还是看一下这种最原始的方法究竟有何缺点,这种方法使用一个多端口的SRAM来实现多端口的Cache,以一个双端口的Cache为例,所有在Cache中的控制通路和数据通路都需要进行复制,这表示它有两套地址解码器address decoder,使两个端口可以同时寻址Tag SRAM和Data SRAM;有两个多路选择器way mux,用来读取两个端口的数据;比较器的数量也需要增加一倍,用来判断两个端口的命中情况:同时还需要有两个对其器aligner等。Tag SRAM和Data SRAM本身并不需要复制一份,但是它们当中的每个Cell都需要都是支持两个并行的读取操作,但是不需要两个写端口,因为无法对一个SRAM Cell同时写两次。

此种方法需要将很多电路进行复制,因此增大了面积,且SRAM Cell需要驱动多个读端口,因此需要更长的访问时间,功耗也随之增大,所以一般不会直接采用这种方式来设计多端口Cache。

2.3.2 Multiple Cache Copies

将Tag SRAM和Data SRAM进行了复制,与2.3.1节类似,不过是将Cache进行复制,SRAM将不再需要使用多端口的结构,这样可以基本上消除对处理器周期时间的影响。但是,这种方法浪费了很多面积,而且需要保持两个Cache间的同步。例如store指令需要同时写到两个Cache中,当一个Cache line被替换,也需要对另一个Cache进行同样的操作,此设计显然非常麻烦,不是一个很优化的方法,在现代处理器中很少被使用。

2.3.3 Multi-banking

此结构是在现实当中的处理器被广泛使用的方法,它将Cache分为很多小个bank,每个bank都只有一个端口,如果在一个周期之内,Cache的多个端口上的访问地址位于不同的bank之中,那样就不会引起任何问题,只有当两个或多个端口的地址位于同一个bank之中时,才会引起bank conflict。

 使用这种方法,一个双端口的Cache仍旧需要两个地址解码器、两个多路选择器、两套比较器和两个对齐器,而Data SRAM此时不需要多端口结构了,这样就提高了速度,并在一定程度上减少了面积。但是由于需要判断Cache的每个端口是否命中,所以对于Tag SRAM来说,仍旧需要提供多个端口同时读取的功能,也就是采用多端口SRAM来实现。

影响这种多端口Cache性能的一个关键因素就是bank冲突,可以采用更多的bank来缓解这个问题,使bank冲突发生的概率尽可能降低,并且还可以提高bank的利用效率,避免有用的数据都集中在一个bank的情况发生,同时,由于每个端口都会访问所有bank,这需要更多的布线资源,有可能对版图设计造成一定的影响。

2.3.4 真实的例子AMD Opteron的多端口Cache

AMD的Opteron系列处理器是64位处理器,但是考虑到现实的需求,处理器的地址并没有使用64位,它的虚拟地址virtual address是48位,物理地址physical address是40位,采用简化地址从而减少硅片面积。

Opteron处理器的D-Cache是双端口的,每个端口都是64位的位宽,双端口以为这这个Cache能够在一个周期内支持=两条load/store指令同时进行访问,它使用了multi-banking的机制来实现这个多端口的功能。

在AMD Opteron处理器的这个Cache中,data block的大小是64字节,需要6位地址进行寻址,每个data block被封为8个独立的bank,每个bank都是64位的单端口SRAM。

整个Cache的大小是64KB,采用2-way组相连,因此每一路的大小是32KB;使用Virtually-index,physically-tag的实现方式,直接使用VA虚拟地址来寻址Cache。因为每一路是32KB大小,因此需要15位地址寻址,又因为每个data block大小是64字节,因此寻址其中的每个字节需要使用VA[5:0],剩下的VA[14:6]用来寻找每个Cache set。

由于每个Cache line中的data block被划分为8个bank,每个bank是8字节宽的SRAM,所以很自然地使用VA[5:3]来找到某个bank,剩下的VA[2:0]用来从8字节中数据中找到某个字节,这种方式将两个连续的8字节数据放到两个相邻的不同的bank中,利用空间局部性原理,使得对这两个8字节数据访问落在不同的bank中。

由于Cache的每个端口在访问时候,都会同时访问两个way中的数据,然后根据Tag的比较结果来从两个way中选择命中的那个,所以Cache的一个端口在访问的时候,会同时访问到两个bank,每个way各一个。

在支持虚拟存储器的处理器中,最常见的页面大小page为4KB,这需要VA[11:0]来寻找页面内部,因此对于48位的虚拟地址来说,剩下的VA[47:12]就作为VPN(Virtual Page Number)来寻址TLB,得到物理地址中PFN(Physical Frame Number)[39:12],它用来和Tag部分进行比较,判断是否命中。

对于一个2-way组相连的Cache来说,相比于单端口的实现方式,两个端口的实现方式所需要的控制逻辑电路基本上扩大了一倍,需要两个TLB、两个Tag比较器,还需要两倍Tag存储器,Opteron处理器采用将Tag SRAM复制一份来实现双端口的SRAM,当然也可以采用真实的双端口SRAM来实现这个功能,面积也不会减少多少,速度还会变慢。

除了Cache中存储数据的Data SRAM没有被复制之外,其他的电路基本上被复制一份,因此采用multi-banking方式来实现双端口的Cache,面积会增大很度,但是它的好处是速度比较快,对处理器的周期时间有比较小的负面影响。

原网站

版权声明
本文为[岐岇]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_47955824/article/details/125168837