这似乎是一个奇怪的问题。CPU缓存:两个地址之间的距离是否需要小于8个字节以获得缓存优势?
假设缓存行的大小为64个字节。此外,假设L1,L2,L3具有相同的高速缓存行大小(this帖子称它是Intel Core i7的情况)。
存储器上有两个对象A
,B
,它们的(物理)地址是N字节。为简单起见,我们假设A
是高速缓存器边界上,也就是它的地址是64。
1)如果N
< 64的整数倍,当A
是由CPU取出,B
将被读入高速缓存,太。因此,如果需要B
,并且高速缓存行尚未被驱逐,则CPU会在很短的时间内获取B
。每个人都很高兴。 2)如果N
>> 64(即远远大于64),当A
被CPU提取时,B
不会被读入高速缓存行,而是A
。所以我们说“CPU不喜欢追逐指针”,这是避免堆分配的基于节点的数据结构的原因之一,如std::list
。
我的问题,如果N
> 64,但仍然很小,说N
= 70,换句话说,A
和B
不适合在一个高速缓存行,但不会太远分开,当A
是装通过CPU,提取B
所花费的时钟周期数量与N
远大于64时所花费的时钟周期数量相同?
改写 - 当被加载A
,让吨表示取B
的时间的经过,是吨(Ñ = 70)远小于或几乎等于吨(Ñ = 9999999)?
我问这个问题,因为我怀疑吨(ñ = 70)比吨(ñ = 9999999)要小得多,因为CPU缓存是层次。
如果有定量研究,情况会更好。
所以..简而言之,t(N = 70)最可能小于t(N = 999999),对吧? – user8385554
@ user8385554是的。它倾向于具有TLB命中并且可能利用推测预取下一个高速缓存行,甚至可能利用仍然打开的DRAM行(如果A和B未命中靠近)。如果A命中L3,TLB的好处可能是主/唯一一次(下一行预取很可能在内存控制器完成,并且DRAM行不会被激活来访问A)。如果B在不同的页面上(x86上带有基页的4 KiB边界),则没有任何好处可用。 –