caching - 缓存集和标签

标签 caching memory x86-64 mmu

在公共(public)缓存地址中,我有三个字段:

Tag | Set | Offset

将虚拟地址解析为缓存条目的过程应该是确定哪个集合包含我们正在搜索的数据,然后使用标签(虚拟地址的一部分)来消除多路缓存的歧义(每个集合可以包含多个条目)

我的问题是:集合是如何确定的?谁向我们保证,通过仅使用虚拟地址的一部分作为标记,我们可以唯一地确定两个相似值之间的缓存命中?

最佳答案

地址中的位分为 3 组:

  tag  | set index | Block offset
t bits |   s bits  |    b bits

如果缓存中 block 的大小为 B 字节,则需要 b = (log2 B) 位 来指定 block 偏移量。

如果缓存有 S 个集合,则 s = (log2 S) 位用于集合索引。如果缓存是完全关联的,则只有一组,即 S = 1s = 0,这意味着不会将任何位用于集合索引。

剩余的位用于标签t可以使用t = NUM​​_BITS - s - b来计算

这将保证任何地址都可以映射到相应的缓存行,并且只需查看缓存行的有效位,即可确认我们是否在缓存中拥有该地址。请注意,缓存行大小通常大于字大小,以利用程序中空间数据局部性的增益。

当在缓存中找不到所请求的地址时,我们需要计算将被带入缓存的数据 block 的起始地址。

范围的大小始终等于缓存 block 的大小。起始地址是通过将地址的 block 偏移位清零来计算的。结束地址是通过使用所有1作为地址的 block 偏移位来计算的。

根据缓存关联性和逐出方案(LRULFU),决定存储新数据 block 的集合中的行,并且已填充。

关于caching - 缓存集和标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15327615/

相关文章:

optimization - 循环遍历二维数组的最快方法?

python - 将 WeakValueDictionary 用于缓存时的 GC 问题

c#引用变量内存分配

linux - 用户空间中 x86-64 Linux 上 CS 和 SS 寄存器的含义?

caching - Node.js HTTP 代理缓存 : any guidelines and best practices?

caching - GPU 中的 L1 缓存

python模块内存使用

performance - 内存基准图 : understanding cache behaviour

c++ - 依赖机器架构意味着什么?

x86 - 是否可以在支持Intel IA-32e模式的操作系统中运行16位代码?