具有 16 个单字块的直接映射高速缓存与具有 8 个二字块的直接映射高速缓存有何不同

Joh*_*ohn 4 caching

我希望确定具有 16 个单字块的高速缓存和使用 8 个 2 字块的高速缓存的二进制地址、标记、索引和命中或未命中,所有高速缓存在开始时都假定为空

假设我有参考指令 4、4、32、31、5、32

对于第一个缓存(16 个单字块),您必须首先将 4 转换为二进制,然后将该二进制值拆分以获取标记,然后如果您再次找到该索引,它将被标记为命中

话虽这么说,我相信使用这种方法下表是正确的。

Ref | Binary |  Tag  | Index | Hit or Miss
 4   00000100   0000   0100      miss
 4   00000100   0000   0100      hit
32   00100000   0010   0000      miss
31   00011111   0001   1111      miss
 5   00000101   0000   0101      miss
32   00100000   0010   0000      hit
Run Code Online (Sandbox Code Playgroud)

我希望对第二个缓存(8 个双字块)执行相同的操作,但我不确定如何继续。

我认为二进制文件的数字是相同的,但是我对如何从中确定标签和索引以及与第一个缓存相同的引用指令是否命中或未命中感到困惑。

如何确定标签、索引以及它在该缓存中是否命中或未命中?

Jef*_*tin 5

它的不同之处在于,您需要使用一半的高速缓存行,在高速缓存行内提供 4 位标记、3 位索引和 1 位位移(指示对两字块中的哪个字进行寻址)。对于给出的示例,更广泛的获取将获得额外的一次命中,因为访问 4 也会获取 5。

Ref | Binary |  Tag  | Index | Disp |  Hit or Miss
 4   00000100   0000   010     0       miss
 4   00000100   0000   010     0       hit
32   00100000   0010   000     0       miss
31   00011111   0001   111     1       miss
 5   00000101   0000   010     1      *hit
32   00100000   0010   000     0       hit
Run Code Online (Sandbox Code Playgroud)