我正在尝试确定以下模拟缓存文件的缓存规格:
“模拟的缓存文件”的意思是给我目标文件(=缓存)。我与这些目标文件的唯一交互是通过访问请求。我得到了解决方案。
功能:int access(unsigned long address)
返回:
0
(小姐)/ 1
(命中)
我已经找到了一种通过访问来确定块大小的方法。 知道块大小后,我不确定如何继续进行。
Cache size = block size * #blocks = block size * associativity * sets
associativity = blocks/set
要确定关联性,我将尝试通过两个不同的地址两次访问相同的块,并检查第一个访问标签何时被覆盖。我认为这将不起作用,因为每个地址在缓存中都有唯一的位置。
地址将采用以下格式:tag + set + word
(无符号长= 32位)
已知块大小=>也为字索引保留的位数。
从解决方案退步:
Block size = 8 bytes
Word = 1 byte
---(以下数据来自解决方案)---
Cache Size = 4096 bytes
n-way: 2
Replacement: LRU
2-way => 2 blocks/set => 2*8 bytes/set = 16 bytes/set
16 bytes/set => 4096 bytes/cache / 16 bytes/set = 256 sets/cache
这给了我有关可以进一步帮助我的地址的信息,即:
32-bit address = (tag + 8-bit setnumber + 3-bit wordindex) => 21-bit tag
是否有一种方法可以通过缓存访问来获取此地址格式,然后使用该地址格式作为获取更多信息的方法?
找到这种地址格式后,由于21位标记,我感到困惑。每组2个块仅需要1位即可定义应访问两个块中的哪个。如果标签大于1会怎样?这是通过不同地址访问相同缓存块的方法吗?还是可以通过一个模数函数(对于上面的示例来说是%2
)来使标签适合n方向的关联性?
我应该以什么方式访问缓存以获取所需的缓存信息?
至于更换政策,我不知道如何通过访问或从解决方案向后看如何看到这一点。