CPU各级缓存

被问起CPU的各级缓存,才想起我之前一直没有对应的帖子介绍这块的内容。索性就借着这个机会讲讲吧。

对目前主流的x86平台,CPU的缓存(cache)分为L1,L2,L3总共3级。也有部分的文章中有FLC(first-level cache), MLC(mid-level cache), LLC (last-level cache)的方式区分目前的3级缓存。CPU cache通过比内存(Dram)有更低的时延达到了加速数据读取的效果。

作为Linux的用户,可以使用系统默认安装的lscpu命令简单的列出CPU各级缓存的大小,如我用的一台AMD 7742 CPU具有32K的L1i L1d;512K的L2以及可见的16M的L3(这里埋个伏笔)。

各级缓存的用途

首先说说L1i和L1d的区别,i指的是instruction指令缓存,d是数据data缓存。作为冯·诺依曼体系的计算机,x86价格的指令和数据在内存中是统一管理的。但由于两者内容访问特性的不同(指令刷新率更低且不会被复写),L1的缓存是做了区分的。当前的Intel平台中L1缓存的时延为3个时钟周期,以2.0GHz的CPU计算约1.5纳秒。这种级别的时延可以极大的加速超线程以及CPU分支预测带来的性能优势。

L2缓存的时延是L1的5倍左右,即8ns。每个CPU的物理核心都有自己独立的L2缓存空间。而L3的时延在50~70个时钟周期,30ns。不同于L2,L3缓存是多个核心共享的,L3在使用场景中最大的用途是减少数据回写内存的频率,加速多核心之间的数据同步。

另:内存和cpu cache的访问统一都是64byte对齐的。也就是说即便你只需要读取1bit的数据,CPU还是会把64byte的数据从内存逐步扔到L1。

此外,CPU中事实上还存在着TLB(Translation Look aside Buffer,页表缓存)的组件类似于cache的功能。它主要负责缓存页表逻辑到物理地址的对应关系。跟L1类似,TLB也分为iTLB和dTLB分别对应了指令页表和数据页表的地址转换结果。

缓存大小的测量方式

自然,你可以像我一样通过lscpu命令获得CPU各级内存的大小。但在这里,我想找一个直观测试方法的例子让大家感受一下不同大小的缓存之间的关系。我使用到了lmbench的一个组件lat_mem_rd这个工具可以创建不同大小的内存对象,通过访问该对象的时延我们可以用来简单的标定各级CPU缓存的大小。

上图展示了我在AMD 7742 CPU上得到的测试数据。横坐标为内存对象的大小,纵坐标为对应的参考时延。很明显的,线图展示了“4级阶梯”的模样。分别对应的CPU命中L1~L3以及命中内存的时延差距。

前面说的一个伏笔:AMD官方给出的数据是“7742CPU的L3缓存大小为256M,而lscpu看到的L3缓存仅为16M”。上图中的“第三到第四级”台阶之间,内存对象的大小恰恰是16M,符合lscpu的结果。这说明AMD Rome架构不同于Intel架构,L3并不是一个整体,它是由16个相互独立的分区组成的,每个分区只能被4个CPU核心共享。——如果你看了上面讲到的L3是“加速多核心之间的数据同步”的,那就是说这种架构下L3的优势被限制在了4个CPU核心之间。

L3 缓存的技术主流又有inclusive和non-inclusive的区别,目前IA两家都逐步采用了后者。两者的区别是inclusive L3实现上L3的内容包含了所有L2的内容;而non-inclusive实现中,L2的内容不会再在L3里出现。显而易见地,non-inclusive更好的节省了宝贵的L3空间。

Cache的效能评估

即便是L3的实现成本也远远大于内存。那如何评价Cache是否物尽其用了呢?

对于CPU cache(包含tlb)的效能,可以用MPI(cache misses per instruction,每指令cache不命中率)由于这个值普遍小于1%,有时也会将这个值乘1000计作MPKI来测算。考虑到大多数的CPU指令都离不开cache的读写。MPI值越低,说明CPU cache被有效使用的比率越高。

个人的经验是MPI一旦大于4%则认为cache的优化是“不合适的”。但事实上确实存在一种类型的业务(比如流计算)数据不会被反复更新,那额外的cache访问非但没有意义反而会通过LRU挤出效应干扰到共享L3 cache的其他核心上的业务。这个时候就可以考虑使用Non-temporal的读写操作,系统将认为此内存的访问是no cacheable的。 

推荐阅读:
Faiss的多线程效率问题

过去的一周,被AI组的同事拉去

PMU Event counter的使用状况检测

题目用中文反而有点绕,How

AMD Rome benchmark数据到架构特征推导

这几天,拿到了一套最新的AMD

一个测试性能不稳定的问题

经常会通过一些通用的测试工具测

发表评论

电子邮件地址不会被公开。 必填项已用*标注

请补全下列算式: *

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据