从该论坛上的上一个问题中,我了解到,在大多数内存系统中,L1缓存是L2缓存的子集,这意味着从L2删除的所有条目也将从L1删除。
所以现在我的问题是我如何确定L1缓存中对应于L2缓存中的条目的条目。L2条目中存储的唯一信息是标签信息。基于此标签信息,如果L1和L2缓存的行大小不同,则如果我重新创建addr,它可能会跨越L1缓存中的多行。
该体系结构是否真的要对两条线进行刷新,还是只是将L1和L2高速缓存保持为相同的线大小?
我知道这是一项政策决定,但我想知道常用的技术。
从该论坛上的上一个问题中,我了解到,在大多数内存系统中,L1缓存是L2缓存的子集,这意味着从L2删除的所有条目也将从L1删除。
所以现在我的问题是我如何确定L1缓存中对应于L2缓存中的条目的条目。L2条目中存储的唯一信息是标签信息。基于此标签信息,如果L1和L2缓存的行大小不同,则如果我重新创建addr,它可能会跨越L1缓存中的多行。
该体系结构是否真的要对两条线进行刷新,还是只是将L1和L2高速缓存保持为相同的线大小?
我知道这是一项政策决定,但我想知道常用的技术。
Answers:
在核心i7中,L1,L2和L3中的行大小相同:即64字节。我想这简化了维护包容性和一致性的过程。
参见第10页:https : //www.aristeia.com/TalkNotes/ACCU2011_CPUCaches.pdf
高速缓存行的大小通常为64个字节。
此外,请看一下有关处理器缓存的非常有趣的文章: 处理器缓存效果库
您将找到以下章节:
在严格包含的高速缓存层次结构中,处理高速缓存块大小的最常用技术是对所有实施了包含属性的高速缓存级别使用相同大小的高速缓存块。与更高级别的高速缓存使用较大的块相比,这会导致更大的标签开销,这不仅占用芯片面积,而且还会增加延迟,因为更高级别的高速缓存通常使用分阶段访问(在访问数据部分之前先检查标签)。但是,这也稍微简化了设计,并减少了数据未使用部分造成的浪费容量。它不需要占用128字节高速缓存块中大部分未使用的64字节块来补偿额外的32位标记的面积损失。另外,可以通过相对简单的预取来提供更大的缓存块效果,以利用更广泛的空间局部性,
不太常用的技术将高速缓存块划分为多个扇区。扇区大小与低级高速缓存的块大小相同可以避免过多的反向无效问题,因为高级高速缓存中的每个扇区都有自己的有效位。(为每个扇区提供所有一致性状态元数据,而不仅仅是有效性,可以避免在块中的至少一个扇区未被弄脏/修改且某些一致性开销(例如,如果一个扇区处于共享状态而另一个扇区处于共享状态)时,避免过度使用写回带宽。在互斥状态下,以互斥状态写入扇区可能不涉及一致性流量(如果使用窥探而不是目录一致性)。)
当标签在处理器芯片上但数据在芯片外时,扇区缓存块节省的面积尤其重要。显然,如果数据存储区的面积与处理器芯片的大小相当(这是不合理的),则具有64字节块的32位标签将占用大约16%(〜6%)的处理器空间,而128-字节块将花费一半的时间。(2009年推出的IBM POWER6 +可能是使用处理器上芯片标签和处理器外数据的最新处理器。像IBM那样,将数据存储在较高密度的嵌入式DRAM中以及将标签存储在较低密度的SRAM中,可能会夸大其词。影响。)
应该注意的是,英特尔使用“缓存行”来指代较小的单元,使用“缓存扇区”来指代较大的单元。(这就是为什么我在解释中使用“缓存块”的原因之一。)使用Intel的术语,无论缓存级别是严格包含,严格排他还是使用,缓存行的大小在不同的缓存级别之间都是非常不寻常的其他一些包容政策。
(严格排除通常使用较高级别的高速缓存作为受害者高速缓存,其中将来自较低级别的高速缓存的逐出插入较高级别的高速缓存。显然,如果块大小不同且未使用扇区,则逐出将需要其余的较大的块从某处被读取和无效如果存在于低级高速缓存。[理论上,严格排除可以与不灵活的高速缓存旁路用在一个L1逐出将旁路L2和去L3和L1 / L2高速缓存未命中将只分配给任一L1或L2,绕过L1进行某些访问。我所知道的最接近实现的是Itanium绕过L1进行浮点访问。但是,如果我没记错的话,L2包括L1。]]