直接映射缓存命中/未命中

5
抱歉,如果这不是正确的stackexchange,请见谅;但它似乎是最接近的可以帮助计算机架构问题的地方。在计算机系统的一道作业问题中,我被问到:
Consider three direct mapped caches X, Y, and Z each interpreting an
8-bit address slightly differently according to the {tag:setIdx:byteOffset}
format specified. For each address in the reference stream, indicate whether the
access will hit (H) or miss (M) in each cache.

                  C1       C2     C3
Address Formats: {2:2:4} {2:3:3} {2:4:2}

Address References in Binary: 00000010, 00000100...

我需要确定每个地址引用是否会命中或未命中,但我不知道从哪里开始。对于格式,我认为标签是指缓存块中数据的标签,setIdx是表示缓存中不同块的位数,偏移是您可以从中选择的块内特定字节。我觉得我不理解什么是命中或未命中。我以为有三种类型: 强制性、容量和冲突。如果我不知道缓存中已经有什么,我怎么知道哪一个是强制性未命中?根据标记格式,我如何确定缓存的容量?谢谢任何提示或建议。
2个回答

3
以C1为例,它有2位用于setIdx,4位用于byteOffset。
因此,该缓存将具有2^2 = 4个块(00、01、10和11),每个块将有2^4 = 16个字节。
现在可以将地址引用拆分为C1格式:{00 00 0010}。
假设缓存默认为空,第一次查找将导致未命中。但是,缓存现在将加载带有标记“00”的块“00”。
下一个引用{00 00 0100}将查找块“00”,它看到标记也是“00”,我们有一个命中。

那么字节偏移量是什么意思呢? - KWJ2104
字节偏移量是一个块的大小。例如,使用上面的相同参考,假设C1在块{00}中加载了{00 00 0010},则该块包含内存{00 00 0000}到{00 00 1111}。但是,如果您尝试查找{01 00 0010},它将会失效,因为标记不同。(我还假设这是一种单向组相联映射) - DON'TPANIC

1
我认为你不会有一个命中。即使地址00 00 0100查找相同的块,它仍将查找内存中的不同地址。在直接映射缓存中,只有在连续指令中尝试访问内存中的相同地址块时才会导致命中。内存中的地址由字节地址而不是块编号给出。只要不尝试访问块中的相同地址,直接映射缓存就会替换块的内容。如果00 00 0100先于另一个00 00 0100,则在直接映射缓存中会出现命中。
在关联缓存中,内存地址由块编号而不是字节地址给出,因此会在此处生成命中。
块号由floor(Byte address/Bytes per block) mod (number of blocks)给出。

通常情况下,缓存在未命中时会加载整个块而不仅仅是请求的字节。(一些缓存使用扇区,为每个块提供多个有效位,但没有主流处理器为每个字节甚至每个4字节块提供有效位。此外,使用当前DRAM,最小突发长度为4 - 使用突发切割可能会降低性能 - 因此,64位宽接口提供了至少32字节的传输。) - user2467198
@PaulA.Clayton,您能否也看一下这个缓存问题?http://stackoverflow.com/questions/30555623/how-many-bits-are-in-the-address-field-for-a-directly-mapped-cache - committedandroider

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接