深入理解缓存层次结构与虚拟内存
1. 非阻塞缓存
在传统的静态流水线中,一次只执行一个处理器访问的缓存是可以接受的。但对于能在同一周期执行多条内存访问指令的机器来说,这种方式会阻碍性能提升。一次只接受一个处理器请求的缓存被称为阻塞缓存,而现代缓存通常是非阻塞或无锁定的,能够同时处理多个命中和缺失情况。
非阻塞缓存之所以能实现这一点,是因为它可以看作是一个双面设备,其功能可分为两个控制器:一个处理传入请求,另一个处理缓存缺失。以无锁定的L1缓存为例,它必须在为处理器端的请求提供服务的同时,处理对下一级缓存的缺失情况。
当请求命中时,由一个控制器完成处理;若请求缺失,则交给第二个控制器管理。其目标是通过并发处理多个命中和缺失,避免处理器停顿。这种能力对于每个核心的L1和L2缓存,以及多线程核心中的L1缓存和芯片多处理器中的共享L2缓存都是必需的。
当处理缺失的控制器得知有新的缺失时,它会分配一个缓存行,并选择一个块进行替换,该块可能会通过写回缓冲区写回。同时,控制器必须记录待处理的缺失,这通过缺失状态处理寄存器(MSHRs)来完成。每个待处理的缺失都会分配一个MSHR,其中可能包含块地址、分配给它的缓存行以及加载的目标寄存器等信息。
非阻塞缓存比阻塞缓存会经历更多的缺失。由于非阻塞缓存即使在对某个块的缺失正在处理时,仍会继续接受对该块的访问,因此可能会有许多访问在该块的缺失已经在缓存中待处理时发生缺失。第一次缺失称为主缺失,会分配一个MSHR,并向较低的内存级别发送缺失请求。在现代以千兆赫兹时钟运行的处理器中,返回缺失的块可能需要20到200个时钟周期。在此期间,由于访问的局部性,很可能会有更多对该缺失块的访问。当非阻塞缓存收到对一个缺失正在待
超级会员免费看
订阅专栏 解锁全文
2954

被折叠的 条评论
为什么被折叠?



