在公共缓存地址中,我有三个字段:
Tag | Set | Offset
将虚拟地址解析为缓存条目的过程应该是确定哪个集合包含我们正在搜索的数据,然后使用标记(虚拟地址的一部分)消除多路缓存的歧义(每个集合可能包含多个条目)
我的问题是:如何确定一组?谁向我们保证,通过仅使用部分虚拟地址作为标记,我们可以唯一地确定两个相似值之间的缓存命中?
答案 0 :(得分:4)
地址中的位分为3组:
tag | set index | Block offset
t bits | s bits | b bits
如果缓存中块的大小为B
字节,则需要b = (log2 B) bits
来指定块偏移量。
如果缓存具有S集,则s = (log2 S)
位用于设置索引。如果缓存完全关联,则只有一个集合,即S = 1
和s = 0
,这意味着没有比特用于设置索引。
可以使用t
t = NUM_BITS - s - b
的其余位
这可以保证任何地址都可以映射到相应的缓存行,只需查看缓存行的valid bit
,就可以确认我们是否在缓存中有地址。请注意,缓存行大小通常会大于字大小,以利用程序中空间数据位置的增益。
当在缓存中找不到请求的地址时,我们需要计算将被带入缓存的数据块的起始地址。
范围的大小始终等于缓存块大小。通过将地址的块偏移位清零来计算起始地址。通过将所有1s
用于地址的块偏移位来计算结束地址。
根据缓存关联性和驱逐方案(LRU
vs LFU
),决定并填充将存储此新数据块的集合中的行。