我无法理解在以下场景中如何组织缓存。
缓存大小为256字节。缓存行大小为8个字节。所有变量都是4个字节。假设阵列A [1024]存储在存储器位置0-4095中。假设我们使用完全关联映射技术,数组如何映射到这个特定的缓存?考虑到缓存最初是空的,我们使用LRU算法进行替换。在每次更换期间,将替换整行缓存。
初步分析:
将有32个缓存块,每个缓冲区块长度为8个字节。但是要存储在这些位置的变量只有4个字节长。我无法进一步研究这些数组元素如何映射到32个缓存块。
答案 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中。这意味着他们共享第一个缓存块。其他元素类似地成对映射到高速缓存行。哪一对去哪里?