CPU的各级缓存及拓扑结构的查看 详解

今天忽然对CPU的Cache感兴趣了,稍微了解了一下,做一下知识笔记吧。
包括CPU的各级Cache以及CPU的拓扑结构。注:文中出现的各种命令都是在Linux系统下运行的。

cpu的处理数据的速度是非常非常快的,但是,数据需要从硬盘中读取出才能传递到CPU处理,然而硬盘的读写速度跟CPU的处理初速比,差的实在是成千上万倍。
所以加入了内存这个配件,他的目的就是将暂时需要用到的程序数据等,暂时存储在内存中。由于内存的读写速度远远大于硬盘,所以这个效率得到了非常大的提升。
但是,CPU的处理速度依然远远大于内存,CPU依然需要等待大量的时间从内存读取数据,CPU性能被浪费,所以CPU引入了一级缓存,他的容量很小,只有几十K左右,但他的读写速度却已经与CPU处理速度非常接近了。

CPU缓存:缓存大小也是CPU的重要指标之一,而且缓存的结构和大小对CPU速度的影响非常大,CPU内缓存的运行频率极高,一般是和处理器同频运作,工作效率远远大于系统内存和硬盘。实际工作时,CPU往往需要重复读取同样的数据块,而缓存容量的增大,可以大幅度提升CPU内部读取数据的命中率,而不用再到内存或 者硬盘上寻找,以此提高系统性能。但是由于CPU芯片面积和成本的因素来考虑,缓存都很小。

L1 Cache(一级缓存)是CPU第一层高速缓存,分为数据缓存和指令缓存。内置的L1高速缓存的容量和结构对CPU的性能影响较大,不过高速缓冲存储器均由静态RAM组成,结构较复杂,在CPU管芯面积不能太大的情况下,L1级高速缓存的容量不可能做得太大。一般服务器CPU的L1缓存的容量通常在32—256KB。

L2 Cache(二级缓存)是CPU的第二层高速缓存,分内部和外部两种芯片。内部的芯片二级缓存运行速度与主频相同,而外部的二级缓存则只有主频的一半。L2高速缓存容量也会影响CPU的性能,原则是越大越好,现在家庭用CPU容量最大的是512KB,而服务器和工作站上用CPU的L2高速缓存更高达 256KB-1MB,有的高达2MB或者3MB。

L3 Cache(三级缓存),也叫LLC(Last Level Cache,目前一般L3就是LLC),分为两种,早期的是外置,现在的都是内置的。而它的实际作用即是,L3缓存的应用可以进一步降低内存延迟,同时提升大数据量计算时处理器的性能。降低内存延迟和提升大数据量计算能力对游戏都很有帮助。而在服务器领域增加L3缓存在性能方面仍然有显著的提升。比方具有较大L3缓存的配置利用物理内存会更有效,故它比较慢的磁盘I/O子系统可以处理更多的数据请求。具有较大L3缓存的处理器提供更有效的文件系统缓存行为及较短消息和处理器队列长度。

无论是二级缓存、三级缓存还是内存都不能存储处理器操作的原始指令,这些指令只能存储在CPU的一级指令缓存中,而余下的二级缓存、三级缓存和内存仅用于存储CPU所需数据。
一级缓存、二级缓存都是core这个级别独享的;而三级缓存是socket独享的(同一个socket上的多个core共享)

根据工作原理的不同,目前主流处理器所采用的一级数据缓存又可以分为实数据读写缓存和数据代码指令追踪缓存2种,它们分别被AMD和Intel所采用。不同的一级数据缓存设计对于二级缓存容量的需求也各不相同,下面让我们简单了解一下这两种一级数据缓存设计的不同之处。
一、AMD一级数据缓存设计
AMD采用的一级缓存设计属于传统的“实数据读写缓存”设计。基于该架构的一级数据缓存主要用于存储CPU最先读取的数据;而更多的读取数据则分别存储在二级缓存和系统内存当中。做个简单的假设,假如处理器需要读取“AMD ATHLON 64 3000+ IS GOOD”这一串数据(不记空格),那么首先要被读取的“AMDATHL”将被存储在一级数据缓存中,而余下的“ON643000+ISGOOD”则被分别存储在二级缓存和系统内存当中。
需要注意的是,以上假设只是对AMD处理器一级数据缓存的一个抽象描述,一级数据缓存和二级缓存所能存储的数据长度完全由缓存容量的大小决定,而绝非以上假设中的几个字节。“实数据读写缓存”的优点是数据读取直接快速,但这也需要一级数据缓存具有一定的容量,增加了处理器的制造难度(一级数据缓存的单位制造成本较二级缓存高不少)。
二、Intel一级数据缓存设计
自P4时代开始,Intel开始采用全新的“数据代码指令追踪缓存”设计。基于这种架构的一级数据缓存不再存储实际的数据,而是存储这些数据在二级缓存中的指令代码(即数据在二级缓存中存储的起始地址)。假设处理器需要读取“INTEL P4 IS GOOD”这一串数据(不记空格),那么所有数据将被存储在二级缓存中,而一级数据代码指令追踪缓存需要存储的仅仅是上述数据的起始地址。
由于一级数据缓存不再存储实际数据,因此“数据代码指令追踪缓存”设计能够极大地降CPU对一级数据缓存容量的要求,降低处理器的生产难度。但这种设计的弊端在于数据读取效率较“实数据读写缓存设计”低,而且对二级缓存容量的依赖性非常大。

另外,cat /proc/cpuinfo中看到的cache一般来说是现实最大级别缓存的容量,可能是三级缓存(如果有)或者是二级缓存。
如果需要了解cpu的拓扑结构, 了解逻辑CPU和物理的CPU的映射关系,以及了解CPU的内部的硬件参数,比如说L1,L2,L3 cache 的大小等信息。这时cpuinfo就不够用了,上面的信息不够多;所幸的是Intel提供了这样的一个工具来看CPU的拓扑结构。
参见: http://software.intel.com/en-us/articles/intel-64-architecture-processor-topology-enumeration/
下载下来编译、运行有OK了。 (2017.11更新:这个工具在一些新CPU硬件如:SkyLake,会遇到执行报错)
./cpu_topology64.out
我的一台测试服务器Intel Westmere-EP平台,缓存相关信息如下:
L1D is Level 1 Data cache, size(KBytes)= 32,  Cores/cache= 2, Caches/package= 6
L1I is Level 1 Instruction cache, size(KBytes)= 32,  Cores/cache= 2, Caches/package= 6
L2 is Level 2 Unified cache, size(KBytes)= 256,  Cores/cache= 2, Caches/package= 6
L3 is Level 3 Unified cache, size(KBytes)= 12288,  Cores/cache= 12, Caches/package= 1

参考资料:
http://hi.baidu.com/kxw102/blog/item/aeef82fd278d4cf7fd037f28.html
http://en.wikipedia.org/wiki/CPU_cache
http://rdc.taobao.com/blog/cs/?p=460  (淘宝一个同学写的关于CPU结构的查看)

master

Stay hungry, stay foolish.

发表评论

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

*