如果这是错误的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意味着用于表示高速缓存中不同块的位数,而偏移量是块内的特定字节,您可以从中选择。
我觉得我不明白什么是命中或错过。我认为有三种类型:强制,容量和冲突。如果我不知道缓存中已有什么,我怎么知道哪个是强制性的错过?在给定标签格式的情况下,如何判断缓存的容量?
感谢任何提示或提示。
答案 0 :(得分:3)
以C1为例,它有4位用于setIdx,4位用于byteOffset。
所以这个缓存将有2 ^ 2 = 4个块(00,01,10和11),每个块将有2 ^ 4 = 16个字节。
地址参考现在可以拆分为C1格式:{00 00 0010}
假设默认情况下缓存为空,则第一次查找将导致未命中。但是,缓存现在将加载带有标记“00”的块“00”。
下一个引用{00 00 0100}将查找块“00”,它看到标签也是“00”,我们有一个命中。
答案 1 :(得分:1)
我认为你不会受到打击。即使地址00 00 0100将查找相同的块,它也会在内存中查找不同的地址。在直接映射的高速缓存中,仅通过尝试在连续指令中的相同块中访问存储器中的相同地址来导致命中。存储器中的地址由字节地址而不是块号给出。直接映射的高速缓存将替换块的内容,只要它不尝试访问块中的相同地址即可。如果00 00 0100在另一个00 00 0100之前,那么在直接映射的高速缓存中会有命中。
在关联的缓存中,存储器地址由块编号而不是字节地址给出,因此将在此处生成命中。
块编号由floor(字节地址/每块字节数)mod(块数)给出