缓存设置和标签
问题描述:
在一个共同的高速缓存地址我有三个领域:缓存设置和标签
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 = NUM_BITS - s - b
标签可以计算t
这将保证任何地址可以被映射到相应的缓存行,只是在看高速缓存行的valid bit
,将确认是否我们有没有在缓存中的地址。请注意,高速缓存行大小通常会大于字大小,以利用程序中空间数据局部性的增益。
当在缓存中没有找到请求的地址时,我们需要计算将被带入缓存的数据块的起始地址。
范围的大小始终等于缓存块的大小。起始地址是通过清零地址的块偏移位来计算的。结束地址是通过对地址的块偏移位使用全部1s
来计算的。
根据高速缓存关联性和驱逐方案(LRU
vs LFU
),决定并填充将存储该新数据块的集合内的行。