缓存整行而不是一次单个字节或单词有什么好处?

时间:2017-12-06 07:34:26

标签: caching

要使用高速缓冲存储器,主存储器分为高速缓存行,通常为32或64字节长。一次缓存整个缓存行。缓存整行而不是一次单个字节或单词有什么好处?

3 个答案:

答案 0 :(得分:0)

这是为了利用地方性原则;空间位置要准确。该原理指出在存储器中靠近在一起的数据字节可能在程序中一起被引用。在循环中访问大型数组时,这一点很明显。然而,这并非总是如此(例如,基于指针的存储器访问),因此不建议以超过高速缓存行的粒度从存储器中获取数据(如果程序没有引用的位置),因为高速缓存是非常的有限而重要的资源。

答案 1 :(得分:0)

具有等于最小可寻址大小的高速缓存块大小意味着,如果支持更大大小的访问,则必须检查多个标签以获取更大的访问。尽管并行标记检查通常用于集合关联缓存,但是要检查的标记数量增加了四倍(与32位相比,增加了8位),这将增加访问延迟并大大增加能耗。另外,这引入了针对较大访问的部分命中的可能性,从而增加了将数据发送到相关操作或内部存储的复杂性。尽管可以通过假设完全匹配来推测性地发送数据(因此,不必因部分匹配而损害等待时间),但最好不要将复杂性预算用于支持部分匹配。

当最大访问大小为32位时,

32位高速缓存块可以避免上述问题,但是会为标签使用很大一部分存储空间。例如,在32位地址空间中的16KiB直接映射缓存将18位用于标签的地址部分;即使没有其他元数据(如一致性状态),标签也将使用36%的存储空间。 (可以通过使地址空间的16KiB区域不可缓存来避免其他元数据;与该地址区域匹配的标签将被解释为“无效”。)

除了存储开销外,具有更多标签数据还倾向于增加延迟(较小的标签存储有助于更早的方式选择)和访问能量。此外,对于给定大小的缓存,使用较少数量的块可以使预测和记忆更加容易,这些块可用于减少延迟和/或访问能量。

(当标签允许将标签放在芯片上而数据太大而无法容纳在芯片上时,存储开销可能是一个重要因素。如果数据使用比标签更密集的存储类型,例如DRAM中的数据和SRAM中的标签,存储密度相差四倍-更低的标签开销就变得更加重要。)

如果高速缓存仅利用所利用的时间局部性(在“短”时间段内重新使用存储位置),则通常这将是最具吸引力的块大小。但是,访问的空间局部性(访问较早访问附近位置的时间通常很近)很常见。所采取的控制流指令通常少于所有指令的六分之一,并且许多分支和跳转很短(因此,如果每个高速缓存块包含四个或七个,则分支/跳转目标可能与分支/跳转指令位于同一高速缓存块内)更多说明)。堆栈帧是功能的局部功能(集中访问的时间,尤其是对于叶子功能,这是常见的)。数组访问通常使用单位步幅或非常小的步幅。结构/对象的成员倾向于在时间附近访问(概念上相关的数据倾向于在动作/目的上相关,因此在时间上接近访问)。甚至某些内存分配模式也会使访问偏向空间局部性。相关的结构/对象通常会在附近及时分配-如果首选的空闲内存没有零碎(如果在附近及时释放空间本地分配,如果已释放了很少的内存或者分配器很巧妙地减少了碎片,就会发生这种情况,那么这种分配更有可能在空间上是局部的。

对于多个高速缓存,在较大的高速缓存块(在假定空间局部性的情况下)下,一致性开销也往往会降低。虚假共享会增加一致性开销(类似于缺乏空间局部性会增加容量和冲突遗漏)。

从这个意义上讲,较大的缓存块可以看作是预取的一种简单形式(即使在一致性方面也是如此)。预取以带宽和缓存容量为代价,通过缓存命中(以及增加有用的队列大小和调度灵活性)来减少延迟。通过始终将一个内存块预取到多个小缓存块中,可以获得相同的好处,但是细粒度逐出的容量好处是适度的,因为使用的空间局部性很常见。另外,为了避免预取缓存中已存在的数据,必须探查其他块的标签以检查命中率。

使用简单的模二幂的索引和适度的关联性,两个空间上相邻的块更可能发生冲突,并更早地逐出具有空间位置的另一个块(索引A和索引B对于所有地址都具有相同的空间位置关系映射到更大地址范围内的索引)。对于面向LRU的替换,当空间局部性很常见时,较大的缓存块中的访问减少了过早驱逐的可能性,而这是以某些容量和冲突缺失为代价的。

(对于直接映射的缓存,始终预取一个多块对齐的块与使用更大的缓存块之间没有区别,因此付出额外的标签开销将毫无意义。)

预取到较小的缓冲区将避免使用的数据对缓存造成污染,从而增加较小的块大小的好处,但是这也减小了空间局部性的时间范围。四项预取缓冲区仅支持四个高速缓存未命中的空间局部性。这将捕获大多数类似流的访问(很少有四个以上的新“流”同时处于活动状态)以及其他许多空间局部性的情况,但是某些空间局部性会占用较长的时间。

强制性预取(无论是从较大的高速缓存块还是从更灵活的机制进行)都具有明显的带宽优势。首先,地址和请求类型的开销分布在大量数据上。每32位访问需要32位地址和请求类型开销,用于非数据的带宽占50%,但在传输256位数据时,占用的带宽不到12%。

第二,可以更轻松地在更多传输的数据上平均化内存控制器的处理和调度开销。

最后,DRAM芯片可以通过利用内部预取来提供更大的带宽。即使在快速页面模式DRAM时代,同一DRAM页面内的访问也更快,带宽更高(更少的页面预充电和激活开销)。尽管非强制性预取可以利用这种情况并且更为普遍,但是控制和通信开销会更大。现代DRAM具有最小的突发长度(突发斩波仅掉落了DRAM芯片内部预取的一部分-内部访问能量和阵列占用也没有减少)。

理想的缓存块大小取决于工作量(“自然”算法选择和传统优化假设,数据集大小和复杂性等),缓存大小和关联性(越来越大的关联缓存会鼓励使用更大的块),可用带宽,缓存中数据压缩的使用(倾向于鼓励更大的块),缓存块的扇区划分(以比地址更细的粒度跟踪有效性/一致性状态)和其他因素。

答案 2 :(得分:0)

  • 缓存整行的主要优点是增加了下一个 cache-hit 的概率。

    • 摘自 Tanenbaum 的“现代操作系统”一书:

    • <块引用>

      Cache-hit:当程序需要读取内存字时,缓存硬件会检查所需的行是否在缓存中。


  • 如果我们没有 cache-hit,则会出现 cache-miss。内存请求被发送到主内存。

  • 因此,将花费更多时间来完成该过程,因为在内存中搜索的成本很高。

  • 我们可以看出,缓存整行会增加在两个周期内完成流程的可能性。