具有相同缓存行大小的多级 CPU 缓存如何工作?
How multilevel CPU caches having the same cache line size work?
注意:我不确定 Whosebug 是否是该问题的正确位置,或者是否有更合适的 StackExchange 子
我在一本书中读到,对于多级 CPU 缓存,缓存行大小随着级别的总内存大小而增加。当与非常简单的架构一起使用时,我完全无法理解它是如何工作的(或者至少我是这么认为的)。然后我遇到了这个question。问题是同一个cache line的cache memory如何协同?
这就是我对具有不同高速缓存行大小的高速缓存存储器工作方式的看法。为简单起见,假设数据和指令没有不同的缓存,我们只有 L1 和 L2 缓存(L3 和 L4 不存在)。
如果 L1 的高速缓存行大小为 64 字节,L2 为 128 字节,当我们在 L2 上发生高速缓存未命中并且我们需要从主存中获取所需的字节或字时,我们也将其最接近的字节或字带入以填充 128 L2缓存行的字节数。然后由于处理器生成的对内存位置的引用的局部性,我们更有可能在 L1 上丢失时在 L2 上命中。但是如果我们有相同的缓存行大小,这当然不会发生,使用以前的算法。您能否向我解释一些 sort/simple 算法或现代 CPU 如何利用具有相同行大小的缓存的实现?
提前致谢。
I've read in a book, that for multilevel CPU caches, cache line size increases as per level's total memory size.
大多数 CPU 并非如此。通常 line 大小在所有缓存中都是相同的,但总大小会增加。通常还有关联性,但通常没有总大小那么多,因此集合的数量通常会增加。
The point of multi-level caches 是为了获得低延迟和大容量,而不需要一个既大又低延迟的缓存(因为这在物理上是不可能的)。
HW 预取到 L2 and/or L1 是使顺序读取工作良好的原因,而不是缓存输出级别中较大的行大小。 (在多核 CPU 中,私有 L1/L2 + 共享 L3 提供私有延迟 + 内存工作负载访问共享域的带宽过滤器,但是您将 L3 作为一致性支持而不是访问 DRAM 以获取共享域之间的数据核心。)
在不同的缓存中使用不同的行大小更加复杂,尤其是在缓存必须彼此保持一致性的多核系统中using MESI。在缓存之间传输整个缓存效果很好。
但是,如果 L1D 线路为 64B 而专用 L2/共享 L3 线路为 128B,则一个内核上的负载可能会迫使 L2 缓存分别请求两半,以防单独的内核具有修改了 128B 行。听起来很复杂,把更多的逻辑放在外层缓存中。
(Paul Clayton's answer on the question you linked points 解决该问题的可能方法是为较大的高速缓存行的两半分开有效位,或者甚至分开 MESI 一致性状态。但仍然共享相同的标签,所以如果它们都有效则它们必须缓存同一 128B 块的两半。)
注意:我不确定 Whosebug 是否是该问题的正确位置,或者是否有更合适的 StackExchange 子
我在一本书中读到,对于多级 CPU 缓存,缓存行大小随着级别的总内存大小而增加。当与非常简单的架构一起使用时,我完全无法理解它是如何工作的(或者至少我是这么认为的)。然后我遇到了这个question。问题是同一个cache line的cache memory如何协同?
这就是我对具有不同高速缓存行大小的高速缓存存储器工作方式的看法。为简单起见,假设数据和指令没有不同的缓存,我们只有 L1 和 L2 缓存(L3 和 L4 不存在)。 如果 L1 的高速缓存行大小为 64 字节,L2 为 128 字节,当我们在 L2 上发生高速缓存未命中并且我们需要从主存中获取所需的字节或字时,我们也将其最接近的字节或字带入以填充 128 L2缓存行的字节数。然后由于处理器生成的对内存位置的引用的局部性,我们更有可能在 L1 上丢失时在 L2 上命中。但是如果我们有相同的缓存行大小,这当然不会发生,使用以前的算法。您能否向我解释一些 sort/simple 算法或现代 CPU 如何利用具有相同行大小的缓存的实现?
提前致谢。
I've read in a book, that for multilevel CPU caches, cache line size increases as per level's total memory size.
大多数 CPU 并非如此。通常 line 大小在所有缓存中都是相同的,但总大小会增加。通常还有关联性,但通常没有总大小那么多,因此集合的数量通常会增加。
The point of multi-level caches 是为了获得低延迟和大容量,而不需要一个既大又低延迟的缓存(因为这在物理上是不可能的)。
HW 预取到 L2 and/or L1 是使顺序读取工作良好的原因,而不是缓存输出级别中较大的行大小。 (在多核 CPU 中,私有 L1/L2 + 共享 L3 提供私有延迟 + 内存工作负载访问共享域的带宽过滤器,但是您将 L3 作为一致性支持而不是访问 DRAM 以获取共享域之间的数据核心。)
在不同的缓存中使用不同的行大小更加复杂,尤其是在缓存必须彼此保持一致性的多核系统中using MESI。在缓存之间传输整个缓存效果很好。
但是,如果 L1D 线路为 64B 而专用 L2/共享 L3 线路为 128B,则一个内核上的负载可能会迫使 L2 缓存分别请求两半,以防单独的内核具有修改了 128B 行。听起来很复杂,把更多的逻辑放在外层缓存中。
(Paul Clayton's answer on the question you linked points 解决该问题的可能方法是为较大的高速缓存行的两半分开有效位,或者甚至分开 MESI 一致性状态。但仍然共享相同的标签,所以如果它们都有效则它们必须缓存同一 128B 块的两半。)