如果我有这门课:
class MyClass{
short a;
short b;
short c;
};
我有这段代码对上面的内容执行计算:
std::vector<MyClass> vec;
//
for(auto x : vec){
sum = vec.a * (3 + vec.b) / vec.c;
}
我知道CPU只从L1缓存加载它需要的数据,但是当L1缓存从L2缓存检索数据时,它会加载整个“缓存行”(其中可能包括它不需要的几个字节的数据) 。
L2 缓存从 L3 缓存加载多少数据,L3 缓存从主内存加载多少数据?它是根据页面定义的吗?如果是的话,根据不同的 L2/L3 缓存大小,这个答案会有何不同?
L2 和 L3 高速缓存还具有小于虚拟内存系统页的高速缓存线。 L2 和 L3 高速缓存行的大小大于或等于 L1 高速缓存行大小,通常是 L1 高速缓存行大小的两倍。
对于最新的 x86 处理器,所有缓存都使用相同的 64 字节缓存行大小。 (早期的 Pentium 4 处理器具有 64 字节 L1 高速缓存线和 128 字节 L2 高速缓存线。)
IBM 的 POWER7 在 L1、L2 和 L3 中使用 128 字节缓存块。 (但是,POWER4 在 L1 和 L2 中使用 128 字节块,但在片外 L3 中使用扇区 512 字节块。扇区块为子块提供有效位。对于 L2 和 L3 缓存,扇区允许单个一致性大小在整个系统中使用。)
在末级高速缓存中使用较大的高速缓存行大小可以减少标签开销,并有利于处理器和主内存之间的长突发访问(较长的突发可以提供更多带宽并有助于更广泛的纠错和 DRAM 芯片冗余),同时允许其他级别的高速缓存和缓存一致性以使用较小的块,从而减少带宽使用和容量浪费。 (大的末级缓存块还可以提供预取效果,由于末级缓存的容量相对较高,因此缓存污染问题不太严重。但是,硬件预取可以达到相同的效果,并且缓存容量的浪费较少。) (例如,典型的一级缓存),驱逐发生得更频繁,因此可以利用空间局部性的时间跨度更小(即,在缓存行被驱逐之前更有可能只使用一个较小块中的数据)。较大的缓存行也会减少可用块的数量,从某种意义上减少缓存的容量;这种容量减少对于小型高速缓存来说尤其成问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)