【问题标题】:Why implement data cache and instruction cache to reduce miss? [duplicate]为什么要实现数据缓存和指令缓存来减少未命中? [复制]
【发布时间】:2017-04-05 07:01:18
【问题描述】:

我在这样的问题上是不败的

在内存层次结构的上下文中,为什么要实现数据缓存和 指令缓存?

我回答说减少冲突未命中和空间不足未命中的数量很有用。但是数据缓存和指令缓存可以根据数据和指令的数量来调整大小吗?因为我假设数据的数量高于指令的数量(很多时候我们需要 2 个数据来执行 1 条指令)并且数据缓存和指令缓存的大小是根据这个数字来确定的。是真的还是完全错误的?既然错了,为什么要实现数据缓存和指令缓存来减少miss呢?

【问题讨论】:

  • 从问题的措辞上无法理解问题的含义。为什么每种类型都有一个缓存?为什么要拆分它们?您应该回到要求澄清的人那里。
  • 请参阅my answer on another cache question,我在其中指出,一个具有足够读/写端口用于指令和数据的大型缓存会更加耗电,并且/或者不可能像拆分 L1 缓存一样快。数据和指令通常不会重叠,因此拆分缓存几乎是绝对的胜利。
  • @Ernest Fish Moro 请阅读 Peter Cordes 在评论中提供的出色答案。

标签: caching cpu-architecture cpu-cache


【解决方案1】:

缓存的想法是在 1 个周期内传递缓存的数据,以保持 CPU 以最大速度运行。

现在所有的 CPU 都是流水线的。这意味着他们有独立的模块,例如获取指令,对其进行解码,获取操作数,执行指令,然后写回结果。对于不同的指令,所有这些流水线阶段都会尽可能同时执行。
为了获得最大速度,指令提取必须与之前解码的较早指令的操作数提取同时进行。如果一个有指令缓存和数据缓存,则两者只能在 1 个周期内同时完成(在最佳情况下)。

【讨论】:

  • 你可以建立一个有两个读端口的缓存。事实上,现代 x86 设计为其 L1D 高速缓存(自 SnB 以来的英特尔,自 K8 以来的 AMD)这样做。 Haswell 甚至可以在每个时钟执行两个 32B 加载和一个 32B 存储,并且可能还同时向/从 L2 传输数据,所以这是很多端口。因此,从同一个缓存中并行读取指令和数据并非不可能,这只是浪费晶体管/功率,就像我在这个问题上评论的那样。尽管如此,仍被认为足够接近以纠正过于简单的解释。
  • @ Peter Cordes 我刚刚阅读了您对另一个问题的出色回答,您在上面的评论中提到了这个问题。非常感谢您的详细说明!
【解决方案2】:

拥有两个缓存(指令和数据)的另一个可能原因是抖动。想象一下这样一种情况,您的指令和数据位于两个索引位相同的内存位置。假设一个直接映射的缓存,(我知道厚颜无耻),它是这样的。

  1. 从内存中获取指令,计算索引并将其存储在那里。
  2. 解码指令,获取数据地址。
  3. 现在从内存中获取数据,计算索引来存储数据。
  4. 该位置有一些数据,太糟糕了,将其刷新到下一级缓存并存储新获取的数据。
  5. 执行指令。
  6. 是时候解码下一条指令了,当我们用缓存条目交换数据时,它的缓存未命中。现在再去取它。
  7. 当我们获取它时,我们必须再次替换我们的数据,因为它具有相同的索引。

所以我们将不断地从同一个缓存行交换数据和指令,也就是颠簸。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-19
    • 1970-01-01
    • 2013-09-04
    • 2017-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    相关资源
    最近更新 更多