【问题标题】:Is there any benefit to use cache if there is read miss for every access?如果每次访问都有读取未命中,使用缓存有什么好处吗?
【发布时间】:2018-05-15 03:25:01
【问题描述】:

如果每次访问都出现读未命中,使用缓存有什么好处吗?

我的问题旨在更好地理解缓存。

每次访问的读取未命中也可能在冷启动期间发生,对吗?

【问题讨论】:

  • 通过在 Google 中搜索您的问题,我发现:glassdoor.com/Interview/…
  • 如果您在谈论读取缓存和 100% 未命中率,应该没有任何好处。
  • 每次 read 访问或每次读取和每次写入的读取未命中? (假设像典型的现代 CPU 一样,执行 RFO 和写入分配的回写式缓存。)
  • 在回写缓存中,如果您有缓存,您可能仍然能够更快地进行写提交,并且让管道忘记它。虽然你只是在没有内存排序障碍的情况下拥有一个存储缓冲区。

标签: caching memory-management cpu-architecture


【解决方案1】:

如果您只进行读取并且每次读取都错过了所有级别的缓存,那么根据定义,缓存没有帮助。您支付了额外的功率和延迟来检查每个级别的缓存,以及额外的功率和(可能)延迟来加载整个缓存行数据,这些数据永远不会被使用(根据定义),除了您读取的数据,因为您的所有访问都未命中.

你并没有说你在做只读。因此,如果您的读取全部未命中但某些写入命中,那么缓存当然可以提供帮助。

也许您的意思是所有访问(读取和写入)的读取部分未命中 - 其中写入的 read-portionread-for-ownership 在大多数基于缓存的系统上都存在访问权限,其中必须先将缓存行读入缓存,然后才能写入(其中的一部分)。在这种情况下,缓存可能也没有帮助并且可能会受到伤害。

每次访问的读取未命中也可能在冷启动期间发生,对吗?

不,几乎从来没有。一些读取会丢失,但那些会在同一缓存行上引入相邻数据,这通常会导致稍后命中(空间局部性)。即使在经常命中的冷启动(时间局部性)中,许多读取也会回到相同的位置。即使超出单个高速缓存行的动态特性,现代 CPU 也经常提供硬件预取功能,可以识别某些访问模式并在您需要数据之前引入数据,即使在您第一次访问高速缓存行时也会导致命中。

最后,在大多数通用硬件上,您通常不能简单地决定“不使用缓存”,因此实际上,即使您的命中率很低,您也需要支付内置的缓存成本。

也就是说,有时,当您知道您的访问模式时,您可以向 CPU 提供提示。例如,x86 CPU 提供“非临时存储”指令,在使用时基本上绕过缓存 - 这意味着存储的缓存行不会被缓存。这不一定对加速存储本身很有用(这仍然在很大程度上支付了嵌入到硬件中的缓存层次结构的代价),但为了避免开发人员知道不会很快被访问的数据污染缓存。

【讨论】:

  • 它确实说“读取未命中 every 访问”,其中包括写入。如果我们从表面上看,它意味着写入分配策略(可能是回写,而不是直写),并且 RFO 未命中。 (并且全行访问是不可能的,所以总是在写未命中时读取)。或者也许这不是它的确切含义。
  • 即使写入总是丢失,您的回写/逐出策略可能会尝试将写入分组到同一个 DRAM 页面(例如,当需要刷新时,为同一页面写回任何其他行),在提交到缓存和回写到 DRAM 之间提供乱序内存。
  • @PeterCordes - 好吧,我不会从表面上看它:这似乎完全有可能意味着“每次[读取访问]的读取未命中”而不是“每次访问的读取未命中[这里谈论正常写入时发生的 RFO,并以某种方式假设不会发生 NT 写入或全行访问之类的事情]"。无论如何,为什么全行访问是不可能的?
  • 内存控制器绝对会进行这种重组,并且通常具有强大的缓冲能力来支持它,但您可能会说这是 DRAM 子系统的一部分,而不是缓存子系统的一部分。
  • 我的意思是“OP 暗示全行访问是不可能的”,这是可以读入我对“访问”(包括写入)的字面解释的事情之一。
猜你喜欢
  • 2018-03-26
  • 2011-04-24
  • 2016-01-04
  • 2014-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多