L2 和 L3 缓存中加载了多少数据?

use*_*112 3 cpu optimization performance caching cpu-architecture

如果我有这门课:

class MyClass{
    short a;
    short b;
    short c;
};
Run Code Online (Sandbox Code Playgroud)

我有这段代码对上面的内容执行计算:

std::vector<MyClass> vec;
//
for(auto x : vec){
    sum = vec.a * (3 + vec.b) / vec.c;
}
Run Code Online (Sandbox Code Playgroud)

我知道CPU只从L1缓存加载它需要的数据,但是当L1缓存从L2缓存检索数据时,它会加载整个“缓存行”(其中可能包括它不需要的几个字节的数据) 。

L2 缓存从 L3 缓存加载多少数据,L3 缓存从主内存加载多少数据?它是根据页面定义的吗?如果是的话,根据不同的 L2/L3 缓存大小,这个答案会有何不同?

小智 7

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 芯片冗余),同时允许其他级别的高速缓存和缓存一致性以使用较小的块,从而减少带宽使用和容量浪费。(大的末级缓存块还可以提供预取效果,由于末级缓存的容量相对较高,因此缓存污染问题不太严重。但是,硬件预取可以达到相同的效果,并且缓存容量的浪费较少。) (例如,典型的L1高速缓存),驱逐发生得更频繁,因此可以利用空间局部性的时间跨度更小(即,在高速缓存行被驱逐之前更有可能仅使用一个较小块中的数据)。较大的缓存行也会减少可用块的数量,从某种意义上减少缓存的容量;这种容量减少对于小型高速缓存来说尤其成问题。