L1,L2,L3 Cache究竟在哪里?

L1,L2,L3 Cache究竟在哪里?

很多人有个疑问,为什么Intel系列CPU在2005年后可以力压AMD十多年?优秀的Cache设计和卓越的微架构是主要的原因。大多数高层程序员认为 Cache 是透明的,CPU可以很聪明地安排他们书写的程序,不需要关心数据是在内存中还是在Cache里。 他们也许是对的,大部分时间Cache都可以安静的工作。但对于操作系统、编译软件、固件工程师和硬件工程师来说,Cache则需要我们特别关照。现在越来越多的数据库软件和人工智能引擎也对Cache越来越敏感,需要针对性地优化。Cache设计和相关知识从而不再是阳春白雪,你也许某一天就会需要了解它。

本系列希望通过将Cache相关领域知识点拆解成大家关心的几个问题,来串起相关内容。这些问题包括:

  1. Cache究竟在哪里?
  2. Cache是怎么组织和工作的?什么是n-ways Set-Associative Cache?
  3. 什么是Cache Coloring (Page Coloring)? 什么是Inclusive Cache或者Exclusive Cache?
  4. Cache line淘汰算法有哪些?
  5. Cache为什么有那么多级?为什么一级比一级大?是不是Cache越大越好?
  6. Cache的一致性是怎么保证的?
  7. Cache的属性是谁设定的,怎么设定的?

下面是本系列的第一篇。

什么是Cache?

Cache Memory也被称为Cache,是存储器子系统的组成部分,存放着程序经常使用的指令和数据,这就是Cache的传统定义。从广义的角度上看,Cache是快设备为了缓解访问慢设备延时的预留的Buffer,从而可以在掩盖访问延时的同时,尽可能地提高数据传输率。 快和慢是一个相对概念,与微架构(Microarchitecture)中的 L1/L2/L3 Cache相比, DDR内存是一个慢速设备;在磁盘 I/O 系统中,DDR却是快速设备,在磁盘 I/O 系统中,仍在使用DDR内存作为磁介质的Cache。在一个微架构中,除了有L1/L2/L3 Cache之外,用于虚实地址转换的各级TLB, MOB( Memory Ordering Buffers)、在指令流水线中的ROB,Register File和BTB等等也是一种Cache。我们这里的Cache,是狭义 Cache,是CPU流水线和主存储器的 L1/L2/L3 Cache。

Cache在哪里呢?

也许很多人会不假思索的说:“在CPU内核里。”Not so fast!它也有可能在主板上!我们先来了解一下Cache的历史。

  • PC-AT/XT和286时代:没有Cache,CPU和内存都很慢,CPU直接访问内存。
  • 386时代:CPU速度开始和内存速度不匹配了。为了能够加速内存访问,芯片组增加了对快速内存的支持,这也是在电脑上第一次出现Cache(尽管IBM 360 model系统上已经出现很久了),也是L1(一级Cache)的雏形。这个Cache是可选的,低端主板并没有它,从而性能受到很大影响。而高级主板则带有64KB,甚至高端大气上档次的128KB Cache,在当时也是可以笑傲江湖了。当时的Cache都是Write-Through,即Cache内容的更新都会立刻写回内存中。
  • 486时代:Intel在CPU里面加入了8KB的L1 Cache,当时也叫做内部Cache。它在当时是Unified Cache,就是不分代码和数据,都存在一起。原先在386上面的Cache,变成了L2,也被叫做外部Cache。大小从128KB到256KB不等。这时增加了Write-back的Cache属性,即Cache内容更改后不立刻更新内存,而是在Cache miss的时候再更新,避免了不必要的更新。
  • 586/Pentium-1时代:L1 Cache被一分为二,分为Code和data,各自8KB。这是因为code和data的更新策略并不相同,而且因为CISC的变长指令,code cache要做特殊优化。与此同时L2还被放在主板上。后期Intel推出了Pentium Pro ('80686'),L2被放入到CPU的Package上:
  • 奔腾2/3:变化不大,L2还在CPU Die外面,只是容量大了不少。
  • 奔腾4/奔腾D:L2被放入到了Die里面。这就和现在的L1和L2很相像了,问题来了,多内核呢?第一代奔腾D双核中,L1和L2被两个Die各自占据。Netburst的Pentium 4 Extreme Edition高端版甚至加入L3。但在后期与HT一起随着Netburst架构被放弃。
  • Core/Core2:巨大的变化发生在L2,L2变成多核共享模式:
  • 现在:L3被加入到CPU Die中,它在逻辑上是共享模式。而L2则被每个Core单独占据。这时L2也常被指做MLC(Middle Level Cache),而L3也被叫做LLC(Last Level Cache):
  • Haswell/Broadwell:在Iris系列中,一块高速DRAM被放入Package中,叫做eDRAM。

它在平时可以做显存。也可以被设定为L4缓存:

Cache速度比内存速度快多少?

大家都知道内存都是DRAM,但对Cache是怎么组成就所知不多了。Cache是由CAM(Content Addressable Memory )为主体的tag和SRAM组成的。我们今后在系列文章中会详细介绍CAM的组成,这里简单比较一下DRAM和SRAM。DRAM组成很简单:

DRAM

只有一个晶体管和一个电容。而SRAM就复杂多了,一个简化的例子:

SRAM

需要6个晶体管。一个简单的比较如下:

那么速度差距多大呢?各级Cache的延迟差距很大,如下图:

可以看到延迟最低的是Registers和MOB(Memory Ordering Buffers),L1的延迟和CPU core在一个数量级之内(注意这里并不能简单的认为L1就是3个Cycle,因为有pre-fetch),而DRAM延迟是它的60多倍。

结论

说Cache在CPU的Die里面在现在绝大多数情况下都是正确的。最新Intel的optane内存会让普通DRAM作为cache,而自己作为真正内存,从而组成两级memory( L2 memory),为这个结构平添了一些变数。细心的读者也许会发现,Cache演变总的来说级数在增加,新加入的层级在位置上总是出现在外层,逐渐向内部靠近。Cache的设计是CPU设计的重要内容之一,我们会在今后的文章中为大家详细介绍。

Cache其他文章:

老狼:Cache是怎么组织和工作的?zhuanlan.zhihu.com图标老狼:Cache为什么有那么多级?为什么一级比一级大?是不是Cache越大越好?zhuanlan.zhihu.com图标

后记

  • 如何知道自己CPU的L2、L3的容量多大呢?当然可以用CPU-z,但其实可以有个更加简单的办法,在命令行输入:
wmic cpu get L2CacheSize,L3CacheSize

我的笔记本得到这个结果:

  • 想体验一下不要Cache的极限慢速吗?很多BIOS都有设置,可以关掉cache:

欢迎大家关注本专栏和用微信扫描下方二维码加入微信公众号"UEFIBlog",在那里有最新的文章。同时欢迎大家给本专栏和公众号投稿!

用微信扫描二维码加入UEFIBlog公众号

编辑于 2018-01-20

文章被以下专栏收录

    从首次运用于Intel 安腾处理器,到第一版统一的可扩展固件接口(UEFI)规范出版,无论是在高性能服务器,移动设备或是深度嵌入式设备等,UEFI已在所有平台完全淘汰了BIOS。这里有关于UEFI的一切。