直接映射缓存如何工作?

时间:2013-04-10 21:44:12

标签: caching system cpu-architecture

我正在参加系统架构课程,但我无法理解直接映射缓存的工作原理。

我在几个地方看过,他们以不同的方式解释它让我更加困惑。

我无法理解的是标签和索引是什么,以及它们是如何选择的?

我演讲的解释是: “地址分为两部分 索引(例如15位)用于直接寻址(32k)RAM 其余地址,标签被存储并与传入标签进行比较。 “

该标签来自哪里?它不能是RAM中内存位置的完整地址,因为它使直接映射缓存无用(与完全关联缓存相比)。

非常感谢。

4 个答案:

答案 0 :(得分:86)

好。因此,让我们首先了解CPU如何与缓存进行交互。

有三层内存(一般来说) - cache(通常由SRAM筹码组成),main memory(通常由DRAM筹码组成),以及{ {1}}(通常是磁性的,就像硬盘一样)。每当CPU需要来自某个特定位置的任何数据时,它首先搜索缓存以查看它是否存在。高速缓冲存储器在存储器层次结构方面最接近CPU,因此其访问时间最短(成本最高),因此如果可以在那里找到数据CPU,它就构成了“命中”和数据从那里获得供CPU使用。如果它不存在,那么在CPU可以访问数据之前必须将数据从主存储器移动到高速缓存(CPU通常仅与高速缓存交互),这会导致时间损失。

因此,为了确定缓存中是否存在数据,应用了各种算法。一种是这种直接映射的缓存方法。为简单起见,我们假设一个存储器系统,其中有10个可用的高速缓存存储器位置(编号为0到9),以及40个可用的主存储器位置(编号为0到39)。这张图总结了:

enter image description here

有40个主存储位置可用,但缓存中只能容纳10个。所以现在,通过某种方式,来自CPU的传入请求需要重定向到缓存位置。这有两个问题:

  1. 如何重定向?具体来说,如何以可预测的方式进行,不会随着时间的推移而改变?

  2. 如果缓存位置已经填满了一些数据,来自CPU的传入请求必须确定它需要数据的地址是否与其数据存储在该位置的地址相同。

  3. 在我们的简单示例中,我们可以通过简单的逻辑重定向。鉴于我们必须将从0到39连续编号的40个主存储器位置映射到编号为0到9的10个高速缓存位置,因此存储器位置storage的高速缓存位置可以是n。因此21对应于1,37对应于7等。这变为索引

    但是37,17,7都对应于7.所以为了区分它们,来自标签。就像索引是n%10一样,标记是n%10。所以现在37,17,7将具有相同的索引7,但不同的标签如3,1,0等等。也就是说,映射可以完全由两个数据 - 标签和索引指定。

    现在,如果请求来自地址位置29,那将转换为标记2和索引9.索引对应于缓存位置编号,因此缓存位置为。将查询9以查看它是否包含任何数据,如果是,则相关标签是否为2.如果是,则为CPU命中,并且将立即从该位置获取数据。如果它是空的,或者标记不是2,则表示它包含与某个其他内存地址相对应的数据而不是29(尽管它将具有相同的索引,这意味着它包含来自地址的数据,如9,19, 39等)。所以这是一个CPU未命中,而来自位置的数据没有。主存储器中的29将必须加载到位置29的缓存中(并且标记更改为2,并删除之前存在的任何数据),之后它将被CPU提取。

答案 1 :(得分:12)

让我们举个例子。一个64千字节的缓存,16字节缓存行有4096个不同的缓存行。

您需要将地址分成三个不同的部分。

  1. 最低位用于在您获取它时告诉您缓存行中的字节,此部分不会直接用于缓存查找。 (本例中为0-3位)
  2. 下一位用于INDEX缓存。如果您将缓存视为一大堆缓存行,则索引位会告诉您需要查找哪一行数据。 (本例中的位4-15)
  3. 所有其他位都是TAG位。这些位存储在标记存储中,用于存储在缓存中的数据,我们将缓存请求的相应位与我们存储的内容进行比较,以确定我们正在缓存的数据是否是所请求的数据。
  4. 您用于索引的位数是log_base_2(number_of_cache_lines)[它实际上是集合的数量,但在直接映射的缓存中,有相同数量的行和集合]

答案 2 :(得分:2)

直接映射缓存就像一个表,其行也称为缓存行,至少有两列用于数据,另一列用于标记。

以下是它的工作原理:对缓存的读访问权限占用地址的中间部分,称为索引,并将其用作行号。同时查找数据和标签。 接下来,需要将标记与地址的上半部分进行比较,以确定该行是否来自内存中的相同地址范围并且是否有效。同时,地址的下半部分可用于从缓存行中选择所请求的数据(我假设缓存行可以保存多个单词的数据)。

我强调了一点关于数据访问和标记访问+比较同时发生,因为这是减少延迟(缓存的目的)的关键。数据路径ram访问不需要两个步骤。

优点是读取基本上是一个简单的表查找和比较。

但它是直接映射的,这意味着对于每个读取地址,缓存中只有一个位置可以缓存此数据。因此缺点是许多其他地址将映射到同一个地方,并可能竞争这个缓存行。

答案 3 :(得分:0)

我在图书馆找到了一本好书,它为我提供了我需要的明确解释,现在我将在这里分享,以防其他学生在搜索缓存时偶然发现这个帖子。

这本书是“计算机体系结构 - 量化方法”第3版,由Hennesy和Patterson撰写,第390页。

首先,请记住主内存分为缓存块。 如果我们有64字节高速缓存和1 GB RAM,则RAM将分为128 KB块(1 GB RAM / 64B高速缓存= 128 KB块大小)。

从书中可以看出:

哪个块可以放在缓存中?

  • 如果每个块只有一个位置,它可以出现在缓存中,则缓存称为直接映射。使用以下公式计算目标块:<RAM Block Address> MOD <Number of Blocks in the Cache>

所以,我们假设我们有32块RAM和8块缓存。

如果我们想将块12从RAM存储到高速缓存,则RAM块12将存储到高速缓存块4中。为什么?因为12/8 = 1余数4.余数是目标块。

  • 如果某个块可以放在缓存中的任何位置,则称该缓存为完全关联

  • 如果某个块可以放置在缓存中受限制的一组位置中的任何位置,则缓存为 set associative

基本上,集合是缓存中的一组块。首先将一个块映射到一个集合,然后将该块放在集合内的任何位置。

公式为:<RAM Block Address> MOD <Number of Sets in the Cache>

因此,假设我们有32块RAM和一个缓存分为4组(每组有两个块,总共8个块)。这样设置0将具有块0和1,设置1将具有块2和3,依此类推......

如果我们想将RAM块12存储到缓存中,RAM块将存储在缓存块0或1中。为什么?因为12/4 = 3余数为0.因此选择集合0,并且可以将块放在集合0内的任何位置(意味着块0和1)。

现在我将回到我原来的地址问题。

如果某个块位于缓存中,它是如何找到的?

缓存中的每个块帧都​​有一个地址。为了说清楚,一个块有地址和数据。

块地址分为多个部分:Tag,Index和Offset。

标签用于查找缓存中的块,索引仅显示块所在的集合(使其非常冗余),并使用偏移量来选择数据。

通过“选择数据”我的意思是在高速缓存块中显然会有多个存储器位置,偏移量用于在它们之间进行选择。

所以,如果你想要一个表,那么这些就是列:

TAG | INDEX | OFFSET | DATA 1 | DATA 2 | ... | DATA N

标签将用于查找块,索引将显示块在哪个集合中,offset将选择其右侧的一个字段。

我希望我对此的理解是正确的,如果不是,请告诉我。