参考:https://levelup.gitconnected.com/understanding-l1-l2-and-l3-caches-how-to-improve-cpu-performance-d9dcc3e2e1f5
2、以下部分:如何获取x86 CPU L1、L2和L3 cache的大小 - 知乎 (zhihu.com)
CPU cache是介于CPU内核和物理内存(动态内存 dynamic RAM)之间的若干块静态内存(staic RAM),static RAM的访问速度比dynamic RAM的访问速度要快很多,而且不需要像dynamic RAM那样由于会漏电需要保持一定的刷新频率。static RAM作为访问dynamic RAM的缓存,对于系统的内存访问性能起到了很大的提升作用,但是由于static RAM的成本比较高,所以一般static RAM或者说Cache的大小都比较有限,一般都在几十KB到几十MB的范围内。
每个CPU Socket中,会包含有L1、L2(也叫MLC,Middle Level Cache)和L3(也叫LLC,Last Level Cache)的Cache,用于加速内存访问的速度,其基本结构如下所示:
每个CPU core都会有自己的L1 cache,而且经常会分成L1 data cache(DL1)和L1 instruction cache(IL1),分别用于缓存数据和指令。L2 cache可能是的隶属单个CPU core,也可能是多个CPU core之间共享(酷睿架构是隶属单个CPU core)。L3 cache则是在一个CPU Socket/Package上的所有(也有可能是部分)CPU core共享。
按照x86 CPU的传统,CPU的特性一般可以通过CPUID指令获取,Cache的相关特性也不例外,只是CPUID指令返回的信息并没有直观地告知各级Cache的大小。
根据Intel SDM(Software Developer's Manual)手册Volume 2对CPUID指令的介绍,CPUID Leaf 2(EAX=02H时执行CPUID指令),能够在EAX、EBX、ECX和EDX寄存器中返回TLB(Translation Lookaside Buffer)和Cache的相关信息,信息以字节为单位进行编码,如下图所示:
需要根据CPUID指令返回的信息,以字节为单位查表以获取详细的信息,这种方法一般适用于比较老的CPU,因为这样的表最多支持256个表项,支持的范围有限。现在的CPU基本不怎么使用这种方式,而是采用CPUID Leaf 4的方式来获取Cache的信息。
当支持CPUID Leaf 4的时候,不仅需要将EAX设置为04H,而且需要在ECX设置一个索引值,因为CPU中存在多个种类或级别的Cache,该索引值从0开始向上递增,直到返回的EAX寄存器中Cache Type File为0,表示没有更多的Cache了。
CPUID Leaf 4返回的信息并没有直接指明Cache的大小,而是需要根据一定的公式进行计算:
Cache Size = (Ways + 1) * (Partitions + 1) * (Linue_Size + 1) * (Sets + 1) 即
Cache Size = (EBX[31:22] + 1) * (EBX[21:12] + 1) * (EBX[11:0] + 1) * (ECX + 1)
在Linux上可以通过cpuid这个工具来获取CPUID指令的输出,在Intel(R) Core(TM) i5-8500 CPU @ 3.00GHz的系统上CPUID leaf 4的输出如下所示:
deterministic cache parameters (4):
--- cache 0 ---
cache type = data cache (1)
cache level = 0x1 (1)
self-initializing cache level = true
fully associative cache = false
extra threads sharing this cache = 0x1 (1)
extra processor cores on this die = 0x7 (7)
system coherency line size = 0x3f (63)
physical line partitions = 0x0 (0)
ways of associativity = 0x7 (7)
ways of associativity = 0x0 (0)
WBINVD/INVD behavior on lower caches = false
inclusive to lower caches = false
complex cache indexing = false
number of sets - 1 (s) = 63
--- cache 1 ---
cache type = instruction cache (2)
cache level = 0x1 (1)
self-initializing cache level = true
fully associative cache = false
extra threads sharing this cache = 0x1 (1)
extra processor cores on this die = 0x7 (7)
system coherency line size = 0x3f (63)
physical line partitions = 0x0 (0)
ways of associativity = 0x7 (7)
ways of associativity = 0x0 (0)
WBINVD/INVD behavior on lower caches = false
inclusive to lower caches = false
complex cache indexing = false
number of sets - 1 (s) = 63
--- cache 2 ---
cache type = unified cache (3)
cache level = 0x2 (2)
self-initializing cache level = true
fully associative cache = false
extra threads sharing this cache = 0x1 (1)
extra processor cores on this die = 0x7 (7)
system coherency line size = 0x3f (63)
physical line partitions = 0x0 (0)
ways of associativity = 0x3 (3)
ways of associativity = 0x0 (0)
WBINVD/INVD behavior on lower caches = false
inclusive to lower caches = false
complex cache indexing = false
number of sets - 1 (s) = 1023
--- cache 3 ---
cache type = unified cache (3)
cache level = 0x3 (3)
self-initializing cache level = true
fully associative cache = false
extra threads sharing this cache = 0xf (15)
extra processor cores on this die = 0x7 (7)
system coherency line size = 0x3f (63)
physical line partitions = 0x0 (0)
ways of associativity = 0xb (11)
ways of associativity = 0x6 (6)
WBINVD/INVD behavior on lower caches = false
inclusive to lower caches = true
complex cache indexing = true
number of sets - 1 (s) = 12287
可以看出,该CPU上包含了L1 Data Cache、L1 Instruction Cache,L2 Cache和L3 Cache,并且可以根据上面的公式计算出L3 Cache的大小为:
(11 + 1) * (0 + 1) * (63 + 1) * (12287 + 1) = 9MB
类似,也可以算出其他Cache的大小。
搞得这么复杂主要是因为在CPU Cache的设计过程中,为了提高Cache的利用率、准确性,并兼顾成本,需要对Cache进行更精细的划分和管理。
如果只是想要简单直接地查看CPU Cache的详情,在Windows下可以借助CPU-Z这个工具软件:
而在Linux下,则可以借助hwloc工具包中的lstopo命令,如下所示:
3、chatGPT 怎么查看处理器上 L2 cache可能是的隶属单个CPU core,也可能是多个CPU core之间共享
要查看处理器上 L2 Cache 是隶属于单个 CPU 核心还是多个 CPU 核心共享的情况,可以通过以下几种方式来获取信息:
1. 处理器规格表
查找处理器的详细规格表或者官方文档通常会提供关于 L2 Cache 的具体信息。这些文档通常包括每个核心的缓存结构,以及缓存是如何组织和共享的。
-
Intel 处理器: 可以访问 Intel ARK 网站 (ark.intel.com),在该网站上搜索特定的处理器型号,可以查看处理器的详细规格,包括 L2 Cache 的配置。
-
AMD 处理器: AMD 也有类似的官方规格文档和处理器信息页面,可以在 AMD 的官网上查找特定处理器型号的详细信息。
2. 操作系统和工具
使用操作系统和相关的硬件信息工具可以提供一些关于缓存配置的信息。
-
Windows: 在 Windows 操作系统上,可以使用系统信息工具或者第三方工具如 CPU-Z 来查看详细的处理器信息,包括缓存配置和拓扑结构。
-
Linux: 在 Linux 系统上,可以使用命令行工具如
lscpu
和hwloc
来查看处理器的拓扑结构和缓存配置信息。
3. BIOS/UEFI 设置
有时候 BIOS 或者 UEFI 设置界面中也会显示处理器的缓存配置信息,尤其是一些高级设置界面可能会提供更多关于缓存和处理器拓扑的详细信息。
4. 第三方硬件检测工具
除了上述提到的 CPU-Z,还有其他第三方工具如 AIDA64、HWiNFO 等,它们提供了更详细的硬件信息和缓存配置。
检查方法总结
- 查阅处理器规格表和官方文档,这是最直接和准确的方式,可以找到详细的缓存配置信息。
- 使用操作系统和工具,如 CPU-Z、lscpu 等来查看当前系统中处理器的缓存配置和拓扑结构。
- 检查 BIOS/UEFI 设置,有时候可以在系统启动时查看到更深入的硬件信息。
通过以上方法,可以确定处理器上 L2 Cache 是隶属于单个 CPU 核心还是多个 CPU 核心共享的具体情况。
4. 每个cpu所有cores 共享 L2 cache
case1 System architecture with single-port shared L2 cache. | Download Scientific Diagram (researchgate.net)
4.2 没有L3的 cache架构 早期的吧Dive Into Systems (swarthmore.edu)