根据英特尔的说法,我的缓存应该是24路关联,虽然它的12路,这是怎么回事?

问题描述 投票:3回答:2

根据“Intel 64和IA-32架构优化参考手册”,2012年4月第2-23页

保存在LLC数据阵列中的数据的物理地址通过散列函数分布在高速缓存片段中,使得地址均匀分布。高速缓存块中的数据阵列可具有对应于0.5M / 1M /1.5M / 2M块大小的4/8/12/16路。但是,由于从软件的角度来看高速缓存块之间的地址分配,这不会显示为正常的N路高速缓存。

我的计算机是一个双核Sandy Bridge,带有3 MB,12路组关联LLC缓存。但这似乎与英特尔的文档并不一致。根据数据,似乎我应该有24种方式。我可以想象核心/缓存片的数量正在发生,但我无法弄明白。如果我有2个内核,因此每个切片有2个高速缓存切片1.5 MB,根据英特尔,每个高速缓存切片有12种方式,这似乎与我的CPU规格不一致。有人可以向我澄清这个吗?

如果我想要逐出整个缓存行,我是否需要以128 KB或256 KB的速度访问缓存?事实上,这正是我想要实现的目标。

任何建议的读数都是非常受欢迎的。

performance intel cpu-architecture cpu-cache micro-optimization
2个回答
4
投票

关联性与切片的数量或由散列函数完成的映射正交。如果给定地址映射到某个缓存片(以及其中的给定集),则它只能与映射到同一位置的其他行竞争。拥有2个切片不会提高关联性,它只会减少争用(因为行最终会在更多集合上均匀分布)。

因此,每个切片有12种方式,但每组的整体关联性仍然是12种方式。

如果你通过访问映射到同一组的不同行来测试你的关联性,那么你将很难选择这些行(你需要知道哈希函数),但你仍然会在12之后得到颠簸线。但是,如果你忽略散列,并假设线条只是按照它们的设置位进行映射,那么我可能看起来好像你的关联性较高,因为线条会在切片之间均匀分布,因此颠簸会花费更长的时间。这不是真正的相关性,但它接近一些实际目的。它只有在您使用宽物理内存范围时才有效,因为高位需要更改以进行散列以产生任何影响。


3
投票

具有2个切片使组的数量加倍,而不是每组的方式数。后者需要每个切片检查一个集合的标签,因此带宽不会随核心扩展(其中每个核心都有一片L3)。

实际设计意味着索引确定环形总线上需要处理单行请求的单个停止。


如果我想要逐出整个缓存行,我是否需要以128 KB或256 KB的速度访问缓存?事实上,这正是我想要实现的目标。

也不是,它不是那么简单。与较小/较快的高速缓存不同,最后一级高速缓存的索引不是来自地址的简单位。它更像是高速缓存行偏移之上的所有地址位的散列函数,这可以减少意外发生大步幅时的冲突,或者当同一系统上的多个程序(或同一程序的实例)使用相同的偏移相对时到一个巨大的页面或任何其他边界。

最后一级缓存索引功能是英特尔的秘密成分之一; AFAIK它没有被反向设计或发布,但我没有去看。

显然你可以使用一个大的缓冲区,在你再次出现之前很有可能已经驱逐了一条线,但是如果有一个好的方法,IDK就是这样。 clflushopt与商店的成本相似;必须确保没有缓存行的副本仍然存在。

prefetchnta预先进入L1,并快速驱逐进入L3(仅使用有限的方式)。 In practice it can give L3 misses with a working set smaller than L3没有强制驱逐,只有有效的冲突失误。

© www.soinside.com 2019 - 2024. All rights reserved.