缓存切片是如何划分的?

问题描述

对于现代末级缓存,它们根据 slices 进行划分。但是看了一些关于它的介绍,还是没搞明白是怎么按地址划分的。

enter image description here

这是对论文中切片的介绍。行偏移以外的位用于散列以获取切片 ID。当然,LLC 通常是通过物理地址来索引的。 我的服务器缓存的参数如下。它有24个物理内核,所以它有24个切片,每个切片都接近一个内核。

LEVEL1_ICACHE_SIZE                 32768
LEVEL1_ICACHE_ASSOC                8
LEVEL1_ICACHE_LInesIZE             64
LEVEL1_DCACHE_SIZE                 32768
LEVEL1_DCACHE_ASSOC                8
LEVEL1_DCACHE_LInesIZE             64
LEVEL2_CACHE_SIZE                  262144
LEVEL2_CACHE_ASSOC                 8
LEVEL2_CACHE_LInesIZE              64
LEVEL3_CACHE_SIZE                  31457280
LEVEL3_CACHE_ASSOC                 20
LEVEL3_CACHE_LInesIZE              64
LEVEL4_CACHE_SIZE                  0
LEVEL4_CACHE_ASSOC                 0
LEVEL4_CACHE_LInesIZE              0

它有两个插槽,每个插槽有 12 个物理内核。

 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

根据以上参数,我的LLC大小为31457280Byte。每个缓存行是 64Byte。它是一个 20 路集合关联结构。所以有 31457280/64/20=24576 个缓存集。每个 SOCKET 有 12 个物理内核,它们共享一个 LLC。因此,每个切片共有 24576/12=2048 个缓存集。 我的以下哪些理解是正确的?我更喜欢第一个是正确的。

  1. 每个切片上的集合索引都是独立编号的。因此,物理地址的第 6-16 位用于索引缓存集。然后使用除行偏移以外的所有位通过哈希找到切片id。

  2. 所有切片上的集合索引都是统一编号的。但是 24576 需要 14 位进行索引(这似乎并不完全对应)。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)