我正在为即将到来的考试学习旧考试,最后的问题包括标题所描述的内容。现在,我熟悉汇编语言指令,我知道代码的含义。但考试问题实际上要我做的是令人困惑。如果有人能为我解释这个问题我真的很感激。 那么,问题就在于:
我获得了一个缓存内存,它有512个字节的空间,每行长8个字节。内存是直接加载的,地址是32位长。此外,缓存内存从一开始就是空的。 在那之后,我得到了一些指示,我将解释它是否包含缓存命中或-miss。还应该假设顺序指令和指令中添加的所有数据都存在于下一个指令中。
我得到的指示是
如果有人能向我解释细节,我真的很感激: - 缓存内存总共有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
现在到了主要部分。如果每个指令都是高速缓存未命中或命中,我该如何计算?可能第一条指令应该是一个错过,因为问题说缓存从一开始就是空的。第二个也必须是一个cachemiss,但从这一点开始,我不确定如果它的缓存命中或未命中,我将如何计算。说实话,我甚至不确定会有什么打击。
我真的很感激有人可以告诉我如何计算每一步以及我如何知道它的缓存命中或错过。我们得到的用于计算这些的说明真的令人困惑。非常感谢你!
答案 0 :(得分:0)
通常你必须在一个单独的内存空间中查看它,只有512个字节,可寻址,可读写,每个数组8个字节。如果你需要字节2,地址将为0,你读取整个数组并从中选择字节3。如果需要字节8,则地址为1,并从数组中选择字节0。如此小的内存有一个巨大的优势 - 它很快。它本身可以存储一些更大的内存空间的内容,只有前512个字节。如果你存储一些东西来寻址较大的内存空间,那么它将转到那个较小的内存,地址将变为0并且偏移量为1,内部为少量内存。如果您访问超出该范围,例如1000,则必须等待更多。在这种情况下,它只是内存映射"寄存器" - 在某些情况下,它实际上会更快更好,而不是"缓存" - 遗憾的是,出于某种原因,处理器制造商通常不会让您以这种方式使用缓存(可能是营销和支持原因 - 将其他产品作为单独的市场份额出售,价格更高)。
如果为每个数组添加更多空间以存储其他值,则可以在那里存储一部分地址。如果没有硬件支持,您可以存储几乎任何东西,第二部分称为标记。现在,如果你有一些地址fffff000,你可以从地址0读取第二个空格(假设你有命令这样做) - 为了简单和速度你可以通过屏蔽除了所有位之外的所有位来从主存储空间获取地址位3..8和0-2(用于获取8字节数组中的偏移量),并从该地址检查标记部分。该标签中的一位可用于指示是否存储了某些内容,其他位可用于存储来自主存储器的地址部分。如果要保存缓存在那里的东西,可以设置指示数组不是"空"的位,并在那里分配主地址的高位,并从主存储器复制8个字节。下一次,在读取内存中该范围内的内容之前,首先读取较小内存阵列的标记部分,然后决定是从慢速主内存中读取,还是从较小但更快的部分读取(并且它将是缓存命中)。
如果在主内存中写入地址为(+ - )x512字节的内容,则必须读取已经提到的8字节数组,将其复制到主内存中,整个8字节,并将所需内容写入相同内容单元格,然后使用新值修改地址。但是你会在较小的内存区域丢失以前的数据副本(但速度更快)。如果您需要再次使用之前的值(这8个字节中的任何一个),则必须从主存储器再次复制它(缓存未命中)。
对于那些"缓存"的所有其他阵列也是如此。记忆。因此,我们有一系列缓存检查,写入,读取和复制数据到主存储器或从主存储器复制数据
这称为1路相关性,对于2种方式,将有一个512字节的阵列(相同),虽然可以存储不同的地址(从主存储器的步骤为512),但是可以同时检查这2个阵列的标签,如果某个数组具有该内存范围的副本,它可以返回它而不是从主内存中读取它。没有标签检查(额外的周期),"缓存"本质上是一小部分记忆。