我目前正在做一个经典的缓存模拟项目,需要一些帮助。我们的任务之一是实现一个具有下一行预取和LRU替换策略的N路组相联缓存。到目前为止,这个任务的第一和第三部分还没有太大的问题。我有一个工作的N路组相联缓存和一个工作的LRU策略。下一行预取部分给我带来了一些麻烦。
因此,从理论上讲,我想我理解了下一行预取的工作原理:我们访问缓存,访问行 X。现在,当我们访问行 X 时,我们将继续并将 X+1 带入该高速缓存,现在,由于空间局部性原理,在寻找 X+1 的相当高的可能性中,我们最终得到命中而不是未命中。另外,当我们将 X+1 带入缓存时,我们更新了LRU,因此 X+1 是该集合最近访问的块。
实际上,让我困惑的是实现它的实际方法和更精细的细节。当我们说 X 和 X+1 时,我们具体指的是该高速缓存线的哪些部分?我们应该在索引上加1吗?标签上加1吗?整个内存地址上加1吗?我还知道我们必须小心溢出。该项目指定了32字节的缓存线大小和16 kb的缓存。所以根据我们加1的位置,它可能溢出,可能会把东西弄乱,所以我们也需要注意这个,在某个地方加一个1,我想,但我不太确定,如果有任何帮助,我们将不胜感激。
TL;DR:X+1 中的 X 是什么,我们应该给整个地址加1吗?只加标记位吗?只加索引吗?等等。
1条答案
按热度按时间wz1wpwve1#
地址空间中的下一个32字节高速缓存线。在加载地址X时,下一行包含地址
X+32
,行大小为32。可能最简单的方法是将其实现为
prefetch(address + linesize)
,在线性地址空间中执行加法,并单独调用一个函数,将该地址分解为标记/索引。但是假设一个简单的索引函数,**相当于给索引加1,如果索引返回零,则进位进入标记。手动从窄加法进行进位传播并不比重做shift/and容易。