根据“Intel 64和IA-32架构优化参考手册”, 2012年4月第2-23页
LLC数据阵列中保存的数据的物理地址分布在 通过散列函数缓存切片,使得地址均匀分布。该 高速缓存块中的数据阵列可以具有对应的4/8/12/16路 0.5M / 1M /1.5M / 2M块大小。但是,由于地址之间的分布 从软件的角度来看缓存块,这并不像普通的N路那样出现 高速缓存中。
我的计算机是一个双核Sandy Bridge,具有3 MB,12路组关联LLC缓存。但这似乎与英特尔的文档并不一致。根据数据,似乎我应该有24种方式。我可以想象核心/缓存片的数量正在发生,但我无法弄明白。如果我有2个内核,因此每个切片有2个高速缓存切片1.5 MB,根据英特尔,每个高速缓存切片有12种方式,这似乎与我的CPU规格不一致。有人可以向我澄清这个吗?
如果我要逐出整个缓存行,我是否需要以128 KB或256 KB的速度访问缓存?事实上,这正是我想要实现的目标。
非常欢迎任何建议的读物。
答案 0 :(得分:4)
关联性与切片数量或散列函数完成的映射正交。如果给定地址映射到某个缓存片(以及其中的给定集),则它只能与映射到同一位置的其他行竞争。 拥有2个切片不会提高关联性,它只会减少争用(因为行最终会在更多集合上均匀分布)。
因此,每个切片有12种方式,但每组的整体关联性仍然是12种方式。
如果您通过访问映射到同一组的不同行来测试您的关联性,那么选择这些行会更难(您需要知道哈希函数),但是您需要12线后仍然会挣扎。 但是,如果你忽略散列,并假设线条只是按照它们的设置位进行映射,那么我可以出现就像你有更高的相关性,因为线条会在切片之间均匀分布,所以晃动需要更长的时间。这不是真正的相关性,但它接近一些实际目的。它只会在您使用宽物理内存范围时起作用,因为高位需要更改以进行散列以产生任何影响。
答案 1 :(得分: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没有强制驱逐,只有有效的冲突失误。