【问题标题】:Calculating Cache memory Hit and Miss, and calculating Rows in cache计算缓存内存命中和未命中,并计算缓存中的行数
【发布时间】:2014-05-08 14:50:02
【问题描述】:

我正在为即将到来的考试学习旧考试,最后的问题包括标题所描述的内容。现在,我熟悉汇编语言指令,并且知道代码的含义。但是考试题实际上要我做的是令人困惑的。如果有人能为我解释这个问题,我将不胜感激。 那么问题来了:

我有一个缓存内存,它有 512 个字节的空间,每行有 8 个字节长。内存是直接映射的,地址是 32 位长。此外,缓存内存从一开始就是空的。 在那之后,我得到了一些说明,我将解释它是缓存命中还是未命中。还应该假设指令是顺序的,并且在一条指令中添加的所有数据都存在于下一条。

我得到的指令是

  1. movia r8, 0xBEDA12C4
  2. ldw r10, 0( r8 )
  3. ldw r11, 8( r8 )
  4. stw r10, 16(r8)
  5. ldw r10, 24(r8)
  6. ldw r18, 32(r8)

现在,如果有人可以向我解释详细信息,我将不胜感激: - 缓存内存总共有 512 个字节的空间。这是什么?它是它能够存储的总内存吗?另外,我从某处听说这就是您在缓存中计算行的方式。例如 512 字节的内存,每行 16 字节。 512/16 = 缓存中的 32 行。对于此示例,512/8 = 64 行。这是什么意思!?

  • 它还指出每一行都是 16 字节长。我已经看到了带有 TAG、ROW、BYTE 的示例,他们试图在其中说明缓存。但是我怎么理解这里每行 16 个字节呢?至少它似乎没有占用 TAG、ROW、BYTE 的长度。这是干什么用的?

  • 直接映射缓存。这一点我有点理解。它只是一排空的订单槽,是吗?我在这里找到了一些关于此的信息。 http://www.cs.umd.edu/class/sum2003/cmsc311/Notes/Memory/direct.html

  • 现在到主要部分。如果每条指令是缓存未命中或命中,我该如何计算?可能第一条指令应该是未命中,因为问题说高速缓存从一开始就是空的。第二个也必须是缓存未命中,但从这一点开始,我不确定我将如何实际计算它是缓存命中还是未命中。老实说,我什至不确定会是什么打击。

如果有人能告诉我如何计算每个步骤以及我如何知道它的缓存命中或未命中,我将非常感激。我们得到的计算指令真的很混乱。非常感谢!

【问题讨论】:

    标签: caching assembly byte


    【解决方案1】:

    通常您必须将其视为一个单独的内存空间,只有 512 个字节,可寻址、可读和可写为每个 8 个字节的数组。如果您需要字节 2,地址将为 0,您读取整个数组并从中选择字节 3。如果需要字节 8,则地址为 1,然后从数组中选择字节 0。这么小的内存有一个巨大的优势——速度很快。它单独可以存储一些更大的内存空间的内容,只有前512个字节。如果您将某些内容存储到较大内存空间的地址 1,它将转到较小的内存,地址将变为 0 和偏移量 1,内部用于少量内存。如果您访问超出此范围,例如 1000,您将不得不等待更多时间。在这种情况下,它只是内存映射的“寄存器”——在某些情况下,它实际上比“缓存”更快更好——不幸的是,由于某种原因,处理器制造商通常不会让你以这种方式使用缓存(可能是营销和支持原因 - 以更高的价格出售其他产品作为单独的市场份额)。
    如果为每个数组添加更多空间来存储其他值,则可以在其中存储一部分地址。如果没有硬件支持,您几乎可以在那里存储任何东西,第二部分称为标签。现在,如果您有一些地址 fffff000,您可以从地址 0 读取第二个空间(假设您有执行此操作的命令) - 为简单起见,您可以通过屏蔽所有位从主内存空间获取地址,除了位 3..8 和 0-2(用于获取 8 字节数组中的偏移量),并从该地址检查标签部分。该标签中的一位可用于指示那里是否存储了某些内容,其他位可用于存储来自主存储器的地址部分。如果你想保存一些缓存在那里的东西,你设置指示数组不是“空”的位,并在那里分配主地址的高位,然后从主存储器复制 8 个字节。下一次,在读取内存中该范围内的内容之前,您首先读取较小内存数组的标签部分,然后决定是从慢速主内存中读取,还是从较小但较快的部分读取(这将是缓存命中)。
    如果您在主存储器中写入地址为 (+-)x512 字节的内容,则必须读取已经提到的 8 字节数组,将其复制到主存储器中,整个 8 字节,然后将您想要的内容写入相同的单元格,然后用新值修改地址。但是您会在较小的内存区域中丢失以前的数据副本(但速度更快)。如果您再次需要以前的值(这 8 个字节中的任何一个),则必须从主内存中再次复制它(缓存未命中)。 该“高速缓存”内存的所有其他数组也是如此。所以我们有一系列的缓存检查、写入、读取和复制数据到主存或从主存复制。
    这被称为 1 路关联性,对于 2 种方式,将有一个 512 字节的数组(相同),虽然可以存储不同的地址(从主存储器中使用 512 的步骤),可以同时检查这 2 个数组的标签,并且如果某个数组具有该内存范围的副本,则它可以返回它而不是从主内存中读取它。没有标签检查(额外的周期),“缓存”本质上是少量的内存。

    【讨论】:

      猜你喜欢
      • 2014-09-29
      • 1970-01-01
      • 2019-10-05
      • 2019-07-04
      • 1970-01-01
      • 2019-07-28
      • 1970-01-01
      • 2014-10-18
      • 1970-01-01
      相关资源
      最近更新 更多