缓存内存块组织

时间:2013-12-30 07:22:56

标签: caching

我无法理解在以下场景中如何组织缓存。

缓存大小为256字节。缓存行大小为8个字节。所有变量都是4个字节。假设阵列A [1024]存储在存储器位置0-4095中。假设我们使用完全关联映射技术,数组如何映射到这个特定的缓存?考虑到缓存最初是空的,我们使用LRU算法进行替换。在每次更换期间,将替换整行缓存。

初步分析:

将有32个缓存块,每个缓冲区块长度为8个字节。但是要存储在这些位置的变量只有4个字节长。我无法进一步研究这些数组元素如何映射到32个缓存块。

2 个答案:

答案 0 :(得分:1)

我们假设它是按顺序访问的:

for (int i=0; i<1024; ++i) 
    read(A[i]);

在这种情况下,你将把前64个元素(A[0]A[63])填充到相邻对中的32个缓存块中,就像MSalters所说的那样。

下一次访问必须踢掉最近最少使用的行,因为按顺序访问数组是A [64]。它必须选择一个受害者才能踢出,因为你使用的LRU将是第一个阻止(方式0)。因此,您将A[0]A[1]替换为A[64]A[65],依此类推,因此通常您会将元素i映射到{{1} }。

现在计算命中率需要一个额外的假设 - 每个获取的内存行是一个完整块的大小(8个字节),因为你不能填充半个块(实际上有使用掩码位的方法,但让我们假设简单的情况)。因此,我们“免费”获取每个第二个元素 - 获取floor(i/2)%32也会获取A[0],依此类推。从理论上讲,这意味着命中率可能是50%(偶数元素,命中赔率,实际上大多数CPU会并行执行访问,所以你不会真正拥有那个命中率,但是让我们说这里的访问是序列化的)

请注意,在前64个元素之后获取的每个新块都必须从缓存中逐出块,如果处理元素也修改它们,则还必须将它们写回来。

答案 1 :(得分:0)

元素A[0]A[1]存储在相邻的内存位置0-4和4-8中。这意味着他们共享第一个缓存块。其他元素类似地成对映射到高速缓存行。哪一对去哪里?