多核体系结构的性能正越来越多的受到存储速率和片外带宽的限制,多级高速缓存设计作为提升处理器性能的手段被广泛应用在芯片架构中。
01
—
Cache的历史
286时代及以前,CPU和内存速度都很慢,CPU可以直接访问内存。
386开始,处理器增加了流水线功能,因此引入写直达策略的小容量主板缓存以实现更快的数据访问。
486将集成浮点运算单元(FPU)从协处理器集成到芯片上,由于CPU计算和内存数据存取速度差异不断增大,Intel添加了8KB的L1片上缓存,将原有的主板缓存变更为L2级缓存且容量扩大至256KB。
Pentium时代,处理器增加了指令级乱序执行和动态分支预测等功能,由于复杂指令和数据的存取差距,L1缓存被分为L1数据缓存和L1指令缓存两部分。同时随着工艺的提升CPU主频和主板总线频率差距也不断拉大,L2 cache从主板移到片上,极大的提高了通信速度。
Core双核处理器首次将L2设为多核共享模式。AMD也在K6架构中首次加入了主板级的L3缓存。
现在,CPU已经将三级缓存全部集成到CPU芯片上,也有了片外L4 eDRAM缓存。多核cache通常为每个核配有独享的L1L2缓存,L3为多级共享。由于L3容量较大,会包含多个bank,每个处理器访问近端bank时延时相对较小,访问远端bank时延时较大。
Fig.1 多级存储子系统
02
—
Cache的基本结构
如图所示,cache可以与表格进行类比,其中多个行被称为组(set),多个列被称为路(way),一个缓存行(cache line)中的缓存块(cache block)会被同时读取。高速缓存的大小也就等于组数x路数x缓存块大小。
Fig.2 Cache的基本结构
存取数据时,首先根据索引地址找到对应组(set),根据标签(tag)逐一比对找到对应缓存行,判断有效位匹配后根据块偏移地址进行写入或读出。
Fig.3 定位缓存中数据块的地址
03
—
多核体系结构中的Cache
集中式高速缓存 United Cache
早期的多核设计依赖于集中式高速缓存,即所有的bank直接连接到所有的处理器核上。交叉开关通过总线将每个处理器核与所有高速缓存的bank相连,这样可以允许每个核同时访问所有bank,但当多个核同时访问一个bank时会产生冲突,因此每个交叉开关需要配套的决策,缓存和中断电路。
Fig.4 集中式高速缓存结构
显然,将高速缓存划分为更小的bank或增加处理器核数量可以降低访问延迟,但随之交叉开关的复杂度和面积也会急速上升,因此这种架构整体上限制了高速缓存的可扩展性。
分布式高速缓存
当每个处理器核与每个cache分别连接过于复杂的时候,很自然的简化方法是将他们一一对应,即每个处理器核只与一个固定的高速缓存块直接相连。随后通过互联网络将这些缓存块连接起来,使用路由(Router)进行通信。
互联网络的方式取决于挂在网络上的处理器核数量,较少时可以使用环形网络,较多时一般使用mesh网络。
Fig.5 分布式高速缓存结构
混合式高速缓存
实际的芯片中,很多缓存系统并非由单一的集中或分布式组成,而是多种混用,例如常见的分布式L2 Cache+集中式L3 Cache,或一个cluster中嵌入多个核的集中式L2 Cache+多个cluster的分布式L2 Cache。
Fig.6 混合式高速缓存结构
一般多核体系结构会允许核共享最后一级高速缓存,这样可以避免高速缓存的容量碎片,且某些核处于休眠状态时,不会影响其他活跃核的正常工作。
合理设计缓存方式和大小对减小总访问延迟(包括访问数据和路由延迟)至关重要。如下图所示,处理器核数固定时,一条曲线为访问一个集中式高速缓存所需的时间,一条为互联网络上请求和响应所需的时间,高速缓存大小存在一个最优解可以使整体访问延迟最小。
Fig.7 共享缓存大小与延迟曲线
04
—
结语
以上,我们讨论了高速缓存体系的历史及其基础结构,并介绍了多核体系中的高速缓存设计,实际上我们这里所指的缓存是狭义的L1L2L3,更多的如TLB,便笺式存储器等并未算在其中。
另,以上均为cache中的物理组成,即硬件划分和实现,与在系统级看到的逻辑组成不一定相一致,(逻辑组成涉及到的虚拟存储和片相连映射又是另一个话题了),注意区分避免歧义。
撰文 | Tinsika
编辑 | Tinsika