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

人气:333 发布:2022-10-16 标签: caching performance optimization cpu cpu-architecture

问题描述

如果我有这个类:

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高速缓存线的大小大于或等于L1高速缓存线大小,通常是L1高速缓存线大小的两倍。

对于最新的x86处理器,所有缓存都使用相同的64字节缓存行大小。(早期的奔腾4处理器有64字节的一级缓存线和128字节的二级缓存线。)

IBM的POWER7在L1、L2和L3中使用128字节的缓存块。(然而,POWER4在L1和L2中使用128字节块,但在片外L3中对512字节块进行扇区划分。扇区区块为子块提供有效位。对于L2和L3缓存,扇区划分允许在整个系统中使用单个相干大小。)

在末级高速缓存中使用更大的高速缓存线大小可以减少标签开销并促进处理器和主存储器之间的长突发访问(更长的突发可以提供更多带宽,并有助于更广泛的纠错和DRAM芯片冗余),同时允许其他级别的高速缓存和高速缓存一致性使用更小的块,从而减少带宽使用和容量浪费。(大的末级高速缓存块还提供预取效果,其高速缓存污染问题不那么严重,因为末级高速缓存的容量相对较高。然而,硬件预取可以实现相同的效果,同时减少高速缓存容量的浪费。)对于较小的高速缓存(例如,典型的L1高速缓存),驱逐发生得更频繁,因此可以利用空间局部性的时间跨度更小(即,在驱逐高速缓存线之前,更有可能只使用一个较小块中的数据)。较大的缓存线还会减少可用块的数量,在某种意义上会减少缓存的容量;这种容量减少对于较小的缓存尤其有问题。

433