全关联缓存

Fully Associative Cache

我想找出硬件问题,我需要查看以下嵌套循环发生了多少缓存未命中

for i=0; i < 32 ; i++
   for j=0; j < 32; j++
      sum += arr[i][j];

我有一个完全关联的缓存,它有 16 个缓存行,每个缓存行可以存储 32 个单词。缓存最初是空的,arr[0][0] 映射到第一个缓存行

现在根据我的理解,总共会有 32 misses.Initially 当发出请求时缓存为空,因此它被视为未命中,并且根据完全关联的缓存,所有块都会被填充然后应用 LRU。

我在这里有点困惑,可以在这里使用一些指导

假设一个整数存储在一个单词中

让我们从 1st 内存访问开始,即。 arr[0][0]。这将导致未命中,属于强制性未命中。这会将 32 个整数放入缓存。 为了我们的利益,我们将在进一步的访问中访问这些确切的内存位置。arr[0][0]arr[0][31]

现在当我们访问 arr[1][0] 时,我们正在访问第 33 个位置,这不在我们的缓存中。所以这又是一个失误。

一般来说,您访问的每 32 个值都会有一个缺失。请注意,这仅适用于您展示的那种循环:

for i=0; i < 32 ; i++
   for j=0; j < 32; j++
      sum += arr[i][j];

这里内存访问是连续的。此外,正如@Peter Cordes 在评论中所说,在您的特定情况下,完全关联缓存的行为方式与直接映射缓存完全相同。