2016-11-21 38 views
-1

我在这样为什么要实现数据高速缓存和指令高速缓存来减少遗漏?

在存储层次为什么实现数据缓存和 指令缓存的背景下,问题不败?

我回答说,减少冲突未命中次数和空间不足未用空间是有用的。但是数据缓存和指令缓存的大小可以根据数据和指令的数量来确定?因为我认为数据的数量高于指令的数量(很多时候我们需要2个数据才能执行1条指令),并且数据高速缓存和指令高速缓存根据这个数字来确定大小。是真的还是完全错误的?在这种情况下,为什么要实现数据高速缓存和指令高速缓存来减少遗漏?

+0

无法从措辞的方式理解问题的含义。为什么要有每种类型的缓存?他们为什么要分裂?你应该回到要求澄清的人。 – Leeor

+0

可能的重复[在大多数处理器中为什么L1缓存的大小小于L2缓存的大小?](http://stackoverflow.com/questions/4666728/why-is-the-size-of-l1 -cache-the-the-the-2-cache-in-the-the-the-pro) –

+1

请参阅[我对另一个缓存问题的回答](http://stackoverflow.com/questions/4666728/为什么是大小的l1缓存小于-12-高速缓存大部分的pro/38549736#38549736)在哪里我指出,一大缓存如果有足够的读/写端口用于指令和数据,则会消耗更多的电力,和/或不可能像拆分L1缓存一样快。数据和说明通常不会重叠,因此拆分缓存几乎是纯粹的获胜。 –

回答

1

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

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

+0

您可以使用两个读取端口构建高速缓存。事实上,现代x86设计为他们的L1D缓存(Intel自从SnB,自K8以来的AMD)这样做。 Haswell甚至可以在每个时钟内执行两次32B加载和一次32B存储,并且可能同时将数据传输到L2,或者同时向L2传输数据,所以这是很多端口。因此,从同一个缓存中并行读取指令和数据并不是不可能的,这只是浪费了晶体管/功耗,就像我对这个问题进行了评论。尽管如此,还是足够接近以纠正过于简单的解释。 –

+1

@ Peter Cordes我刚刚阅读了您在上述评论中提到的其他问题的出色答案。非常感谢这个详细的说明! –

0

有两个缓存(指令和数据)的另一个可能的原因是Thrashing。想象一下你的指令和数据驻留在索引位相同的两个存储单元中的情况。假设有一个直接映射的缓存,(我知道,脸颊),它是这样的。

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

因此,我们将不断地将数据和指令交换到相同的缓存行,即抖动。