在一个常见的缓存地址中,我有三个字段:
Tag | Set | Offset
将虚拟地址解析为缓存条目的过程应该是确定哪个集合包含我们正在搜索的数据,然后使用标签(虚拟地址的一部分)来消除多路缓存的歧义(每个集合可能包含多个条目)
我的问题是:如何确定一个集合?谁向我们保证,通过仅使用虚拟地址的一部分作为标签,我们可以唯一地确定两个相似值之间的缓存命中?
地址中的位分为 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
),决定并填充集合中将存储新数据块的行。