Caching cpuid命令显示的信息有问题

Caching cpuid命令显示的信息有问题,caching,x86,cpu-architecture,cpu-cache,cpuid,Caching,X86,Cpu Architecture,Cpu Cache,Cpuid,linux上使用cpuid命令显示的llc缓存信息如下: --- cache 3 --- cache type = unified cache (3) cache level = 0x3 (3) self-initializing cache level = true fully associative cache

linux上使用cpuid命令显示的llc缓存信息如下:

  --- 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     = 0x1f (31)
      extra processor cores on this die    = 0xf (15)
      system coherency line size           = 0x3f (63)
      physical line partitions             = 0x0 (0)
      ways of associativity                = 0x13 (19)
      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)               = 24575
为什么有两种联想方式?它在/sys/devices/system/cpu/cpu0/cache/index3/number_of_set文件中显示了20?20是有限责任公司的关联度吗?这里显示的关联性=0x6的方式是什么?如何区分每个片有多少个缓存集?多谢各位

我正在使用服务器。版本为:Linux版本4.15.0-122-genericbuildd@lcy01-amd64-010 gcc版本5.4.0 20160609 Ubuntu 5.4.0-6ubuntu1~16.04.12 124~16.04.1-Ubuntu SMP

cpu信息是

Architecture: x86_64
 CPU operating mode: 32-bit, 64-bit
 Byte Order: Little Endian
 CPU(s): 48
 On-line CPU(s) list: 0-47
 Number of threads per core: 2
 Number of audits per seat: 12
 Socket(s): 2
 NUMA nodes: 2
 Vendor ID: GenuineIntel
 CPU series: 6
 Model: 79
 Model name: Intel(R) Xeon(R) CPU E5-2650 v4 @ 2.20GHz
 Step: 1
 CPU MHz: 2500.119
 CPU max MHz: 2900.0000
 CPU min MHz: 1200.0000
 BogoMIPS: 4401.87
 Virtualization: VT-x
 L1d cache: 32K
 L1i cache: 32K
 L2 cache: 256K
 L3 cache: 30720K
 NUMA node0 CPU(s): 0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42 ,44,46
 NUMA node1 CPU(s): 1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33,35,37,39,41,43 ,45,47

使用Linux提供的其他数字:

size = bytes_per_line * sets * associativity
30720 KiB = 64 * 24576 * associativity
30720 KiB = 1536 KiB * associativity
30720 KiB / 1536 KiB = associativity
20 = associativity
使用来自和的信息进行检查;这些数据源表明,12个核中的每个核都有2.5 MiB的20路关联三级缓存,通过一种环形总线连接,一个芯片总共有30 MiB的三级缓存

使用它作为双重检查现实,我假设显示的关联性值的两种方式都是错误的;第一个关联性方法=19可能显示关联性-1,类似于他们太懒了,在不说关联性方法-1=19的情况下向集合数-1添加1。我不知道第二种关联方式=6是从哪里来的,因为芯片对共享TLB使用了6路关联,所以可能它在错误的位置显示了它


请注意,您在2个插槽中有2个芯片,以上所有内容都是每个芯片的,这将是两个单独的30 MiB组的L3缓存。

使用Linux提供的其他数字:

size = bytes_per_line * sets * associativity
30720 KiB = 64 * 24576 * associativity
30720 KiB = 1536 KiB * associativity
30720 KiB / 1536 KiB = associativity
20 = associativity
使用来自和的信息进行检查;这些数据源表明,12个核中的每个核都有2.5 MiB的20路关联三级缓存,通过一种环形总线连接,一个芯片总共有30 MiB的三级缓存

使用它作为双重检查现实,我假设显示的关联性值的两种方式都是错误的;第一个关联性方法=19可能显示关联性-1,类似于他们太懒了,在不说关联性方法-1=19的情况下向集合数-1添加1。我不知道第二种关联方式=6是从哪里来的,因为芯片对共享TLB使用了6路关联,所以可能它在错误的位置显示了它

请注意,您在2个插槽中有2个芯片,以上所有都是每个芯片。这将是两个单独的30 MiB三级缓存组。

cpuid版本20150606(包括20170122)存在一个错误,在解码cpuid叶0x4缓存信息时,缓存方式的数量会打印两次。第二次使用寄存器EDX中的值,该值实际上对不同的信息段进行编码,请参见。该值在处理器上是110(二进制)

20200120之前的cpuid版本错误地显示了关联方式,而不是关联方式-1。一些CPUID信息被编码为实际的数字减1,因为编码相同范围的正整数需要更少的一位

从cpuid版本20200211开始,该工具的作者改变了主意,决定让工具自动添加一个比显示原始值更好。因此,在这些版本中,处理器将获得以下输出:

ways of associativity                = 0x14 (20)
.
.
.
number of sets (s)                   = 24576
您可以在上跟踪对cpuid工具的更改。顺便说一下,旧版本有很多bug

在某些情况下,处理器本身提供的CPUID信息不正确。通常,当不同官方来源之间存在不一致时,其中至少有一个是错误的。处理器的CPUID信息是正确的。

CPUID版本20150606(包括20170122)存在一个错误,在解码CPUID叶0x4缓存信息时,缓存方式的数量会打印两次。第二次使用寄存器EDX中的值,该值实际上对不同的信息段进行编码,请参见。该值在处理器上是110(二进制)

20200120之前的cpuid版本错误地显示了关联方式,而不是关联方式-1。一些CPUID信息被编码为实际的数字减1,因为编码相同范围的正整数需要更少的一位

从cpuid版本20200211开始,该工具的作者改变了主意,决定让工具自动添加一个比显示原始值更好。因此,在这些版本中,处理器将获得以下输出:

ways of associativity                = 0x14 (20)
.
.
.
number of sets (s)                   = 24576
您可以在上跟踪对cpuid工具的更改。顺便说一下,旧版本有很多bug


在某些情况下,处理器本身提供的CPUID信息不正确。通常,当不同官方来源之间存在不一致时,其中至少有一个是错误的。处理器的CPUID信息正确。

谢谢您的回复。这真的很有用。但我想知道12个核中的每个核是如何获得2.5 MiB的20路关联三级缓存的?Bec
因为它总共是30MB,总共有12个核。是否计算了30MB/12=2.5MB?这是否意味着每个核心都连接到一个LLC片?这是否意味着片的数量与内核的数量一样多?@cyj:一般来说,是的,英特尔cpu每个内核有一个L3片,就像我在你前面的一个问题上评论的那样。CPU可能会禁用一个核心,但不会禁用其L3片,但我不知道Intel是否有任何SKU型号,其L3数超过微体系结构中每个核心的预期数。有些产品的每个核心的L3少于2.5MB。Xeon E5 v1、v2、v3、v4在环上的每个位置都有一个核心和一个2.5MiB LLC片。大多数型号的已启用核心和LLC片数相等,但有些型号的已启用LLC片数多于核心数。看起来有些模型可能只在16路关联性下启用每个LLC片的2.0 MiB,但大多数模型启用所有2.5 MiB。类似的问题也适用于较新的Xeon可伸缩处理器,但适用于1.375 MiB LLC片11路关联处理器。许多较低核数的型号启用的LLC片比核多,例如,Xeon Gold 5222启用了4个核和12个LLC片。感谢您的回复。这真的很有用。但我想知道12个核中的每个核是如何获得2.5 MiB的20路关联三级缓存的?因为它总共是30MB,总共有12个核。是否计算了30MB/12=2.5MB?这是否意味着每个核心都连接到一个LLC片?这是否意味着片的数量与内核的数量一样多?@cyj:一般来说,是的,英特尔cpu每个内核有一个L3片,就像我在你前面的一个问题上评论的那样。CPU可能会禁用一个核心,但不会禁用其L3片,但我不知道Intel是否有任何SKU型号,其L3数超过微体系结构中每个核心的预期数。有些产品的每个核心的L3少于2.5MB。Xeon E5 v1、v2、v3、v4在环上的每个位置都有一个核心和一个2.5MiB LLC片。大多数型号的已启用核心和LLC片数相等,但有些型号的已启用LLC片数多于核心数。看起来有些模型可能只在16路关联性下启用每个LLC片的2.0 MiB,但大多数模型启用所有2.5 MiB。类似的问题也适用于较新的Xeon可伸缩处理器,但适用于1.375 MiB LLC片11路关联处理器。许多较低堆芯数的型号启用的LLC片比堆芯多,例如,Xeon Gold 5222启用了4个堆芯和12个LLC片。