gpt4 book ai didi

caching - 为什么L1和L2 Cache浪费空间来保存相同的数据?

转载 作者:行者123 更新时间:2023-12-01 13:21:21 25 4
gpt4 key购买 nike

我不知道为什么L1缓存和L2缓存保存相同的数据。

例如,假设我们要第一次访问Memory [x]。首先将Memory [x]映射到L2高速缓存,然后将相同的数据映射到L1高速缓存,CPU寄存器可以从中检索数据。

但是我们已经复制了同时存储在L1和L2缓存中的数据,这不是问题还是至少浪费了存储空间?

最佳答案

我编辑了您的问题,询问为什么CPU浪费高速缓存空间来将相同的数据存储在多个高速缓存中,因为我认为这就是您要的。

并非所有的缓存都是这样。外部缓存的Cache Inclusion Policy可以是Inclusive, Exclusive 或Not-Inclusive / Not-Exclusive。

NINE是“正常”情况,不保留任何特殊属性,但由于您在问题中描述的原因,L2确实倾向于在L1中具有大多数行的副本。如果L2的关联性小于L1(like in Skylake-client),并且访问模式在L2中创建了很多冲突遗漏(不太可能),那么您可以获得的数据量仅在L1中。也许以其他方式,例如通过硬件预取,或由于代码获取而从L2逐出数据,因为实际的CPU使用分离的L1i / L1d缓存。

为了使外部高速缓存有用,您需要某种方式让数据输入它们,以便在行从较小的L1撤出后的某个时候可以命中L2。通过外部高速缓存获取诸如L1d之类的内部高速缓存可以免费为您提供服务,并具有一些优势。您可以将硬件预取逻辑放在高速缓存的外部或中间级别,而不必像L1那样具有高性能。 (例如Intel CPUs have most of their prefetch logic in the private per-core L2,还有L1d中的一些预取逻辑)。

另一个主要选项是使外部高速缓存成为受害者高速缓存,即,仅当它们从L1退出时才输入。因此,您可以循环遍历L1 + L2大小的数组,并且可能仍然会获得L2匹配。如果您希望L1与L2相比相对较大,则实现此功能的额外逻辑很有用,因此总大小比单独使用L2大一点。

使用专用的L2,如果L1d需要从该集合中撤出某些内容,则L1丢失/ L2命中可以在L1d和L2之间交换线路。

实际上,某些CPU确实使用了L1d(例如AMD K10 / Barcelona)专有的L2。这两个高速缓存都是私有的每核高速缓存,不是共享的,因此就像您正在谈论的单核CPU的简单L1 / L2情况一样。

多核CPU和共享缓存使事情变得更加复杂!

巴塞罗那的共享L3缓存也大部分不包含内部缓存,但并不严格。大卫·坎特(David Kanter)解释说:

首先,它主要是排他的,但并非完全如此。当一条线从L3高速缓存发送到L1D高速缓存时,如果该高速缓存线是共享的,或者很可能是共享的,则它将保留在L3中–导致重复,这在完全排他的层次结构中永远不会发生。如果所获取的高速缓存行包含代码,或者如果先前已共享数据(跟踪共享历史记录),则很可能被共享。其次,L3的驱逐政策已更改。在K8中,当从内存中引入高速缓存行时,最近使用的伪最少算法将逐出高速缓存中最旧的行。但是,在巴塞罗那的L3中,替换算法已更改为也考虑了共享,并且它希望逐出未共享的线路。

AMD的K10 /巴塞罗那的继任者是推土机。 https://www.realworldtech.com/bulldozer/3/指出,推土机的共享L3也是受害者缓存,因此大部分不包含L2。大概就像巴塞罗那的L3。

但是Bulldozer的L1d是一个小型直写式高速缓存,具有甚至更小的(4k)写合并缓冲区,因此它主要包含L2。在CPU设计领域,Bulldozer的直写式L1d通常被认为是一个错误,Ryzen回到了正常的32kiB回写式L1d,就像Intel一直以来一直在使用(效果很好)。一对弱整数核心形成一个共享FPU / SIMD单元和shares a big L2 that's "mostly inclusive"的“集群”。 (即可能是标准的NINE)。这个集群的东西是Bulldozer替代SMT /超线程的替代品,AMD也放弃了Ryzen,转而使用具有广泛乱序内核的普通SMT。

显然,Ryzen在核心集群(CCX)之间也具有某些排他性,但是我没有研究细节。

我一直在谈论AMD,因为它们在最近的设计中使用了独占缓存,并且似乎更喜欢受害者缓存。英特尔没有尝试过太多不同的事情,因为they hit on a good design with Nehalem一直坚持到Skylake-AVX512。

Intel Nehalem和更高版本使用包含共享标签的大型L3缓存。对于专用的每核L1d或L2(NINE)高速缓存中的修改/排他(MESI)的行,L3标签仍指示哪些核(可能)具有行的副本,因此从一个核中请求独占访问一条线不必广播到所有核心,而只广播到可能仍对其进行缓存的核心。 (即,它是用于一致性流量的探听过滤器,它使CPU可以在每个芯片上扩展多达数十个内核,而在它们甚至不共享内存时也不会因请求而相互淹没。)

即L3标签保存有关L2或L1中某行(或可能)缓存行的信息,因此它知道向哪里发送无效消息,而不是将消息从每个核心广播到所有其他核心。

通过Skylake-X(Skylake服务器/ SKX / SKL-SP),Intel删除了该文件,并将其制作为L3 NINE and only a bit bigger than the total per-core L2 size 。但是仍然有一个探听过滤器,它只是没有数据。我不知道英特尔为 future (双?)/四核/十六进制笔记本电脑/台式机芯片(例如Cannonlake / Icelake)打算做什么。这足够小,以至于他们的经典环形总线仍然很棒,因此他们可以继续在移动/台式机部件中这样做,而仅在高端/服务器部件中使用网格,就像在Skylake中一样。

Realworldtech论坛关于包容性,专有性与非包容性的讨论:

CPU体系结构专家花时间在该论坛上讨论什么是好的设计。在搜索有关独占缓存的内容时,我发现了this thread,其中存在严格包含的最后一级缓存的一些缺点。例如它们会强制私有的每核L2缓存较小(否则,由于L3和L2之间的重复会浪费太多空间)。

而且,L2缓存对L3的过滤器请求,因此,当其LRU算法需要删除一条线时,最近最少看到的那条线很容易成为永久处于核心L2 / L1状态的线。但是,当包含端的L3决定删除一条线时,它也必须从具有该行的所有内部缓存中逐出!

大卫·坎特(David Kanter)回复了interesting list of advantages for inclusive outer caches。我认为他是在与专有缓存进行比较,而不是与NINE进行比较。例如他关于简化数据共享的观点仅适用于独占缓存,我认为他的建议是,当多个内核甚至以共享/只读方式需要同一行时,严格独占的缓存层次结构可能会导致驱逐。

关于caching - 为什么L1和L2 Cache浪费空间来保存相同的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49785750/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com